武汉科技大学课题:交通灯控制器的设计编号:17指导老师:冯玉林班级:自动化0703班姓名:筱启…………………………坚持,就是胜利………………………目录1.设计内容与要求…………………………………………22.交通灯控制系统的组成框图…………………………………………33.交通灯控制电路的设计…………………………………………44.交通灯控制电路设计的难点与解决方法………………………………………55.交通灯控制电路的Verilog语句…………………………………………65.交通灯控制电路的程序和波形分析…………………………………………126.EPF10K10LC84-4芯片引脚分配图…………………………………………207.实验小结…………………………………………21一、设计内容与要求①设计一个十字路口交通信号灯的定时控制电路。要求红、绿灯按一定的规律亮和灭,并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。②绿灯亮时,为该车道允许通行信号,红灯亮时,为该车道禁止通行信号。要求主干道每次通行时间为99秒,支干道每次通行时间为30秒。每次变换运行车道前绿灯闪烁,持续时间为5秒。即车道要由主干道转换为支干道时,主干道在通行时间只剩下5秒钟时,绿灯闪烁显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。同理,当车道由支干道转换主干道传感器支干道SS主干道支干道RYGRYG交通灯控制器CPS主干道信号灯为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。③对红、绿灯的运行时间要能比较方便的进行重新设置。④添加左转灯的控制,可自行到实际十字路口观看规律并实现。对器件进行在系统编程和实验验证。⑤用Verilog语言对设计进行描述,设计一个测试方案,通过Muxplus对设计进行仿真验证。并能够下载到实验板上调试成功。二、交通灯控制系统的组成框图根据设计要求,画出交通信号灯控制电路原理框图,如下图所示:交通信号灯控制原理图绿灯TsTltstlTemp左拐灯红灯时钟绿灯左拐灯红灯交通信号灯控制系统框图译码、显示支干道信号灯减法计数器状态译码器交通灯闪烁控制置数控制状态控制器秒脉冲发生器定时器控制器传感器译码器主干道信号灯支干道信号灯三、交通灯控制电路的设计交通灯控制器设计的重点是控制电路的设计,根据设计要求分析,控制电路的算法可用下图所示的ASM图描述。S0YesS3NoNoYesYesS1S2NoNoYesYes各状态的详细说明如下:S0状态:主干道绿灯亮,支干道红灯亮,此时若主干道有车等待左拐,而且主干道绿灯已亮足规定的时间间隔Ts;在主干道绿灯亮了(Ts-5)s后,则开始闪亮,直至绿灯亮了Ts;控制器发出状态转换信号Tempm==0,输出从状态S0转换到S1。S1状态:主干道左拐灯亮,支干道红灯亮,此时若支干道有车等待通过,而且主干道左拐灯已亮足规定的时间间隔Ts;在主干道左拐灯亮了(Ts-5)s后,则开始闪亮,直至左拐灯亮了Ts;控制器发出状态转换信号Tempm==0和Tempb==0,输出从状态S1转换到S2。S2状态:支干道绿灯亮,主干道红灯亮,若此时支干道继续有车,则继续保持此状态,但支干道绿灯亮的时间不得超过Ts时间间隔;在主干道绿灯亮了(Ts-5)s后,则开始闪亮,直至绿灯亮了Ts;控制器发出状态转换信号Tempb==0,使输出转换到S3状态。S3状态:支干道左拐灯亮,主干道红灯亮,此时若主干道有车等待通过,而且支干道左拐灯已亮足规定的时间间隔Ts;在支干道左拐灯亮了(Ts-5)s后,则开始闪亮,直至左拐灯亮了Ts;控制器发出状态转换信号Tempm==0和Tempb==0,主绿支红主红支绿Tempm==0?Countm由1变为2主黄支红Tempm==0?Tempb==0?Countm由2变为0Countb由0变为1Tempb==0?Countb由1变为2主红支黄Tempm==0?Tempb==0?Countm由0变为1Countb由1变为2输出从状态S3回到S0。交通灯状态图四、交通灯控制电路设计的难点与解决方法1、如何将主干道和支干道的直行和左拐的初始时间的设置和减计数分开?用使能信号,当使能信号en==0时,就进行初始时间的设置;当en==1时,就进行减计数。2、如何分别进行主干道和支干道的直行和左拐的初始时间的设置?将主干道直行和左拐、支干道直行和左拐分别用四个键msmlbsbl来控制,采这些信号的上升沿,每来一个上升沿就进行一次加计数,可以从0一直加到99。3、状态的转变很多,并且主干道和支干道的计时是并行的,应该如何使用标志位来安排好并行的状态转变?将主干道和支干道完全分开,用两组控制信号tempm和countm、tempb和countb来实现。将初始时间的赋值和减计数分开来:用temp来控制是赋值(temp==0)还是减计数(temp==1);用count来控制是哪一种状态下的倒计时,如count==0时,主干道是等待灯的倒计时,支干道是左拐灯的倒计时;count==1时,主干道是直行灯的倒计时,支干道是等待灯的倒计时;count==2S1S2S3Tempm==0&&Tempb==0Tempb==0S0Tempm==0Tempm==0&&Tempb==0Tempm==1Tempm==1Tempb==1Tempb==1时,主干道是红灯的倒计时,支干道是直行灯的倒计时。4、如何进行数码管的分配?共有8个数码管,但是根据题目要求必须用到12个数码管。给主干道和支干道分别分配4个数码管,两个用于时间的设定,两个用于时间的倒计时;而时间的设置里面,用模式控制键msty和bsty控制当下进行的是直行还是左拐的设置,如当sty==1时,显示的是直行的时间;当sty==0时,显示的是左拐的时间。5、在赋值的过程中对于红灯的时间计算有溢出该怎么避免?溢出的情况分为个位是7和9、8和8、8和9、9和9,因为大于15,故会溢出,得不到正确的结果。我采用的是把这些情况单独列出来进行解决。五、交通灯控制电路的Verilog语句moduletraffic1(clk,en,lampm,lampb,ms,bs,ml,bl,msty,bsty,mlampm,blampb,numm,numb);/*lampm和lampb分别表示主干道和支干道的亮灯,mlampm和blampb分别表示主干道和支干道的时间显示inputclk,en,ms,ml,bs,bl,msty,bsty;//ms,ml,bs,bl是手动设置时间的键,msty和bsty分别是主干道和支干道数码管显示的控制按键*/output[7:0]mlampm,blampb,numm,numb;output[2:0]lampm,lampb;reg[7:0]mgreen,mleft,bgreen,bleft;wire[7:0]mred,bred,mlampm,blampb;reg[7:0]numm,numb;regtempm,tempb;reg[2:0]countm,countb;reg[2:0]lampm,lampb;//模式转换:当msty==1时,为主干道直行时间的显示;当msty==0时,为主干道左拐时间的显示;当bsty==1时,为枝干道直行时间的显示;当bsty==0时,为枝干道左拐时间的显示。assignmlampm=(msty?mgreen:mleft);assignblampb=(bsty?bgreen:bleft);always@(posedgems)//手动设置主干道直行的时间beginif(!en)beginif(mgreen[3:0]==9&&mgreen[7:4]9)beginmgreen[3:0]=0;mgreen[7:4]=mgreen[7:4]+1;endelseif(mgreen[3:0]9&&mgreen[7:4]=9)beginmgreen[7:4]=mgreen[7:4];mgreen[3:0]=mgreen[3:0]+1;endelseif(mgreen[3:0]==9&&mgreen[7:4]==9)mgreen=0;endendalways@(posedgeml)//手动设置主干道左拐的时间beginif(!en)beginif(mleft[3:0]==9&&mleft[7:4]9)beginmleft[3:0]=0;mleft[7:4]=mleft[7:4]+1;endelseif(mleft[3:0]9&&mleft[7:4]=9)beginmleft[7:4]=mleft[7:4];mleft[3:0]=mleft[3:0]+1;endelseif(mleft[3:0]==9&&mleft[7:4]==9)beginmleft=0;endendendalways@(posedgebs)//手动设置支干道直行的时间beginif(!en)beginif(bgreen[3:0]==9&&bgreen[7:4]9)beginbgreen[3:0]=0;bgreen[7:4]=bgreen[7:4]+1;endelseif(bgreen[3:0]9&&bgreen[7:4]=9)beginbgreen[7:4]=bgreen[7:4];bgreen[3:0]=bgreen[3:0]+1;endelseif(bgreen[3:0]==9&&bgreen[7:4]==9)beginbgreen=0;endendendalways@(posedgebl)//手动设置支干道左拐的时间beginif(!en)beginif(bleft[3:0]==9&&bleft[7:4]9)beginbleft[3:0]=0;bleft[7:4]=bleft[7:4]+1;endelseif(bleft[3:0]9&&bleft[7:4]=9)beginbleft[7:4]=bleft[7:4];bleft[3:0]=bleft[3:0]+1;endelseif(bleft[3:0]==9&&bleft[7:4]==9)beginbleft=0;endendendalways@(posedgeclk)//该进程控制主干道的四种灯beginif(en)//使能信号为1时beginif(!tempm)//对主干道计时总时间进行赋值begintempm=1;case(countm)//控制亮灯的顺序0:begincountm=1;numm=mgreen;end1:begincountm=2;numm=mleft;end2:begincountm=0;if(bgreen[3:0]+bleft[3:0]9)beginnumm[3:0]=bgreen[3:0]+bleft[3:0]-10;numm[7:4]=bgreen[7:4]+bleft[7:4]+1;endelseif((bgreen[3:0]==7&&bleft[3:0]==9)||(bgreen[3:0]==9&&bleft[3:0]==7)||(bgreen[3:0]==8&&bleft[3:0]==8))beginnumm[3:0]=6;numm[7:4]=bgreen[7:4]+bleft[7:4]+1;endelseif((bgreen[3:0]==8&&bleft[3:0]==9)||(bgreen[3:0]==9&&bleft[3:0]==8))beginnumm[3:0]=7;numm[7:4]=bgreen[7:4]+bleft[7:4]+1;endelseif(bgreen[3:0]==9&&bleft[3:0]==9)beginnumm[3:0]=8;numm[7:4]=bgreen[7:4]+bleft[7:4]+1;endelsebeginnumm[3:0]=bgreen[3:0]+bleft[3:0];numm[7:4]=bgreen[7:4]+bleft[7:4]