📄 key_led.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY key_led IS
PORT(
clk_48M: IN STD_LOGIC; --系统时钟(48MHz)
key: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--按键输入(KEY1~KEY8)
ledin: IN STD_LOGIC_VECTOR(3 DOWNTO 0);--LED显示输入(在LED5~LED8显示)
data: IN STD_LOGIC_VECTOR(15 DOWNTO 0);--数码管显示输出(在数码管5~8显示)
led: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--LED输出(LED1~LED8)
seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管段码输出
hex: OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--4位16进制数输出(在数码管1~4显示)
bin: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--4位2进制数输出(在LED1~LED4显示)
dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --数码管位码输出
);
END ;
ARCHITECTURE one of key_led IS
SIGNAL hex_r: STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL bin_r: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL seg_r: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL dig_r: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL count: STD_LOGIC_VECTOR(16 DOWNTO 0);--时钟分频计数器
SIGNAL dout1,dout2,dout3,buff:STD_LOGIC_VECTOR(7 DOWNTO 0);--消抖寄存器
SIGNAL cnt3: STD_LOGIC_VECTOR(2 DOWNTO 0);--数码管扫描计数器
SIGNAL disp_dat:STD_LOGIC_VECTOR(3 DOWNTO 0);--数码管扫描显存
SIGNAL div_clk: STD_LOGIC;
SIGNAL key_edge: STD_LOGIC_VECTOR(7 DOWNTO 0); --按键消抖输出
BEGIN
hex<=hex_r;
bin<=bin_r;
seg<=seg_r;
dig<=dig_r;
led<=not (ledin & bin_r);
PROCESS(clk_48M) --时钟分频部分
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF count<120000 THEN
count<=count+1;
div_clk<='0';
ELSE
count<=B"0_0000_0000_0000_0000";
div_clk<='1';
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF div_clk='1' THEN
dout1<=key;
dout2<=dout1;
dout3<=dout2;
END IF;
END IF;
END PROCESS;
PROCESS (clk_48M)--按键边沿检测部分
BEGIN
IF RISING_EDGE(clk_48M)THEN
buff<=dout1 OR dout2 OR dout3;
END IF;
END PROCESS;
key_edge<= not(dout1 OR dout2 OR dout3) AND buff;--按键消抖输出
PROCESS(clk_48M)--------按键1-----------------------------<<4位16进制数输出部分
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF (key_edge(0)='1')THEN
hex_r(15 DOWNTO 12)<=hex_r(15 DOWNTO 12) + 1;
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键2
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF (key_edge(1)='1')THEN
hex_r(11 DOWNTO 8)<=hex_r(11 DOWNTO 8) + 1;
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键3
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF (key_edge(2)='1')THEN
hex_r(7 DOWNTO 4)<=hex_r(7 DOWNTO 4)+1;
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键4
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF (key_edge(3)='1') THEN
hex_r(3 DOWNTO 0)<=hex_r(3 DOWNTO 0)+1;
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键5
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF (key_edge(4)='1') THEN
bin_r(0) <= NOT bin_r(0);
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键6
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF (key_edge(5)='1') THEN
bin_r(1) <= NOT bin_r(1);
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键7
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF (key_edge(6)='1') THEN
bin_r(2) <= NOT bin_r(2);
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)--------按键8
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF (key_edge(7)='1') THEN
bin_r(3) <= NOT bin_r(3);
END IF;
END IF;
END PROCESS;
-------------------------------------------------<<数码管扫描显示部分
PROCESS(clk_48M)
BEGIN
IF RISING_EDGE(clk_48M)THEN
IF div_clk='1' THEN
cnt3 <= cnt3 + 1;
END IF;
END IF;
END PROCESS;
PROCESS(clk_48M)
BEGIN
IF RISING_EDGE(clk_48M) THEN
IF div_clk='1' THEN
CASE(cnt3) IS --<<选择扫描显示数据
WHEN "000"=> disp_dat<= hex_r(15 DOWNTO 12);
WHEN "001"=> disp_dat<= hex_r(11 DOWNTO 8);
WHEN "010"=> disp_dat<= hex_r(7 DOWNTO 4);
WHEN "011"=> disp_dat<= hex_r(3 DOWNTO 0);
WHEN "100"=> disp_dat<= data(15 DOWNTO 12);
WHEN "101"=> disp_dat<= data(11 DOWNTO 8);
WHEN "110"=> disp_dat<= data(7 DOWNTO 4);
WHEN "111"=> disp_dat<= data(3 DOWNTO 0);
END CASE;
CASE (cnt3) IS --<<选择数码管显示位
WHEN "000"=> dig_r<="01111111";
WHEN "001"=> dig_r<="10111111";
WHEN "010"=> dig_r<="11011111";
WHEN "011"=> dig_r<="11101111";
WHEN "100"=> dig_r<="11110111";
WHEN "101"=> dig_r<="11111011";
WHEN "110"=> dig_r<="11111101";
WHEN "111"=> dig_r<="11111110";
END CASE;
END IF;
END IF;
END PROCESS;
PROCESS(disp_dat)--------------------------------<<七段译码
BEGIN
CASE(disp_dat) IS
WHEN x"0"=> seg_r<=X"c0";
WHEN x"1"=> seg_r<=X"f9";
WHEN x"2"=> seg_r<=X"a4";
WHEN X"3"=> seg_r<=X"b0";
WHEN X"4"=> seg_r<=X"99";
WHEN X"5"=> seg_r<=X"92";
WHEN X"6"=> seg_r<=X"82";
WHEN X"7"=> seg_r<=X"f8";
WHEN X"8"=> seg_r<=X"80";
WHEN X"9"=> seg_r<=X"90";
WHEN X"A"=> seg_r<=X"88";
WHEN X"B"=> seg_r<=X"83";
WHEN X"C"=> seg_r<=X"c6";
WHEN X"D"=> seg_r<=X"a1";
WHEN X"E"=> seg_r<=X"86";
WHEN X"F"=> seg_r<=X"8e";
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -