📄 key2.vhd
字号:
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY key2 IS
PORT(inclk :IN std_logic; -- 输入时钟信号
inkey :IN std_logic_vector(0 to 3); -- 输入按键信号
outkey :OUT std_logic_vector(0 to 3); -- 输出键盘扫描信号
outled :OUT std_logic_vector(7 downto 0) ); -- LED显示
END key2;
ARCHITECTURE art OF key2 IS
COMPONENT tinglmove
PORT(a,clk:IN std_logic;
b:OUT std_logic);
END COMPONENT;
SIGNAL keyclk :std_logic_vector(16 downto 0);
SIGNAL chuclk :std_logic_vector(2 downto 0);
SIGNAL keyclkout,chuclkout :std_logic ; --键盘去抖脉冲,串行扫描产生脉冲
SIGNAL chuout :std_logic_vector(0 to 3); --扫描信号
SIGNAL inkeymap :std_logic_vector(0 to 3); --按键去抖后的信号
SIGNAL keyout :std_logic_vector(0 to 7);
BEGIN
roll:FOR i IN 0 TO 3 GENERATE -- 生成四个去抖单元电路
movskipX:tinglmove PORT MAP(inkey(i),keyclkout,inkeymap(i));
END GENERATE;
clk_key:PROCESS(inclk)
BEGIN
if(inclk'event and inclk='1')then
if keyclk=54999 then
keyclk<="00000000000000000";
keyclkout<=not keyclkout;
else
keyclk<=keyclk+1;
end if;
end if;
END PROCESS clk_key;
clk_chu:PROCESS(keyclkout)
BEGIN
IF (keyclkout'EVENT AND keyclkout='1')THEN
IF chuclk=4 THEN
chuclk<="000";chuclkout<=not chuclkout;
ELSE
chuclk<=chuclk+1;
END IF;
END IF;
END PROCESS clk_chu;
clk_chu_out:PROCESS(chuclkout)
BEGIN
IF (chuclkout'EVENT AND chuclkout='1')THEN
IF chuout="1110"THEN
IF inkeymap/="1111"THEN
keyout<=chuout&inkeymap;
END IF;
chuout<="1101";
ELSIF chuout="1101"THEN
IF inkeymap/="1111"THEN
keyout<=chuout&inkeymap;
END IF;
chuout<="1011";
ELSIF chuout="1011"THEN
IF inkeymap/="1111"THEN
keyout<=chuout&inkeymap;
END IF;
chuout<="0111";
ELSIF chuout="0111"THEN
IF inkeymap/="1111"THEN
keyout<=chuout&inkeymap;
END IF;
chuout<="1110";
ELSE
chuout<="1110";
END IF;
END IF;
END PROCESS clk_chu_out;
outkey<=chuout;
out_led:PROCESS(keyout)
BEGIN
case keyout(0 to 3) is
when"0111"=>case keyout(4 to 7) is
when"0111"=>outled<=x"7e";
when"1011"=>outled<=x"33";
when"1101"=>outled<=x"7f";
when"1110"=>outled<=x"4e";
when others=>outled<=x"00";
end case;
when"1011"=>case keyout(4 to 7) is
when"0111"=>outled<=x"30";
when"1011"=>outled<=x"5b";
when"1101"=>outled<=x"7b";
when"1110"=>outled<=x"3d";
when others=>outled<=x"00";
end case;
when"1101"=>case keyout(4 to 7) is
when"0111"=>outled<=x"6d";
when"1011"=>outled<=x"5f";
when"1101"=>outled<=x"77";
when"1110"=>outled<=x"4f";
when others=>outled<=x"00";
end case;
when"1110"=>case keyout(4 to 7) is
when"0111"=>outled<=x"79";
when"1011"=>outled<=x"70";
when"1101"=>outled<=x"1f";
when"1110"=>outled<=x"47";
when others=>outled<=x"00";
end case;
when others =>outled<=x"00";
end case;
END PROCESS out_led;
end art;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -