📄 keybcontrol.vhd
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--USE ieee.numeric_std.all;
ENTITY KeybControl IS
port
(
CLOCK18 : IN STD_LOGIC;
PS2_DAT : INOUT STD_LOGIC;
PS2_CLK : INOUT STD_LOGIC;
iRST_N : IN STD_LOGIC;
O_COIN1 : OUT STD_LOGIC := '0';
O_1P_START : OUT STD_LOGIC := '0';
O_1P_LE : OUT STD_LOGIC := '0';
O_1P_RI : OUT STD_LOGIC := '0';
O_1P_UP : OUT STD_LOGIC := '0';
O_1P_DN : OUT STD_LOGIC := '0';
O_COIN2 : OUT STD_LOGIC := '0';
O_2P_START : OUT STD_LOGIC := '0';
O_2P_LE : OUT STD_LOGIC := '0';
O_2P_RI : OUT STD_LOGIC := '0';
O_2P_UP : OUT STD_LOGIC := '0';
O_2P_DN : OUT STD_LOGIC := '0'
);
END KeybControl;
ARCHITECTURE Keyb_Control OF KeybControl IS
SIGNAL SCANCODE : STD_LOGIC_VECTOR(7 downto 0);
SIGNAL RX_OK : STD_LOGIC;
SIGNAL EXTENDED : STD_LOGIC;
SIGNAL RELEASED : STD_LOGIC;
COMPONENT ps2_keyboard_interface
PORT(clk : IN STD_LOGIC;
reset : IN STD_LOGIC;
rx_read : IN STD_LOGIC;
tx_write : IN STD_LOGIC;
ps2_clk : INOUT STD_LOGIC;
ps2_data : INOUT STD_LOGIC;
tx_data : IN STD_LOGIC_VECTOR(7 downto 0);
rx_extended : OUT STD_LOGIC;
rx_released : OUT STD_LOGIC;
rx_shift_key_on : OUT STD_LOGIC;
rx_data_ready : OUT STD_LOGIC;
tx_write_ack : OUT STD_LOGIC;
tx_error_no_keyboard_ack : OUT STD_LOGIC;
rx_ascii : OUT STD_LOGIC_VECTOR(7 downto 0);
rx_scan_code : OUT STD_LOGIC_VECTOR(7 downto 0)
);
END COMPONENT;
BEGIN
keyboard_interface : ps2_keyboard_interface
PORT MAP(clk => CLOCK18,
reset => not iRST_N,
rx_read => RX_OK,
tx_write => '0',
ps2_clk => PS2_CLK,
ps2_data => PS2_DAT,
tx_data => "00000000",
rx_extended => EXTENDED,
rx_released => RELEASED,
rx_data_ready => RX_OK,
rx_scan_code => SCANCODE
);
process(CLOCK18,iRST_N,EXTENDED,RELEASED,SCANCODE)
begin
if(iRST_N='0')then
O_COIN1 <= '0';
O_1P_START <= '0';
O_1P_LE <= '0';
O_1P_RI <= '0';
O_1P_UP <= '0';
O_1P_DN <= '0';
O_COIN2 <= '0';
O_2P_START <= '0';
O_2P_LE <= '0';
O_2P_RI <= '0';
O_2P_UP <= '0';
O_2P_DN <= '0';
elsif(rising_edge(CLOCK18))then
if(EXTENDED='0')then
if(RELEASED='0')then
case(SCANCODE)is
when X"2E" => O_COIN1 <= '1';--"5"
when X"16" => O_1P_START <= '1';--"1"
when X"36" => O_COIN2 <= '1';--"6"
when X"1E" => O_2P_START <= '1';--"2"
when X"23" => O_2P_LE <= '1';--"d"
when X"34" => O_2P_RI <= '1';--"g"
when X"2D" => O_2P_UP <= '1';--"r"
when X"2B" => O_2P_DN <= '1';--"f"
when others => NULL;
end case;
else
case(SCANCODE)is
when X"2E" => O_COIN1 <= '0';--"5"
when X"16" => O_1P_START <= '0';--"1"
when X"36" => O_COIN2 <= '0';--"6"
when X"1E" => O_2P_START <= '0';--"2"
when X"23" => O_2P_LE <= '0';--"d"
when X"34" => O_2P_RI <= '0';--"g"
when X"2D" => O_2P_UP <= '0';--"r"
when X"2B" => O_2P_DN <= '0';--"f"
when others => NULL;
end case;
end if;
else
if(RELEASED='0')then
case(SCANCODE)is
when X"6B" => O_1P_LE <= '1';--"<-"
when X"74" => O_1P_RI <= '1';--"->"
when X"75" => O_1P_UP <= '1';--"^"
--"|"
when X"72" => O_1P_DN <= '1';--"|"
--"v"
when others => NULL;
end case;
else
case(SCANCODE)is
when X"6B" => O_1P_LE <= '0';--"<-"
when X"74" => O_1P_RI <= '0';--"->"
when X"75" => O_1P_UP <= '0';--"^"
--"|"
when X"72" => O_1P_DN <= '0';--"|"
--"v"
when others => NULL;
end case;
end if;
end if;
end if;
end process;
END Keyb_Control;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -