基于Verilog的交通灯控制器的设计.docx

上传人:b****6 文档编号:13398548 上传时间:2023-06-13 格式:DOCX 页数:26 大小:479.74KB
下载 相关 举报
基于Verilog的交通灯控制器的设计.docx_第1页
第1页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第2页
第2页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第3页
第3页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第4页
第4页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第5页
第5页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第6页
第6页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第7页
第7页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第8页
第8页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第9页
第9页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第10页
第10页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第11页
第11页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第12页
第12页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第13页
第13页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第14页
第14页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第15页
第15页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第16页
第16页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第17页
第17页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第18页
第18页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第19页
第19页 / 共26页
基于Verilog的交通灯控制器的设计.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于Verilog的交通灯控制器的设计.docx

《基于Verilog的交通灯控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于Verilog的交通灯控制器的设计.docx(26页珍藏版)》请在冰点文库上搜索。

基于Verilog的交通灯控制器的设计.docx

基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2