实验要求:
利用硬件描述语言设计一自定义译码器,其主要功能为下表所示:
SW0 SW1 SW2 SW3 | LED0~LED3 |
↓ x x x | 流水点亮 |
1 ↓ x x | 间隔点亮 |
1 1 ↓ x | 追逐点亮 |
1 1 1 ↓ | 全部亮,并闪烁 |
其中,↓表示有键按下,1表示无键按下,x表示不管有没有按键; 流水点亮即为LED0先亮,然后LED0灭,LED1亮,依次类推;间隔点亮即为第一状态为LED0亮,第二状态为LED0保持亮、LED2亮,依次类推;追逐点亮即为第一状态为只有LED0亮,第二状态为LED0保持亮、LED1点亮,依次类推。
代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.All;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Vhdl1 IS
port (sys_clk,rst1:IN std_logic;
key1,key2,key3,key4:IN std_logic;
led_tmp: OUT std_logic_vector(3 DOWNTO 0));
END Vhdl1;
ARCHITECTURE behav OF Vhdl1 IS
signal tmp:std_logic_vector(3 DOWNTO 0);
signal cnt:integer range 0 to 3;
signal clk:std_logic;
BEGIN
PROCESS(sys_clk)--时钟分频
variable num:integer range 1 to 24000000;
BEGIN
if rising_edge(sys_clk)then
if num = 24000000
then num := 1;clk<= not clk;
else num := num+1;
END if;
END if;
END PROCESS;
PROCESS(clk,rst1)
variable key:std_logic_vector(4 DOWNTO 0);
BEGIN
key := (key1&key2&key3&key4&rst1);
if rising_edge(clk)then
CASE key is
when "01111"=>tmp<="0111";--按键0
when "10111"=>tmp<="1011";--按键1
when "11011"=>tmp<="1101";--按键2
when "11101"=>tmp<="1110";--按键3
when "11110"=>tmp<="1111";--复位信号
when OTHERS =>NULL;
END CASE;
END if;
END PROCESS;
PROCESS(tmp,clk)
BEGIN
if rising_edge(clk)then
CASE tmp is
when "1111" =>led_tmp <= "1111";cnt<=0;--复位信号
when "0111" =>--按键0 流水灯点亮
CASE cnt IS
when 0 =>led_tmp<="1000";cnt<=cnt+1;
when 1 =>led_tmp<="0100";cnt<=cnt+1;
when 2 =>led_tmp<="0010";cnt<=cnt+1;
when 3 =>led_tmp<="0001";cnt<=0;
when OTHERS =>NULL;
END CASE;
when "1011" =>--按键1 间隔点亮
CASE cnt IS
when 0 =>led_tmp<="1000";cnt<=cnt+1;
when 1 =>led_tmp<="1010";cnt<=cnt+1;
when 2 =>led_tmp<="0100";cnt<=cnt+1;
when 3 =>led_tmp<="0101";cnt<=0;
when OTHERS =>NULL;
END CASE;
when "1101" =>--按键2 追逐点亮
CASE cnt IS
when 0 =>led_tmp<="1000";cnt<=cnt+1;
when 1 =>led_tmp<="1100";cnt<=cnt+1;
when 2 =>led_tmp<="1110";cnt<=cnt+1;
when 3 =>led_tmp<="1111";cnt<=0;
when OTHERS =>NULL;
END CASE;
when "1110" =>--按键3 全部点亮并闪烁
CASE cnt IS
when 0 =>led_tmp<="1111";cnt<=cnt+1;
when 1 =>led_tmp<="0000";cnt<=cnt+1;
when 2 =>led_tmp<="1111";cnt<=cnt+1;
when 3 =>led_tmp<="0000";cnt<=0;
when OTHERS =>NULL;
END CASE;
when OTHERS =>NULL;
END CASE;
END if;
END PROCESS;
END behav;
实验结果: