📄 keyboard.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY keyboard IS
PORT(
clk,reset: IN STD_LOGIC;
kb0:INOUT STD_LOGIC;
getkey:OUT STD_LOGIC;
keydata:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
keyvalue:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END keyboard;
ARCHITECTURE arc OF keyboard IS
---------------------------------------------------------------
FUNCTION coder(data_in:STD_LOGIC_VECTOR(7 DOWNTO 0))
RETURN STD_LOGIC_VECTOR IS
VARIABLE result:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
CASE data_in(7 DOWNTO 0) IS
WHEN "11111110"=>result:="000";
WHEN "11111101"=>result:="001";
WHEN "11111011"=>result:="010";
WHEN "11110111"=>result:="011";
WHEN "11101111"=>result:="100";
WHEN "11011111"=>result:="101";
WHEN "10111111"=>result:="110";
WHEN OTHERS=>result:="111";
END CASE;
RETURN result;
END coder;
----------------------------------------------------------------
SIGNAL delay:STD_LOGIC;
BEGIN
------------------------------------------------
read:PROCESS(clk,reset)
VARIABLE second:INTEGER RANGE 0 TO 3;
VARIABLE keycode:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF (reset='0') THEN
second:=0;
delay<='0';
getkey<='0';
ELSIF(clk'EVENT AND clk='1') THEN
IF(second/=0) THEN
second:=second+1;
END IF;
getkey<=delay;
IF(keydata/="11111111") THEN
IF(second=0) THEN
keycode(2 DOWNTO 0):=coder(keydata);
keycode(3):=kb0;
second:=second+1;
delay<='0';
getkey<='0';
ELSE
IF (keycode(2 DOWNTO 0)=coder(keydata)) THEN
IF(keycode(3)=kb0) THEN
--IF(keycode<"1010") THEN
keyvalue<=keycode;
delay<='1';
--END IF;
second:=0;
END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
----------------------------------------------------
scan:PROCESS(clk, reset)
BEGIN
IF (reset='0') THEN
kb0<='0';
ELSIF(clk'EVENT AND clk='0') THEN
kb0<=NOT(kb0);
END IF;
END PROCESS;
-----------------------------------------------------
END arc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -