LED控制器设计(VHDL语言)

实验要求:

利用硬件描述语言设计一自定义译码器,其主要功能为下表所示:

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;

实验结果:

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风起晨曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值