Как фильтровать события клавиатуры?
Я пишу 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 более сложный, чем этот. Вам нужно будет реализовать декодер с сохранением состояния.
Вкратце:
- Когда ничего не происходит, оба
ps2_data
а такжеps2_clk
всегда'1'
, - В случае события клавиатура отправляет стартовый бит
(0)
, биты данных один за другим, затем стоповый бит(1)
, Биты синхронизируются сps2_clk
, - Когда клавиша нажата и удерживается, код сканирования отправляется повторно с определенным интервалом.
- Когда клавиша нажата,
'F0'
Код, а затем код сканирования, отправляется (это немного сложнее для так называемых "расширенных" клавиш, которые включают клавиши со стрелками).
См. Руководство пользователя материнской платы Xilinx Spartan-3E FPGA, раздел "Порт мыши / клавиатуры PS/2" и / или общее описание электрического протокола PS/2 (последний по существу повторяет первый более подробно).
Я полагаю, что протокол клавиатуры PS2 отправляет командное слово, затем код клавиатуры при нажатии кнопки, затем два командных слова и код клавиатуры при отпускании. Вы имеете дело с этим в другом месте? Нам нужно больше узнать о ваших данных из вашего контроллера клавиатуры. Защелкивается ли сигнал данных с клавиатуры? Если у вас есть сброс данных при отпускании ключа, тогда ваш код должен работать так, как вам нужно.
Страница 8 - это то, о чем я говорю http://www.cse.nd.edu/courses/cse20221/www/handouts/L21_%20PS2%20Keyboard.pdf