Как фильтровать события клавиатуры?

Я пишу VHDL-код для игры в понг для стартового комплекта Spartan 3E. Я хочу управлять игровой панелью с помощью клавиатуры 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". По сути, я хочу, чтобы мои клавиши на клавиатуре работали как обычные кнопки. Если я нажму и удерживаю, то он должен дать сигнал HIGH, в противном случае он должен дать сигнал LOW.

3 ответа

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;

Имели ли вы симуляцию - она ​​должна работать в симуляции так, как вы это делали.

Протокол клавиатуры PS/2 более сложный, чем этот. Вам нужно будет реализовать декодер с сохранением состояния.

Вкратце:

  1. Когда ничего не происходит, оба ps2_data а также ps2_clk всегда '1',
  2. В случае события клавиатура отправляет стартовый бит (0), биты данных один за другим, затем стоповый бит (1), Биты синхронизируются с ps2_clk,
  3. Когда клавиша нажата и удерживается, код сканирования отправляется повторно с определенным интервалом.
  4. Когда клавиша нажата, 'F0' Код, а затем код сканирования, отправляется (это немного сложнее для так называемых "расширенных" клавиш, которые включают клавиши со стрелками).

См. Руководство пользователя материнской платы Xilinx Spartan-3E FPGA, раздел "Порт мыши / клавиатуры PS/2" и / или общее описание электрического протокола PS/2 (последний по существу повторяет первый более подробно).

Я полагаю, что протокол клавиатуры PS2 отправляет командное слово, затем код клавиатуры при нажатии кнопки, затем два командных слова и код клавиатуры при отпускании. Вы имеете дело с этим в другом месте? Нам нужно больше узнать о ваших данных из вашего контроллера клавиатуры. Защелкивается ли сигнал данных с клавиатуры? Если у вас есть сброс данных при отпускании ключа, тогда ваш код должен работать так, как вам нужно.

Страница 8 - это то, о чем я говорю http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf

Другие вопросы по тегам