毕业设计---基于Verilog的交通灯控制器的设计
- 格式:doc
- 大小:259.50 KB
- 文档页数:21
课题:交通灯控制器的设计目录1. 设计内容与要求 (2)2. 交通灯控制系统的组成框图 (3)3. 交通灯控制电路的设计 (4)4. 交通灯控制电路设计的难点与解决方法 (5)5. 交通灯控制电路的Verilog语句 (6)5. 交通灯控制电路的程序和波形分析 (12)6. EPF10K10LC84-4芯片引脚分配图 (20)7. 实验小结 (21)一、 设计内容与要求① 设计一个十字路口交通信号灯的定时控制电路。
要求红、绿灯按一定的规律亮和灭,并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。
②绿灯亮时,为该车道允许通行信号,红灯亮时,为该车道禁止通行信号。
要求主干道每次通行时间为99秒,支干道每次通行时间为30秒。
每次变换运行车道前绿灯闪烁,持续时间为5秒。
即车道要由主干道转换为支干道时,主干道在通行时间只剩下5秒钟时,绿灯闪烁显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。
同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。
③ 对红、绿灯的运行时间要能比较方便的进行重新设置。
④ 添加左转灯的控制,可自行到实际十字路口观看规律并实现。
对器件进行在系统编程和实验验证。
⑤用Verilog 语言对设计进行描述,设计一个测试方案,通过Muxplus 对设计进行仿真验证。
并能够下载到实验板上调试成功。
二、交通灯控制系统的组成框图交通信号灯控制原理图绿灯左拐灯红灯绿灯左拐灯红灯交通信号灯控制系统框图三、交通灯控制电路的设计交通灯控制器设计的重点是控制电路的设计,根据设计要求分析,控制电路的算法可用下图所示的ASM图描述。
各状态的详细说明如下: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,输出从状态S3回到S0。
交通灯状态图四、交通灯控制电路设计的难点与解决方法1、如何将主干道和支干道的直行和左拐的初始时间的设置和减计数分开?用使能信号,当使能信号en==0时,就进行初始时间的设置;当en==1时,就进行减计数。
2、如何分别进行主干道和支干道的直行和左拐的初始时间的设置?将主干道直行和左拐、支干道直行和左拐分别用四个键ms ml bs bl来控制,采这些信号的上升沿,每来一个上升沿就进行一次加计数,可以从0一直加到99。
3、状态的转变很多,并且主干道和支干道的计时是并行的,应该如何使用标志位来安排好并行的状态转变?将主干道和支干道完全分开,用两组控制信号tempm和countm、tempb和countb来实现。
将初始时间的赋值和减计数分开来:用temp来控制是赋值(temp==0)还是减计数(temp==1);用count来控制是哪一种状态下的倒计时,如count==0时,主干道是等待灯的倒计时,支干道是左拐灯的倒计时;count==1时,主干道是直行灯的倒计时,支干道是等待灯的倒计时;count==2时,主干道是红灯的倒计时,支干道是直行灯的倒计时。
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,nu mb);/*lampm和lampb分别表示主干道和支干道的亮灯,mlampm和blampb分别表示主干道和支干道的时间显示input clk,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;reg tempm,tempb;reg[2:0] countm,countb;reg[2:0] lampm,lampb;//模式转换:当msty==1时,为主干道直行时间的显示;当msty==0时,为主干道左拐时间的显示;当bsty==1时,为枝干道直行时间的显示;当bsty==0时,为枝干道左拐时间的显示。
assign mlampm=(msty?mgreen:mleft);assign blampb=(bsty?bgreen:bleft);always @ (posedge ms)//手动设置主干道直行的时间beginif(!en)beginif(mgreen[3:0]==9&&mgreen[7:4]<9)begin mgreen[3:0]<=0; mgreen[7:4]<=mgreen[7:4]+1; endelse if(mgreen[3:0]<9&&mgreen[7:4]<=9)begin mgreen[7:4]<=mgreen[7:4]; mgreen[3:0]<=mgreen[3:0]+1; endelse if(mgreen[3:0]==9&&mgreen[7:4]==9)mgreen<=0;endalways @ (posedge ml)//手动设置主干道左拐的时间beginif(!en)beginif(mleft[3:0]==9&&mleft[7:4]<9)begin mleft[3:0]<=0; mleft[7:4]<=mleft[7:4]+1; endelse if(mleft[3:0]<9&&mleft[7:4]<=9)begin mleft[7:4]<=mleft[7:4]; mleft[3:0]<=mleft[3:0]+1; endelse if(mleft[3:0]==9&&mleft[7:4]==9)begin mleft<=0; endendendalways @ (posedge bs)//手动设置支干道直行的时间beginif(!en)beginif(bgreen[3:0]==9&&bgreen[7:4]<9)begin bgreen[3:0]<=0; bgreen[7:4]<=bgreen[7:4]+1; endelse if(bgreen[3:0]<9&&bgreen[7:4]<=9)begin bgreen[7:4]<=bgreen[7:4]; bgreen[3:0]<=bgreen[3:0]+1; endelse if(bgreen[3:0]==9&&bgreen[7:4]==9)begin bgreen<=0; endendendalways @ (posedge bl)//手动设置支干道左拐的时间beginif(!en)beginif(bleft[3:0]==9&&bleft[7:4]<9)begin bleft[3:0]<=0; bleft[7:4]<=bleft[7:4]+1; endelse if(bleft[3:0]<9&&bleft[7:4]<=9)begin bleft[7:4]<=bleft[7:4]; bleft[3:0]<=bleft[3:0]+1; endelse if(bleft[3:0]==9&&bleft[7:4]==9)begin bleft<=0; endendendalways @(posedge clk)//该进程控制主干道的四种灯if(en)//使能信号为1时beginif(!tempm)//对主干道计时总时间进行赋值begintempm<=1;case(countm)//控制亮灯的顺序0:begin countm<=1; numm<=mgreen; end1:begin countm<=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;endelse if(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];endenddefault:lampm<=3;endcaseendelse//如果tempm=1begin//倒计时case(countm)1:begin//主干道的绿灯倒计时if(numm>6)beginif(numm[3:0]==0)beginnumm[3:0]<=9; numm[7:4]<=numm[7:4]-1; lampm[1]<=1;endelsebegin numm[3:0]<=numm[3:0]-1; lampm[1]<=1; end endelse if(numm==6||numm==4||numm==2)begin lampm[1]<=1; numm<=numm-1; endelse if(numm==5||numm==3)begin lampm[1]<=0; numm<=numm-1; endelse if(numm==1)begin tempm<=0;lampm[1]<=0; endend2:begin //主干道左转灯倒计时if(numm>6)beginif(numm[3:0]==0)beginnumm[7:4]<=numm[7:4]-1;numm[3:0]<=9;lampm[2]<=1;endelse begin numm[3:0]<=numm[3:0]-1;lampm[2]<=1; endendelse if(numm==6||numm==4||numm==2)begin lampm[2]<=1; numm<=numm-1; endelse if(numm==5||numm==3)begin lampm[2]<=0; numm<=numm-1; endelse if(numm==1)begin lampm[2]<=0; tempm<=0; endend0:begin//主干道红灯倒计时if(numm[3:0]==0)beginnumm[7:4]<=numm[7:4]-1;numm[3:0]<=9; lampm[0]<=1;endelse if(numm==1)begin lampm[0]<=0; tempm<=0; endelse beginnumm[3:0]<=numm[3:0]-1;lampm[0]<=1;endendendcaseendif(!tempb)//如果tempb=0begintempb<=1;case(countb)//控制亮灯的顺序0:begin countb<=1;if(mgreen[3:0]+mleft[3:0]>9)beginnumb[3:0]<=mgreen[3:0]+mleft[3:0]-10;numb[7:4]<=mgreen[7:4]+mleft[7:4]+1;endelseif((mgreen[3:0]==7&&mleft[3:0]==9)||(mgreen[3:0]==9&&mleft[3:0]==7)||(mgre en[3:0]==8&&mleft[3:0]==8))begin numb[3:0]<=6; numb[7:4]<=mgreen[7:4]+mleft[7:4]+1; endelseif((mgreen[3:0]==8&&mleft[3:0]==9)||(mgreen[3:0]==9&&mleft[3:0]==8))beginnumb[3:0]<=7;numb[7:4]<=mgreen[7:4]+mleft[7:4]+1; endelse if(mgreen[3:0]==9&&mleft[3:0]==9)beginnumb[3:0]<=8; numb[7:4]<=mgreen[7:4]+mleft[7:4]+1;endelsebeginnumb[3:0]<=mgreen[3:0]+mleft[3:0];numb[7:4]<=mgreen[7:4]+mleft[7:4];endend1:begin countb<=2; numb<=bgreen; end2:begin countb<=0; numb<=bleft; enddefault:lampb<=3;endcaseendelse//如果tempm=1begin//各个灯的倒计时case(countb)1:begin//支干道红灯的倒计时if(numb[3:0]==0)beginnumb[3:0]<=9; numb[7:4]<=numb[7:4]-1; lampb[0]<=1;endelse if(numb==1)begin lampb[0]<=0; tempb<=0; endelsebegin numb[3:0]<=numb[3:0]-1; lampb[0]<=1; end end2:begin//支干道的绿灯倒计时if(numb>6)beginif(numb[3:0]==0)beginnumb[7:4]<=numb[7:4]-1; numb[3:0]<=9; lampb[1]<=1;endelsebegin numb[3:0]<=numb[3:0]-1;lampb[1]<=1; endendelse if(numb==6||numb==4||numb==2)begin numb<=numb-1;lampb[1]<=1; endelse if(numb==5||numb==3)begin lampb[1]<=0; numb<=numb-1; endelse if(numb==1)begin lampb[1]<=0; tempb<=0; end end0:begin//支干道的左转灯倒计时if(numb>6)beginif(numb[3:0]==0)begin numb[7:4]<=numb[7:4]-1; numb[3:0]<=9; lampb[2]<=1; endelsebegin numb[3:0]<=numb[3:0]-1;lampb[2]<=1; endendelse if(numb==6||numb==4||numb==2)begin lampb[2]<=1; numb<=numb-1; endelse if(numb==5||numb==3)begin lampb[2]<=0; numb<=numb-1; endelse if(numb==1)begin lampb[2]<=0; tempb<=0; endendendcaseendendif(!en)//使能端信号为0时begin lampm<=0; countm<=0; tempm<=0; lampb<=0; countb<=0; tempb<=0; endendendmodule六、交通灯控制电路的程序和波形分析1、主干道直行时间的设置程序为:always @ (posedge ms)beginif(!en)beginif(mgreen[3:0]==9&&mgreen[7:4]<9)begin mgreen[3:0]<=0; mgreen[7:4]<=mgreen[7:4]+1; endelse if(mgreen[3:0]<9&&mgreen[7:4]<=9)begin mgreen[7:4]<=mgreen[7:4]; mgreen[3:0]<=mgreen[3:0]+1; endelse if(mgreen[3:0]==9&&mgreen[7:4]==9)mgreen<=0;endend其波形为:在使能信号en==0时,若按键ms被按一下,则加一下数,直至使能信号为1或者ms键不再被按为止。