基于Verilog的交通灯控制器的设计.docx
《基于Verilog的交通灯控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于Verilog的交通灯控制器的设计.docx(26页珍藏版)》请在冰点文库上搜索。
基于Verilog的交通灯控制器的设计
武汉科技大学
课题:
交通灯控制器的设计
编号:
17
指导老师:
冯玉林
班级:
自动化0703班
坚持,就是胜利
1.设计内容与要求2
2.交通灯控制系统的组成框图3
3.交通灯控制电路的设计4
4.交通灯控制电路设计的难点与解决方法5
5.交通灯控制电路的Verilog语句6
5.交通灯控制电路的程序和波形分析12
支干道
1设计一个十字路口交通信号灯的定时控制电路。
要求红、绿灯按一定的规律亮和灭,并在亮灯期间进行倒计时,并将运行时间用数码管显示出来。
2绿灯亮时,为该车道允许通行信号,红灯亮时,为该车道禁止通行信号。
要求主干道每次通行时间为99秒,支干道每次通行时间为30秒。
每次变换运行
车道前绿灯闪烁,持续时间为5秒。
即车道要由主干道转换为支干道时,主干道在通行时间只剩下5秒钟时,绿灯闪烁显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停止通行。
同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。
3对红、绿灯的运行时间要能比较方便的进行重新设置。
4添加左转灯的控制,可自行到实际十字路口观看规律并实现。
对器件进行在系统编程和实验验证。
5用Verilog语言对设计进行描述,设计一个测试方案,通过Muxplus对设计进行仿真验证。
并能够下载到实验板上调试成功。
二、交通灯控制系统的组成框图
交通信号灯控制原理图
交通信号灯控制系统框图
各状态的详细说明如下:
SO状态:
主干道绿灯亮,支干道红灯亮,此时若主干道有车等待左拐,而且主干道绿灯已亮足规定的时间间隔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。
交通灯状态图
Tempm==1
四、交通灯控制电路设计的难点与解决方法
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==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,numb);
/*lampm和lampb分别表示主干道和支干道的亮灯,mlampn和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)//手动设置主干道直行的时间
begin
if(!
en)
begin
if(mgreen[3:
0]==9&&mgreen[7:
4]<9)
beginmgreen[3:
0]<=0;mgreen[7:
4]<=mgreen[7:
4]+1;end
elseif(mgreen[3:
0]<9&&mgreen[7:
4]<=9)
beginmgreen[7:
4]<=mgreen[7:
4];mgreen[3:
0]<=mgreen[3:
0]+1;end
elseif(mgreen[3:
0]==9&&mgreen[7:
4]==9)
mgreen<=0;
end
end
always@(posedgeml)//手动设置主干道左拐的时间
begin
if(!
en)
begin
if(mleft[3:
0]==9&&mleft[7:
4]<9)
beginmleft[3:
0]<=0;mleft[7:
4]<=mleft[7:
4]+1;end
elseif(mleft[3:
0]<9&&mleft[7:
4]<=9)
beginmleft[7:
4]<=mleft[7:
4];mleft[3:
0]<=mleft[3:
0]+1;end
elseif(mleft[3:
0]==9&&mleft[7:
4]==9)
beginmleft<=0;end
end
end
always@(posedgebs)//手动设置支干道直行的时间
begin
if(!
en)
begin
if(bgreen[3:
0]==9&&bgreen[7:
4]<9)
beginbgreen[3:
0]<=0;bgreen[7:
4]<=bgreen[7:
4]+1;end
elseif(bgreen[3:
0]<9&&bgreen[7:
4]<=9)
beginbgreen[7:
4]<=bgreen[7:
4];bgreen[3:
0]<=bgreen[3:
0]+1;end
elseif(bgreen[3:
0]==9&&bgreen[7:
4]==9)
beginbgreen<=0;end
end
end
always@(posedgebl)//手动设置支干道左拐的时间
begin
if(!
en)
begin
if(bleft[3:
0]==9&&bleft[7:
4]<9)
beginbleft[3:
0]<=0;bleft[7:
4]<=bleft[7:
4]+1;end
elseif(bleft[3:
0]<9&&bleft[7:
4]<=9)
beginbleft[7:
4]<=bleft[7:
4];bleft[3:
0]<=bleft[3:
0]+1;end
elseif(bleft[3:
0]==9&&bleft[7:
4]==9)
beginbleft<=0;end
end
endalways@(posedgeclk)//该进程控制主干道的四种灯
begin
if(en)//使能信号为1时
begin
if(!
tempm)//对主干道计时总时间进行赋值
begintempm<=1;
case(countm)//控制亮灯的顺序
0:
begincountm<=1;numm<=mgreen;end
1:
begincountm<=2;numm<=mleft;end
2:
begin
countm<=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;end
elseif((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))begin
numm[3:
0]<=7;numm[7:
4]<=bgreen[7:
4]+bleft[7:
4]+1;end
elseif(bgreen[3:
0]==9&&bleft[3:
0]==9)begin
numm[3:
0]<=8;numm[7:
4]<=bgreen[7:
4]+bleft[7:
4]+1;end
elsebeginnumm[3:
0]<=bgreen[3:
0]+bleft[3:
0];
numm[7:
4]<=bgreen[7:
4]+bleft[7:
4];
end
end
default:
lampm<=3;
endcase
end
else//如果tempm=1
begin//倒计时
case(countm)
1:
begin//主干道的绿灯倒计时
if(numm>6)
begin
if(numm[3:
0]==0)
begin
numm[3:
0]<=9;numm[7:
4]<=numm[7:
4]-1;lampm[1]<=1;
end
else
beginnumm[3:
0]<=numm[3:
0]-1;lampm[1]<=1;end
end
elseif(numm==6||numm==4||numm==2)
beginlampm[1]<=1;numm<=numm-1;end
elseif(numm==5||numm==3)
beginlampm[1]<=0;numm<=numm-1;end
elseif(numm==1)
begintempm<=0;lampm[1]<=0;end
end
2:
begin//主干道左转灯倒计时
if(numm>6)
begin
if(numm[3:
0]==0)
begin
numm[7:
4]<=numm[7:
4]-1;numm[3:
0]<=9;lampm[2]<=1;
end
elsebeginnumm[3:
0]<=numm[3:
0]-1;lampm[2]<=1;end
end
elseif(numm==6||numm==4||numm==2)
beginlampm[2]<=1;numm<=numm-1;end
elseif(numm==5||numm==3)
beginlampm[2]<=0;numm<=numm-1;endelseif(numm==1)
beginlampm[2]<=0;tempm<=0;endend
0:
begin//主干道红灯倒计时
if(numm[3:
0]==0)
beginnumm[7:
4]<=numm[7:
4]-1;numm[3:
0]<=9;lampm[0]<=1;
end
elseif(numm==1)
beginlampm[0]<=0;tempm<=0;endelsebeginnumm[3:
0]<=numm[3:
0]-1;lampm[0]<=1;
end
end
endcase
end
if(!
tempb)//如果tempb=0
begin
tempb<=1;
case(countb)//控制亮灯的顺序
0:
begincountb<=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;end
elseif((mgreen[3:
0]==7&&mleft[3:
0]==9)||(mgreen[3:
0]==9&&mleft[3:
0]==7)||(mgreen[3:
0]==8&&mleft[3:
0]==8))
beginnumb[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))begin
numb[3:
0]<=7;numb[7:
4]<=mgreen[7:
4]+mleft[7:
4]+1;end
elseif(mgreen[3:
0]==9&&mleft[3:
0]==9)
begin
numb[3:
0]<=8;numb[7:
4]<=mgreen[7:
4]+mleft[7:
4]+1;
end
else
begin
numb[3:
0]<=mgreen[3:
0]+mleft[3:
0];
numb[7:
4]<=mgreen[7:
4]+mleft[7:
4];
end
end
1:
begincountb<=2;numb<=bgreen;end
2:
begincountb<=0;numb<=bleft;end
default:
lampb<=3;
endcase
end
else//如果tempm=1
begin//各个灯的倒计时
case(countb)
1:
begin//支干道红灯的倒计时
if(numb[3:
0]==0)
begin
numb[3:
0]<=9;numb[7:
4]<=numb[7:
4]-1;lampb[0]<=1;
end
elseif(numb==1)
beginlampb[0]<=0;tempb<=0;end
else
beginnumb[3:
0]<=numb[3:
0]-1;lampb[0]<=1;end
end
2:
begin//支干道的绿灯倒计时
if(numb>6)
begin
if(numb[3:
0]==0)
begin
numb[7:
4]<=numb[7:
4]-1;numb[3:
0]<=9;lampb[1]<=1;end
else
beginnumb[3:
0]<=numb[3:
0]-1;lampb[1]<=1;end
endelseif(numb==6||numb==4||numb==2)
beginnumb<=numb-1;lampb[1]<=1;endelseif(numb==5||numb==3)
beginlampb[1]<=0;numb<=numb-1;endelseif(numb==1)
beginlampb[1]<=0;tempb<=0;endend
0:
begin//支干道的左转灯倒计时if(numb>6)
beginif(numb[3:
0]==0)beginnumb[7:
4]<=numb[7:
4]-1;numb[3:
0]<=9;lampb[2]<=1;endelse
beginnumb[3:
0]<=numb[3:
0]-1;lampb[2]<=1;end
end
elseif(numb==6||numb==4||numb==2)
beginlampb[2]<=1;numb<=numb-1;end
elseif(numb==5||numb==3)
beginlampb[2]<=0;numb<=numb-1;endelseif(numb==1)
beginlampb[2]<=0;tempb<=0;end
end
endcase
end
end
if(!
en)//使能端信号为0时
beginlampm<=0;countm<=0;tempm<=0;lampb<=0;countb<=0;tempb<=0;end
end
endmodule
六、交通灯控制电路的程序和波形分析
1、主干道直行时间的设置程序为:
always@(posedgems)begin
if(!
en)
begin
if(mgreen[3:
0]==9&&mgreen[7:
4]<9)
beginmgreen[3:
0]<=0;mgreen[7:
4]<=mgreen[7:
4]+1;end
elseif(mgreen[3:
0]<9&&mgreen[7:
4]v=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;
end
end
2、主干道左拐时间设置的程序为:
always@(posedgeml)
begin
if(!
en)
begin
if(mleft[3:
0]==9&&mleft[7:
4]<9)
beginmleft[3:
0]<=0;mleft[7:
4]v=mleft[7:
4]+1;end
elseif(mleft[3:
0]<9&&mleft[7:
4]<=9)
beginmleft[7:
4]<=mleft[7:
4];mleft[3:
0]<=mleft[3:
0]+1;end
elseif(mleft[3:
0]==9&&mleft[7:
4]==9)
beginmleft<=0;end
end
end
其波形为:
3.0us3.Sus4.0usG.Ous
iII
在使能信号en==O时,若按键ml被按一下,则加一下数,直至使能信号为1或者ml键不再被按为止。
3、支干道直行时间设置的程序为:
always@(posedgebs)
begin
if(!
en)
begin
if(bgreen[3:
0]==9&&bgreen[7:
4]<9)
beginbgreen[3:
0]<=0;bgreen[7:
4]v=bgreen[7:
4]+1;end
elseif(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;end
end
end
其波形为:
在使能信号en==0时,若按键bs被按一下,则加一下数,直至使能信号为1或者bs键不再被按为止。
4、支干道左拐时间设置的程序为:
always@(posedgebl)
begin
if(!
en)
begin
if(bleft[3:
0]==9&&bleft[7:
4]<9)
beginbleft[3:
0]<=0;bleft[7:
4]<=bleft[7:
4]+1;end
elseif(bleft[3:
0]<9&&bleft[7:
4]<=9)
beginbleft[7:
4]<=bleft[7:
4];bleft[3:
0]<=bleft[3:
0]+1;end
elseif(bleft[3:
0]==9&&bleft[7:
4]==9)
beginbleft<=0;end
end
end
其波形为:
在使能信号en==O时,若按键bl被按一下,则加一下数,直至使能信号为1或
者bl键不再被按为止。
5、主干道直行倒计时和亮灯情况
程序为:
begin〃主干道的绿灯倒计时
if(numm>6)
begin
if(numm[3:
0]==0)
begin
numm[3:
0]<=9;numm[7:
4]<=numm[7:
4]-1;lampm[1]v=1;end
else
beginnumm[3:
0]<=numm[3:
0]-1;lampm[1]<=1;end
end
elseif(numm==6||numm==4||numm==2)
beginlampm[1]<=1;numm<=numm-1;endelseif(numm==5||numm==3)
beginlampm[1]v=0;numm<=numm-1;endelseif(numm==1)
begintempm<=0;lampm[1]<=0;endend波形为:
5Sus6OusE.5ijs7.5usEOus8.ius
111L111
1
」
iHk
1
9om
H13
Shirr
H!
-J