我正在为斯巴达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'。 基本上我希望我的键盘按键功能像普通按钮一样。 如果我按住然后它必须给出高信号,否则如果被释放它必须给出低信号。
答案 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)
答案 2 :(得分:0)
PS / 2键盘协议比这更复杂。您需要实现有状态解码器。
简而言之:
ps2_data
和ps2_clk
始终为'1'
。(0)
,数据位,然后发送停止位(1)
。这些位的时钟为ps2_clk
。'F0'
代码,然后发送扫描代码(对于包含箭头键的所谓“扩展”键,它会更复杂一些。)请参阅Xilinx Spartan-3E FPGA Starter Kit Board User Guide,“PS / 2鼠标/键盘端口”部分和/或generic PS/2 electric protocol description(后者基本上会更详细地重复前者)。