0

Spartan 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 キーを離した後でも、up キーは常に '1' HIGH のままになります。Qボタンを押したままにして離すまでアップ信号をハイのままにしておき、その後アップ信号を「0」に戻す必要があります。基本的に、キーボードのキーを通常のボタンのように機能させたいと思っています。押したままにすると、HIGH 信号を出す必要があり、離すと、LOW 信号を出す必要があります。

4

3 に答える 3

0

PS2 キーボード プロトコルはコマンド ワードを送信し、次にボタンが押されるとキーボード コードが送信され、ボタンが離されると 2 つのコマンド ワードとキーボード コードが送信されると思います。他の場所でこれを扱っていますか?キーボード コントローラーからの「データ出力」について詳しく知る必要があります。キーボードからのデータ信号をラッチしますか? キーが離されたときにデータがリセットされている場合、コードは期待どおりに機能するはずです。

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 つずつ送信し、次にストップ ビットを送信します(1)。ビットは でクロックされps2_clkます。
  3. キーを長押しすると、スキャンコードが一定間隔で繰り返し送信されます。
  4. キーが押されると、'F0'コード、次にスキャン コードが送信されます (矢印キーを含む、いわゆる「拡張」キーの場合はもう少し複雑です)。

ザイリンクス Spartan-3E FPGA スターター キット ボード ユーザー ガイド「PS/2 マウス/キーボード ポート」セクション、および一般的な PS/2 電気プロトコルの説明を参照してください (後者は本質的に前者をより詳細に繰り返します)。

于 2012-08-04T19:07:33.357 に答える