基于VHDL实现多路彩灯控制器设计应用关键词:VHDL彩灯控制07通信工程本科班沈治文摘要:设计一个彩灯控制程序器。可以实现四种花型循环变化,有复位开关。整个系统共有三个输入信号CLK,RST,Sel,八个输出信号控制八个彩灯。时钟信号CLK脉冲由系统的晶振产生。各种不同花样彩灯的变换由Sel控制.此彩灯控制系统设定有四种花样变化,这四种花样可以进行切换,四种花样分别为:(1)彩灯从左到右逐次闪亮。(2)彩灯从左向右逐次点亮,且亮后不熄灭。(3)彩灯两边同时亮两个,然后逐次向中间点亮。(4)全部彩灯亮与熄灭交替。Abstract:ThedesignofacontrolprogramLanterndevice.Fourkindsofflowerscanbeachievedcirculationchange,resetswitch.ThewholesystemhasthreeinputsignalsCLK,RST,Sel,8outputsignalcontrol8lights.TheclocksignalCLKpulsesgeneratedbythesystemofthecrystal.LanternsofdifferentpatternsoftransformationcontrolledbySel.Thelightscontrolsystemconfigurationtherearefourpatternschange,fourkindsofpatternscanbeswitched,fourkindsofpatternsareasfollows:(1)successiveflashinglightsfromlefttoright.(2)successivelanternlitfromlefttoright,andthelightisnotextinguishedafter.(3)Thetwobrightlightsonbothsidesatthesametime,andthensuccessivelytothecenterlight.(4)Alllightsturnbrightandquenching在日常生活中,为了增加聚会或是过节氛围,经常要使用到彩灯循环点亮。单一的循环可能无法起到理想的效果,通过不同花样的变换则能够很好的完成任务。多路彩灯循环控制可以有多种实现方法,例如利用单片机可以实现,利用数字电路时序逻辑也可以实现。我们这里利用VHDL语言实现对多路彩灯的控制。彩灯的一种点亮方式经过足够长的延时后,转变为了其他的点亮方式。这就需要一个CLK信号完成,CLK信号可以由晶体振荡器或者是振荡电路产生。至于各种不同花样彩灯的变换,我们可以通过增加输入信号Sel来控制。Sel为两位二进制数,分别为00,01,10,11,四种状态对应四种花样。同时系统还需一个复位信号实现对电路的清零控制。输出八位彩灯,我们这里用LED发光二极管代替。当电路输出为“1”时,LED点亮。当电路输出为“0”时,LED熄灭。利用VHDL语言实现该功能程序如下:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYcolor8ISPORT(cLK,rst:INstd_LOGIC;sel:instd_LOGIC_VECTOR(1DOWNTO0);abc:OUTstd_LOGIC_VECTOR(7DOWNTO0));ENDcolor8;ARCHITECTUREcolorOFcolor8ISTYPEstate_1IS(s0,s1,s2,s3,s4,s5,s6,s7);SIGNALstate_2:state_1;BEGINpr_1:PROCESS(cLK,rst)BEGINIFrst='1'THENstate_2=s0;ELSIFcLK'eventANDcLK='1'THENCASEstate_2ISWHENs0=state_2=s1;WHENs1=state_2=s2;WHENs2=state_2=s3;WHENs3=state_2=s4;WHENs4=state_2=s5;WHENs5=state_2=s6;WHENs6=state_2=s7;WHENs7=state_2=s0;ENDCASE;ENDIF;ENDPROCESSpr_1;pr_2:PROCESS(sel,state_2)BEGINifsel=00thenCASEstate_2IS彩灯从左到右逐次闪亮WHENs0=abc=10000000;WHENs1=abc=01000000;WHENs2=abc=00100000;WHENs3=abc=00010000;WHENs4=abc=00001000;WHENs5=abc=00000100;WHENs6=abc=00000010;WHENs7=abc=00000001;ENDCASE;elsifsel=01then彩灯从左向右逐次点亮,且亮后不熄灭CASEstate_2ISWHENs0=abc=10000000;WHENs1=abc=11000000;WHENs2=abc=11100000;WHENs3=abc=11110000;WHENs4=abc=11111000;WHENs5=abc=11111100;WHENs6=abc=11111110;WHENs7=abc=11111111;ENDCASE;elsifsel=10then彩灯两边同时亮两个,然后逐次向中间点亮CASEstate_2ISWHENs0=abc=10000001;WHENs1=abc=01000010;WHENs2=abc=00100100;WHENs3=abc=00011000;WHENs4=abc=00100100;WHENs5=abc=01000010;WHENs6=abc=10000001;WHENs7=abc=11111111;ENDCASE;elsifsel=11then全部彩灯亮与熄灭交替CASEstate_2ISWHENs0=abc=11111111;WHENs1=abc=00000000;WHENs2=abc=11111111;WHENs3=abc=00000000;WHENs4=abc=11111111;WHENs5=abc=00000000;WHENs6=abc=11111111;WHENs7=abc=00000000;ENDCASE;endif;ENDPROCESSpr_2;ENDcolor;本控制电路采用VHDL语言设计。运用自顶而下的设计思想,按功能逐层分割实现层次化设计。根据多路彩灯控制器的设计原理,将整个控制器分为四个部分,分别对应彩灯的四种变化模式。考虑到程序比较长,本电路利用状态机的VHDL设计来简化,使得程序层次分明,可读性更强。使用TYPE语句定义state_1为s0到s7八种状态。主控时序进程将state_1的内容送给state_2,主控组合进程通过信号state_2中的状态值,进入相应的状态。在进程一中,首先用TYPE语句定义数据对象,以及个状态之间的转化情况。在进程二中,在IF语句中嵌套CASE语句。在IF语句中,规定四种花样,即用SEL=00表示花色的第一种点亮方式,对应SEL=01,10,11分别表示花色的第二,第三和第四种点亮方式。在CASE语句中,输出八位彩灯的状态用八位二进制数据来代替。彩灯从左到右逐次闪亮,即使为1的为右移。彩灯从左向右逐次点亮,且亮后不熄灭,即从左向右逐渐将0转变为1。彩灯两边同时亮两个,然后逐次向中间点亮,即两1为逐渐向内移动。全部彩灯亮与熄灭交替,即全为1与全为0之间的转变。各模块VHDL程序经过编译优化后,选择合适的目标芯片进行综合、仿真,管脚配置以及编程下载,实现硬件模拟。本电路选用ACEX1K公司的可编程逻辑芯片EPEK100QC208-3,由QuartusII进行仿真.下面是四种花色的仿真波形。图形编号(1)当Sel全为00时图形编号(2)当Sel全为01时图形编号(3)当Sel全为10时图形编号(4)当Sel全为11时图形编号(5)从仿真波形可以看出,此程序可以实现四种不同花样彩灯的相互变换,每种花样彩灯可以循环变化。然后就可以实现程序下载和硬件测试。主频时钟clk接CLOCK0(第91脚),但是如果系统的固有频率很大,彩灯的闪烁速度非常快,看到的现象是每个花样的八个彩灯同时被点亮,为了实现绚丽多彩的景象,选择不同的频率(在1Hz--46Hz之间选择)能使彩灯点亮速度适宜。复位RST和Sel的高位与地位分别接三个键控。输出八位彩灯分别对应接八个LED发光二极管。编程下载后,拨动Sel的高位与地位观察能否实现四种花色的循环。本次设计的程序已经在硬件系统上得到了验证,实验表明。此设计方法能够满足四种不同花样彩灯的变化要求,并且该方法便于扩展不同变化模式的彩灯花样,各个不同花样的相互转变是手动切换实现的。实验结果与理论结果相一致,能够实现八位彩灯循环控制,达到实验预期目的。通过本次试验,可以加深对有限状态机的理解。在程序中运用CASE语句,巩固对其掌握。在程序中,实现四种花样的转化时遇到一些问题,即SEL的运用,通过与同学的交流以及上网查询,最终克服困难实现功能。参考文献:潘松黄继业科学出版社EDA技术实用教程2006年9月第三版