数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器1/17课题1.4.2:交通灯控制器一.设计课题的任务要求:(一)、实验目的1.熟练掌握VHDL语言和QuartusII软件的使用;2.理解状态机的工作原理和设计方法;(二)、相关知识本实验要利用CPLD设计实现一个十字路口的交通灯控制系统,与其他控制系统一样,本系统划分为控制器和受控电路两部分。控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。路口交通灯控制系统的有东西路和南北路交通灯R(红)、Y(黄)、G(绿)三色,所有灯均为高电平点亮。设置20s的通行时间和5s转换时间的变模定时电路,用数码管显示剩余时间。提供系统正常工作/复位和紧急情况两种工作模式。(三)、实验任务1.基本任务:设计制作一个用于十字路口的交通灯控制器。1).南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;2).当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;3).用数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;二.系统设计(包括设计思路、总体框图、分块设计)(一)设计思路1.总体设计----输入部分:1)CLK时钟频率输入,可由实验板上直接提供,为准确确定时间长度,选择1024Hz信号。2)紧急状态按键拨码开关EMERGENCY,当将其置为高电平,表示紧急情况发生,两个方向均为红灯亮,计时停止;当置其为低电平,信号灯和计时器恢复原来状态,正常工作。3)复位拨码开关RESET,当将其置为高电平,表示复位,工作停止,全部回到初始状态;当置其为低电平,重新开始工作。2.总体设计----输出部分:1)东西方向和南北方向各使用3个LED显示,LIGHT1,LIGHT2,红黄绿各代表红黄绿灯。2)东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。(二)总体框图1.输入输出示意图数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器2/172.模块示意图Light1ClkLight2EmergencyNumResetB_out东西向交通灯南北向交通灯数码管显示输出控制数码管显示时钟(1024hz)开关1开关2译码器时钟时间计数器东西灯南北灯控制器分频器复位倒计时显示紧急请求数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器3/17Yes南北绿,东西红是否绿灯时间到20s?对黄灯开始计时南北黄,东西红是否黄灯时间到5s?对绿灯开始计时南北红,东西绿是否绿灯时间到20s?对黄灯开始计时南北红,东西黄是否黄灯时间到5s?对绿灯开始计时YesyesyesNOnoNOno启动/复位3.流程图4.RTL图数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器4/175.状态显示红绿灯显示状态状态S0南北绿灯亮,东西红灯亮S1南北黄灯亮,东西红灯亮S2南北红灯亮,东西绿灯亮S3南北红灯亮,东西黄灯亮S4南北东西红灯都亮(三)分块设计-------在VHDL设计中,采用自顶向下的设计思路。1.顶层模块中,根据硬件设计,设置如下端口:外部时钟信号:CLK紧急状态按键:EMERGENCY南北方向状态灯:LIGHT1东西方向状态灯:LIGHT2数码管显示信号:NUM控制数码管:B_OUT2.在底层中,把不同功能分模块设计。FREQUENCY模块,由于外部时钟信号CLK的频率为1024Hz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。输入端口:CLK外部时钟信号输出端口:CLK_OUT分频后信号COUNTER模块,由于整个过程的显示周期为50秒,即50个状态,所以该模块为计数器模块,计数周期为50,输入为1Hz的外部时钟,并加入紧急信号和复位信号,当输入紧急信号,计数停止,当输入复位信号,计数置1.通过该计数器的计数输出信号来控制LIGHT模块和COUNTDOWN模块的状态。输入端口:CLK时钟信号,EMERGENCY紧急信号,RESET复位信号输出端口:COUNTER计数状态信号数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器5/17COUNTDOWN模块,倒计时显示模块,通过输入的COUNTER和CLK来控制数码管共阴极和7段数码管数字显示控制。输入接口:CLK时钟信号,COUNT计数器信号输出接口:CAT_TEMP共阴极控制,NUMIN数字输出bian_ma_6模块:将输入接口的CAT_TEMP共阴极控制转换为三八译码器的输入端。输入端口:CAT_TEMP共阴极控制输出端口:b_out;SHOW模块,接收数字信号,进行7位数码管显示译码输出。输入接口:NUMIN输入信号输出接口:NUM译码输出LIGHT信号灯控制模块,使用状态机,双进程控制5个状态输入接口:COUNT计数器信号,EMERGENCY紧急状态控制输出接口:LIGHT1,LIGHT2信号灯输出三.仿真波形及波形分析仿真波形1.状态周期为1~50,在每个状态内,数码管共阴极进行扫描,且扫描同时数码管显示进行循环变化2.周期状态,在1~20,21~25,26~45,46~50进行红绿灯显示变化3.一整个周期状态1~50,在1~20,21~25,26~45,46~50进行红绿灯显示变化4.多个周期循环5.紧急状态和复位状态四.源程序(注释)FREQUENCY--分频模块:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFREQUENCYISPORT(CLK:INSTD_LOGIC;CLK_OUT:OUTSTD_LOGIC);ENDFREQUENCY;ARCHITECTUREFREQOFFREQUENCYISSIGNALTEMP:INTEGERRANGE0TO1023;----设置分频1023,则为1HzBEGIN数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器6/17PROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENIF(TEMP=1023)THENTEMP=0;ELSETEMP=TEMP+1;ENDIF;IFTEMP1023THENCLK_OUT='0';ELSECLK_OUT='1';ENDIF;ENDIF;ENDPROCESS;END;COUNTER.vhd----计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期1~50----由于该交通灯的状态为50种,数码管有50种显示状态----完全通过控制计数器的停止和复位来控制闪灯和数码管LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCOUNTERISPORT(CLK:INSTD_LOGIC;----外部时钟输入RESET:INSTD_LOGIC;----复位信号输入EMERGENCY:INSTD_LOGIC;----紧急信号输入COUNTER:OUTSTD_LOGIC_VECTOR(5DOWNTO0):=000001----计数信号输出);ENDCOUNTER;ARCHITECTURECONOFCOUNTERISSIGNALTEMPCOUNT:INTEGERRANGE1TO50:=1;----定义信号计数,初始状态为1BEGINPROCESS(CLK,RESET,EMERGENCY)BEGINIFCLK'EVENTANDCLK='1'THEN----外部时钟,1HzIFRESET='1'THEN----复位状态TEMPCOUNT=1;----计数器回到初始状态1ELSIFTEMPCOUNT=50THENTEMPCOUNT=1;----计数器计数状态,加1ELSETEMPCOUNT=TEMPCOUNT+1;ENDIF;ELSIFEMERGENCY='1'THEN----当紧急信号为高电平,进入紧急状态TEMPCOUNT=TEMPCOUNT;----计数器停止计数ENDIF;ENDPROCESS;COUNTER=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);----内部信号转化为输出ENDCON;LIGHT.vhd----交通灯显示信号LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器7/17ENTITYLIGHTISPORT(EMERGENCY:INSTD_LOGIC;----紧急信号输入,控制紧急状态COUNT:INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入,控制其它正常状态LIGHT1,LIGHT2:OUTSTD_LOGIC_VECTOR(2DOWNTO0)----交通灯信号输出);ENDLIGHT;ARCHITECTURELIGHTSHOWOFLIGHTISTYPESTATESIS----设置状态机,控制状态(S0,S1,S2,S3,S4);SIGNALSTATE:STATES;SIGNALTEMPCOUNT:INTEGERRANGE1TO50;BEGINP1:PROCESS(COUNT,EMERGENCY)BEGINTEMPCOUNT=CONV_INTEGER(COUNT);----将二进制输入转化为十进制计数信号IFEMERGENCY='1'THEN----EMERGENCY为高电平时为紧急状态STATE=S4;ELSECASETEMPCOUNTIS----由计数器控制状态持续时间WHEN1TO20=STATE=S0;----1秒到20秒WHEN21TO25=STATE=S1;----21秒到25秒WHEN26TO45=STATE=S2;----26秒到45秒WHEN46TO50=STATE=S3;----46秒到50秒ENDCASE;ENDIF;ENDPROCESSP1;P2:PROCESS(STATE)----状态机BEGINCASESTATEISWHENS0=LIGHT1=001;----南北绿灯LIGHT2=100;----东西红灯WHENS1=LIGHT1=010;----南北黄灯LIGHT2=100;----东西红灯WHENS2=LIGHT1=100;----南北红灯LIGHT2=001;----东西绿灯WHENS3=LIGHT1=100;----南北红灯LIGHT2=010;----东西黄灯WHENS4=LIGHT1=100;----南北红灯LIGHT2=100;----东西红灯数字系统与逻辑设计实验-----课题1.4.2:交通灯控制器8/17ENDCASE;ENDPROCESS;ENDLIGHTSHOW;COUNTDOWN.vhd----7段数码管倒计时控制模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCOUNTDOWNISPORT(COUNT:INSTD_LOGIC_VECTOR(5DOWNTO0);----计数器输入信号CLK:INSTD_LOGIC;----时钟信号NUMIN:OUTSTD_LOGIC_VECTOR(3DOWNTO0);----输出7段数码管显示数字信号,输出到译码模块CAT_TEMP:OUTSTD_LOGIC_VECTOR(5