如何过滤键盘事件?

问题描述 投票:0回答:3

我正在为 spartan 3E 入门套件编写乒乓球游戏 vhdl 代码。我想用 PS2 键盘控制游戏手柄。为此,我需要从键盘接收到的扫描码生成向上和向下信号。

这是示例代码

   -- Instantiate key_board controller
    my_keyobard : entity work.ps2_key(Behavioral)
                    port map( ps2_clk => ps2_clk, ps2_data => ps2_data, clk => clk,
                    data_out => data);

   process(data)
   begin
          case data is
                 when X"15" => up <= '1'; -- Q key for UP
                 when X"1C' => down <= '1'; -- A key for DOWN
                 when others => up <= '0'; down <= '0';
          end case;
   end process;

但是如果我使用此代码,向上键将始终保持“1”高电平,即使在释放键盘上的 Q 键后也是如此。我希望向上信号保持在高电平,直到我按住 Q 按钮,如果松开它,则向上信号必须返回“0”。 基本上我希望我的键盘按键像普通按钮一样工作。 如果我按住,那么它必须给出高信号,否则如果释放它必须给出低信号。

keyboard vhdl
3个回答
0
投票

others
子句会被综合忽略(通常,除非你告诉他们不要这样做)

process(data)
   begin
          up <= '0'; down <= '0';
          case data is
                 when X"15" => up <= '1'; -- Q key for UP
                 when X"1C" => down <= '1'; -- A key for DOWN
          end case;
   end process;

您是否进行了模拟 - 它应该按照您的方式在模拟中正常工作。


0
投票

我相信 PS2 键盘协议发送一个命令字,然后按下按钮时发送键盘代码,然后释放两个命令字和键盘代码。您在其他地方处理这个问题吗?我们需要更多地了解您的键盘控制器的“数据输出”。它是否锁存来自键盘的数据信号?如果您在释放按键时重置了数据,那么您的代码应该可以按需要工作。

第8页就是我所说的 http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf


0
投票

PS/2键盘协议比这更复杂。您需要实现一个有状态解码器。

简而言之:

  1. 当什么都没发生时,
    ps2_data
    ps2_clk
    总是
    '1'
  2. 发生事件时,键盘会发送一个起始位
    (0)
    、一个接一个的数据位,然后发送一个停止位
    (1)
    。这些位的时钟为
    ps2_clk
  3. 按住某个键时,会以一定的间隔重复发送扫描码。
  4. 按下某个键时,会发送
    'F0'
    代码,然后发送扫描代码(对于包括箭头键在内的所谓“扩展”键来说,这有点复杂)。

请参阅Xilinx Spartan-3E FPGA 入门套件板用户指南“PS/2 鼠标/键盘端口”部分和/或通用 PS/2 电子协议描述(后者本质上更详细地重复了前者) ).

© www.soinside.com 2019 - 2024. All rights reserved.