2012-05-08 52 views
0

我正在爲斯巴達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; 

但如果我使用此代碼對向上鍵將保持「1」 HIGH始終,甚至relesing鍵盤上的Q鍵後。我希望上升信號保持在高位,直到我鬆開Q按鈕時才鬆開,然後上升信號必須返回到'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; 

你有模擬 - 它應該工作的罰款仿真你有它的方式。

0

我相信PS2鍵盤協議發送一個命令字,然後鍵盤代碼當按下按鈕,然後兩個命令字和一個鍵盤代碼釋放時。你在別處處理這件事嗎?我們需要更多地瞭解您的鍵盤控制器的「數據輸出」。它是否鎖定來自鍵盤的數據信號?如果您在釋放密鑰時重置了數據,那麼您的代碼應該按照需要工作。

第8頁是什麼我談論 http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf

0

的PS/2鍵盤協議比這更復雜。你需要實現一個有狀態的解碼器。

簡單:

  1. 當什麼也沒發生,無論是ps2_dataps2_clk總是'1'
  2. 在一個事件中,鍵盤發送一個開始位(0),數據位一個接一個,然後停止位(1)。這些位的時鐘是ps2_clk
  3. 按住按鍵時,掃描碼會以一定的時間間隔重複發送。
  4. 當一個鍵被按下時,'F0'代碼,然後是掃描代碼,發送(包括箭頭鍵的所謂「擴展」鍵更復雜一點)。

參見Xilinx Spartan-3E FPGA Starter Kit Board User Guide「PS/2鼠標/鍵盤端口」部分,和/或generic PS/2 electric protocol description(後者基本上重複詳細前者)。