如何过滤键盘事件?

时间:2012-05-08 16:57:38

标签: keyboard vhdl ps2

我正在为斯巴达3E入门套件编写一个pong游戏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;

但是如果我使用这个代码,即使在键盘上弹出Q键之后,向上键总是保持为“1”HIGH。我想要信号保持为高,直到我按住Q按钮,如果我释放它然后向上信号必须返回到'0'。 基本上我希望我的键盘按键功能像普通按钮一样。 如果我按住然后它必须给出高信号,否则如果被释放它必须给出低信号。

3 个答案:

答案 0 :(得分: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;

你有没有模拟 - 它应该在模拟中以你的方式工作。

答案 1 :(得分:0)

我相信PS2键盘协议发送一个命令字,然后按下按钮时的键盘代码,然后释放时两个命令字和一个键盘代码。你在其他地方处理这件事吗?我们需要从键盘控制器了解有关“数据输出”的更多信息。它是否锁定了键盘上的数据信号?如果在释放密钥时重置了数据,则代码应按照需要运行。

我正在谈论的是第8页 http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf

答案 2 :(得分:0)

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

简而言之:

  1. 如果没有任何反应,ps2_dataps2_clk始终为'1'
  2. 在事件中,键盘逐个发送起始位(0),数据位,然后发送停止位(1)。这些位的时钟为ps2_clk
  3. 按住某个键时,扫描码会以一定的间隔重复发送。
  4. 当按下某个键时,会发送'F0'代码,然后发送扫描代码(对于包含箭头键的所谓“扩展”键,它会更复杂一些。)
  5. 请参阅Xilinx Spartan-3E FPGA Starter Kit Board User Guide“PS / 2鼠标/键盘端口”部分和/或generic PS/2 electric protocol description(后者基本上会更详细地重复前者)。