verilogHDL交通灯控制电路.docx
《verilogHDL交通灯控制电路.docx》由会员分享,可在线阅读,更多相关《verilogHDL交通灯控制电路.docx(19页珍藏版)》请在冰豆网上搜索。
verilogHDL交通灯控制电路
青岛农业大学
理学与信息科学学院
电子设计自动化及专用集成电路课程设计
报告
设计题目用状态机设计交通灯控制器
学生专业班级通信工程2008级1班
学生姓名(学号)孙鹏飞(20082715)
扌旨导教师刘金梅
完成时间2011-9-9
实习(设计)地点工程楼405
2011年9月9日
、课程设计目的和任务
课程设计目的:
本次课程设计是在学生学习完数字电路、模拟电路、电子设计自动化的相关课程之后进行的。
通过对数字集成电路或模拟集成电路的模拟与仿真等,熟练使用相关软件设计具有较强功能的电路,提高实际动手,为将来设
计大规模集成电路打下基础。
课程设计任务:
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦
然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5so能进行特殊状
态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED灯显示倒计时,并
且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
二、分析与设计
1、设计任务分析
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。
循环往复的直行这个过程。
其过程如下图所示:
主干道方向
支干道方向
图1•交通灯点亮时间控制说明
2、设计方案论证
本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
图2.交通灯控制状态转化
说明:
该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程
序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
图3•交通灯控制系统结构图
其中resets复位信号,elk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
3、详细设计
根据整体设计要求,编写各个功能部分VerilogHDL程序,设置各输入输出变量说明如下
clk:
为计数时钟;
qclk:
为扫描显示时钟;
en:
使能信号,为1的话,则控制器开始工作;
reset:
复位信号,为1的话,控制及技术回到初始状态;
hold:
特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1:
控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制
主干道方向的
绿灯、黄灯和红灯;
light2:
控制支干道方向四盏灯的亮灭;其中,light2[0]~light2[2],分别控
制支干道方向的
绿灯、黄灯和红灯;
num1:
用于主干道方向灯的时间显示,8位,可驱动两个数码管;
num2:
用于支干道方向灯的时间显示,8位,可驱动两个数码管;
counter:
用于数码管的译码输出;
stl,st2:
数码管扫描信号。
输入输出及中间变量设置如下:
moduletraffic(en,clk,qclk,reset,reset1,hold,num1,num2,light1,light2,counter,st1,st2);
inputen,clk,qclk,reset,hold,reset1;
outputst1,st2;
output[7:
0]num1,num2;
output[6:
0]counter;
output[2:
0]light1,light2;
regtim1,tim2,st1,st2;
reg[1:
0]state1,state2,ste;
reg[2:
0]light1,light2;
reg[3:
0]num;
reg[6:
0]counter;
reg[7:
0]num1,num2;
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
3.1二极管点亮控制该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。
此外,当检测到特殊情况(hold=‘)1'发生时,无条件点亮
红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。
因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体
程序如下:
1)主干道方向always@(posedgeclk)begin
if(reset)//复位与特殊情况控制
beginlight1<=3'b001;num1<=green1;
end
elseif(hold)beginlight1<=3'b100;num1<=green1;
end
elseif(en)
begin//使能有效开始控制计数
if(!
tim1)//
begin//主干道交通灯点亮控制tim1<=1;
case(state1)
2'b00:
beginnum1<=green1;light1<=3'b001;state1<=2'b01;end2'b01:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b11;end2'b11:
beginnum1<=red1;light1<=3'b100;state1<=2'b10;end2'b10:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b00;enddefault:
light1<=3'b100;
endcase
end
2)支干道方向always@(posedgeclk)beginif(reset)//复位与特殊情况控制beginlight2<=3'b100;
num2<=red2;
endelseif(hold)beginlight2<=3'b100;
num2<=red2;
end
elseif(en)
begin
if(!
tim2)
begin
tim2<=1;
case(state1)
2'b00:
beginnum2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:
beginnum2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:
beginnum2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:
beginnum2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:
light2<=3'b100;
endcase
end
3.2倒数计时该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。
本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。
因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always@(posedgeclk)
begin
else
begin//倒数计时
if(num1>0)
if(num1[3:
0]==0)
begin
num1[3:
0]<=4'b1001;
num1[7:
4]<=num1[7:
4]-1;
end
elsenum1[3:
0]<=num1[3:
0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
3.3数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。
译码的时钟频率要低,为Hz级。
扫描的时钟频率要高,最低不
得小于人眼分辨频率50Hz,具体程序如下所示:
always@(posedgeqclk)
begin//数码管扫描
if(reset1)
begin
st1=0;
st2=0;
end
else
begin
case({st2,st1})
2'b00:
beginnum<=num1[3:
0];{st2,st1}<=2'b01;end
2'b01:
beginnum<=num1[7:
4];{st2,st1}<=2'b10;end
2'b10:
beginnum<=num2[3:
0];{st2,st1}<=2'b11;end
2'b11:
beginnum<=num2[7:
4];{st2,st1}<=2'b00;end
endcase
end
end
always@(posedgeqclk)
begin//数码管译码显示
case(num)
4'b0000:
counter<=7'b0111111;//0
4'b0001:
counter<=7'b0000110;//1
4'b0010:
counter<=7'b1011011;//2
4'b0011:
counter<=7'b1001111;//3
4'b0100:
counter<=7'b1100110;//4
4'b0101:
counter<=7'b1101101;//5
4'b0110:
counter<=7'b1111101;//6
4'b0111:
counter<=7'b0000111;//7
4'b1000:
counter<=7'b1111111;//8
4'b1001:
counter<=7'b1101111;〃9default:
counter<=7'b0111111;〃0endcase
end
endmodule
'Tc
4、源代码清单
(按照设计的功能模块,提供适量主要代码并注释,1页-1.5页)
moduletraffic(en,clk,qclk,reset,reset1,hold,num1,num2,light1,light2,counter,st1,st2);
inputen,clk,qclk,reset,hold,reset1;
outputst1,st2;
output[7:
0]num1,num2;output[6:
0]counter;
output[2:
0]light1,light2;regtim1,tim2,st1,st2;reg[1:
0]state1,state2,ste;
reg[2:
0]light1,light2;reg[3:
0]num;reg[6:
0]counter;reg[7:
0]num1,num2;
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
always@(en)
if(!
en)begin//设置计数初值green1<=8'b00110101;
red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;
red2<=8'b00110101;yellow2<=8'b00000101;
end
always@(posedgeclk)
begin
if(reset)//复位与特殊情况控制
beginlight1<=3'b001;num1<=green1;
end
elseif(hold)
beginlight1<=3'b100;num1<=green1;
end
elseif(en)
begin//使能有效开始控制计数if(!
tim1)//开始控制
begin//主干道交通灯点亮控制tim1<=1;
case(state1)
2'b00:
beginnum1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:
beginnum1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:
beginnum1<=yellow1;light1<=3'b010;state1<=2'b00;enddefault:
light1<=3'b100;
endcase
end
else
begin//倒数计时
if(num1>0)if(num1[3:
0]==0)begin
num1[3:
0]<=4'b1001;num1[7:
4]<=num1[7:
4]-1;
end
elsenum1[3:
0]<=num1[3:
0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always@(posedgeclk)
begin
if(reset)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
elseif(hold)
begin
light2<=3'b100;
num2<=red2;
end
elseif(en)
begin
if(!
tim2)
begin
tim2<=1;
case(state1)
2'b00:
beginnum2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:
beginnum2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:
beginnum2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:
beginnum2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:
light2<=3'b100;
endcase
end
else
begin//倒数计时
if(num2>0)
if(num2[3:
0]==0)
begin
num2[3:
0]<=4'b1001;
num2[7:
4]<=num2[7:
4]-1;
end
elsenum2[3:
0]<=num2[3:
0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always@(posedgeqclk)
begin//数码管扫描
if(reset1)
begin
st1=0;
st2=0;
end
else
begin
case({st2,st1})
2'b00:
beginnum<=num1[3:
0];{st2,st1}<=2'b01;end
2'b01:
beginnum<=num1[7:
4];{st2,st1}<=2'b10;end
2'b10:
beginnum<=num2[3:
0];{st2,st1}<=2'b11;end
2'b11:
beginnum<=num2[7:
4];{st2,st1}<=2'b00;endendcase
end
end
always@(posedgeqclk)
begin//数码管译码显示
case(num)
4'b0000:
counter<=7'b0111111;//0
4'b0001:
counter<=7'b0000110;//1
4'b0010:
counter<=7'b1011011;//2
4'b0011:
counter<=7'b1001111;//3
4'b0100:
counter<=7'b1100110;//4
4'b0101:
counter<=7'b1101101;//5
4'b0110:
counter<=7'b1111101;//6
4'b0111:
counter<=7'b0000111;//7
4'b1000:
counter<=7'b1111111;//8
4'b1001:
counter<=7'b1101111;//9
default:
counter<=7'b0111111;//0
endcase
end
endmodule
三、系统实施
3.1波形仿真
在QuartursH软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设置仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
仿真截止时间:
100us;
时钟:
elk1us,qclk0.1us
1.正常工作时波形仿真图
15u30.u55.^40^5m4SO9u
juuuuirmnjuwLjmnKnnjmnmuinjuirLnnnnjLrLnnnrLnnnrLruwLnjuinnj
nin
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。
en为低电品时,计
数器置初值,高电平时开始正常控制与计数。
控制发光二极管首次输出为
“light仁001light2=100,”表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从00110101”开始递减计数,计数至“00000000”,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101开始计数递减,计数至”00000000”进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。
Counter根据num1,num2变化随时钟上升沿输出译码后的数据。
由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light1与Iight2被强制置位为”100”表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当reset输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即
light仁001,light2=100,计数器numl和num2从00110101”开始递减计数。
四、总结与体会
在设计中采用VerilogHDL语言设计交通灯控制系统,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过VerilogHDL语言的综合工具进行相应硬件电路生成,具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。
然而从理论到实践,我在做课程设计的几天里,使我对有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的实际操作才能更好地学习它,但是学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知解得不够深刻,掌握得不够牢固,在边编学程序的过程中我几乎是重新复习课本上的知识。
通过这次课程设计,我再一次的体验到了细心对一个编程者的重要性,和程序的规范性对于程序的重要性,这些平时我们忽略的问题,其实有时候关乎着我们编程的成功率;还有,verilogHDL设计语言是一门很好的硬件描述语言,可以直白的描述实际的电路,实际的系统模型。
这次的课程设计就是对我们的一次考核,也可以说是一次考验,在平时做题目比较简单,而这次课程设计综合考核了我们的学习结果。
课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
五、参考书目
[1]张明.VerilogHDL实用教程[M].电子科技大学出版社,1999
[2]郭梯云.移动通信[M].西安电子科技大学出版社,1995
[3]夏宇闻.复杂数字电路与系统的VerilogHD设计技术.北京航空航天大学出版社,1998
[4]康华光.电子技术基础(数字部分)[M].高等教育出版社,1988
课程设计成绩评定表
学生姓名
孙鹏飞
专业班级
通信工程2008级12班
设计题目
用状态机设计交通灯控制器
指导教师评语及意见:
指导教师签字:
指导教师评阅成绩:
注:
此表装订在课程设计之后