我正在为 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”。 基本上我希望我的键盘按键像普通按钮一样工作。 如果我按住,那么它必须给出高信号,否则如果释放它必须给出低信号。
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;
您是否进行了模拟 - 它应该按照您的方式在模拟中正常工作。
我相信 PS2 键盘协议发送一个命令字,然后按下按钮时发送键盘代码,然后释放两个命令字和键盘代码。您在其他地方处理这个问题吗?我们需要更多地了解您的键盘控制器的“数据输出”。它是否锁存来自键盘的数据信号?如果您在释放按键时重置了数据,那么您的代码应该可以按需要工作。
第8页就是我所说的 http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf
PS/2键盘协议比这更复杂。您需要实现一个有状态解码器。
简而言之:
ps2_data
和ps2_clk
总是'1'
。(0)
、一个接一个的数据位,然后发送一个停止位 (1)
。这些位的时钟为 ps2_clk
。'F0'
代码,然后发送扫描代码(对于包括箭头键在内的所谓“扩展”键来说,这有点复杂)。请参阅Xilinx Spartan-3E FPGA 入门套件板用户指南、“PS/2 鼠标/键盘端口”部分和/或通用 PS/2 电子协议描述(后者本质上更详细地重复了前者) ).