0

我正在为 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;

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

4

3 回答 3

0

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

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

于 2012-05-09T15:15:59.883 回答
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;

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

于 2012-05-09T14:55:33.787 回答
0

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

简单来说:

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

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

于 2012-08-04T19:07:33.357 回答