Я пытаюсь определить, когда нажимается кнопка на клавиатуре PS / 2 с VHDL. Проблема заключается в том, чтобы найти хорошее решение для сигнала, который удерживается при правильном коде Make-клавиатуры PS / 2.
Я пробовал:
- Проверка, когда часы PS / 2 постоянно высокие.
- Проверка, не изменился ли сдвиговый регистр.
- Обнаружение кода make + break с большим регистром сдвига.
;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Keyboard_Drive is
Port ( PS2_DAT, PS2_CLK, clk, rstn : in std_logic;
end entity;
architecture rtl of Keyboard_Drive is
signal PS2_CLK2, PS2_CLK2_old, PS2_DAT2, detected_fall : std_logic;
signal shiftreg: std_logic_vector (9 downto 0);
signal pressed: std_logic := '0';
begin
input_signals : process (clk) begin
if rising_edge (clk) then
-- get data
PS2_DAT2 <= PS2_DAT;
PS2_CLK2 <= PS2_CLK;
PS2_CLK2_old <= PS2_CLK2;
end if;
end process;
detected_fall <= (NOT PS2_CLK2) AND PS2_CLK2_old;
Key: process (clk, rstn) begin
if rstn = '0' then
shiftreg <= (others => '0');
elsif rising_edge (clk) then
-- assign shift
if detected_fall = '1' then
shiftreg (8 downto 0) <= shiftreg (9 downto 1);
shiftreg (9) <= PS2_DAT2;
end if;
end if;
end process;