本文介绍应用美国ALTERA公司的MAX+Plus II平台,使用VHDL硬件描述语言实现的多路彩灯控制器。 一、多路彩灯控制器设计原理 设计一个彩灯控制程序器。可以实现四种花型循环变化,有复位开关。整个系统共有三个输入信号CLK,RST,SelMode,八个输出信号控制八个彩灯。时钟信号CLK脉冲由系统的晶振产生。各种不同花样彩灯的变换由SelMode控制.硬件电路的设计要求在彩灯的前端加74373锁存器。用来对彩灯进行锁存控制。此彩灯控制系统设定有四种花样变化,这四种花样可以进行切换,四种花样分别为: (1)彩灯从左到右逐次闪亮。然后从右到左逐次熄灭。 (2)彩灯两边同时亮两个,然后逐次向中间点亮。 (3)彩灯从左到右两个两个点亮,然后从右到左两个两个逐次点亮。 (4)彩灯中间两个点亮。然后同时向两边散开。 二、多路彩灯控制器的VHDL的实现 本控制电路采用VHDL语言设计。运用自顶而下的设计思想,按功能逐层分割实现层次化设计。根据多路彩灯控制器的设计原理,将整个控制器分为四个部分,分别对应彩灯的四种变化模式、利用VHDL语言实现该功能程序如下: LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_loglc_ARITH.ALL; USE IEEE.std_logic_UNSIGNED.ALL; ENTITY CaiDeng IS port(CLK:IN std_logic; RST:in std_logic; SelMode:in std_logic_vector(1 downto 0);--彩灯花样控制 Light:out std_logic_vector(7 downto 0)); END CaiDeng; ARCHITECTURE control OF CaiDeng IS SIGNAL clk1ms:std_logic:='0'; SIGNAL cnt1:std_logic_vector(3 downto 0):="0000"; SIGNAL ent2:std_logic_vector(1 downto 0):="00"; SIGNAL cnt3:std_logic_vector(3 downto 0):="0000"; SIGNAL cnt4:std_logic_vector(1 downto 0):="00"; BEGIN P1:PR0CESS(clk1ms) BEGIN if(clk1ms'EVENT AND clk1ms='1')then if selmode="00" then --第一种彩灯花样的程序 if cnt1="1111" then cnt1<="0000"; else cnt1<= cnt1+1; end if; case cnt1 is when "0000"=>light<="10000000"; when "0001"=>light<="11000000"; when "0010"=>light<="11100000"; when "0011"=>light<="11110000"; when "0100"=>light<="11111000"; when "0101"=>light<="11111100"; when "0110"=>light<="11111110"; when "0111"=>light<="11111111"; when "1000"=>light<="11111110"; when "1001"=>light<="11111100"; when "1010"=>light<="11111000"; when "1011"=>light<="11110000"; when "1100"=>light<="11100000"; when "1101"=>light<="11000000"; when "1110"=>light<="10000000"; when others=>light<="00000000"; end case; elsif selmode="01" then -- 第二种彩灯花样的程序 if cnt2="11" then cnt2<="00"; else cnt2<= cnt2+1; end if; case cnt2 is when "00"=>light<="10000001"; when "01"=>light<="11000011"; when "10"=>light<="11100111"; when "11"=>light<="11111111"; when others=>light<="00000000"; end ease; elsif selmode="10" then --第三种彩灯花样的程序 if cnt3="1111" then cnt3<="0000"; else cnt3<=cnt3+1; end if; case cnt3 is when "0000"=>light<="11000000"; when "0001"=>light<="01100000"; when "0010"=>light<="00110000"; when "0011"=>light<="00011000"; when "0100"=>light<="00001100"; when "0101"=>light<="00000110"; when "0110"=>light<="00000011"; when "0111"=>light<="00000110"; when "1000"=>light<="00001100"; when "1001"=>light<="00011000"; when "1010"=>light<="00110000"; when "1011"=>light<="01100000"; when "1100"=>light<="11000000"; when others=>light<="00000000"; end case; elsif selmode="11" then -- 第四种彩灯花样的程序 if cnt4="11" then cnt4<="00"; else cnt4<= cnt4+1; end if; case cnt4 is when "00"=>light<="00011000"; when "01"=>light<="00111100"; when "10"=>light<="01111110"; when "11"=>light<="11111111"; when others=>light<="00000000"; end ease; end if; end if; END PROCESS P1; P2:PROCESS(clk) --分频进程 variable cnt:integer range 0 to 1000; BEGIN IF(RST='0')then cnt:=0: ELSIF(clk'EVENT AND clk='1')then if cnt<999 then cnt:=cnt+1; clk1ms<='0'; else cnt:=0; clk1ms<='1'; end if; end if; end PROCESS P2; end control; 三、功能仿真及下载验证 各模块VHDL程序经过编译优化后,选择合适的目标芯片进行综合、管脚配置。本电路选用ALTERA公司的可编程逻辑芯片EPM7128SLC84-6,由MAX+Plus II进行仿真,从仿真波形可以看出,此程序可以实现四种不同花样彩灯的相互变换,每种花样彩灯可以循环变化。但是如果系统的固有频率很大,彩灯的闪烁速度非常快,看到的现象是每个花样的八个彩灯同时被点亮,为了实现绚丽多彩的景象,必须要在程序中加一个分频进程如上述程序的进程P2。 四、结束语 本次设计的程序已经在硬件系统上得到了验证,实验表明。此设计方法能够满足四种不同花样彩灯的变化要求,并且该方法便于扩展不同变化模式的彩灯花样,各个不同花样的相互转变是手动切换实现的。自动切换的方法笔者不再累述。
|