VerilogHDL的交通灯控制器设计.docx
《VerilogHDL的交通灯控制器设计.docx》由会员分享,可在线阅读,更多相关《VerilogHDL的交通灯控制器设计.docx(23页珍藏版)》请在冰豆网上搜索。
VerilogHDL的交通灯控制器设计
课程设计报告
2015-2016学年第2学期
课程设计名称:
电子综合设计EDA课程设计
院係):
电子信息学院
专业:
电子信息工程班级:
电子1313
:
XX学号:
1310034303xx
综合实验时间:
2016/7/11∙2016/7/15
指导教师:
提交时间:
2016/7/15
电机学院课程设计任务书
课程名称
电子综合设计EDA课程设计课程代码033117P1
课程设计
课题清单
1、数字式竞赛抢答器
2、自动售票机
3、乒乓球比赛游戏机
4、电子密码锁
5、出租车自动计费器
6、洗衣机控制器
7、交通信号灯控制器
8、电梯控制器
设计时间
2016年7月11日——2016年7月15日
一、课程设计任务汇总
设计任务:
交通信号灯控制器
功能要求:
丨、设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设萱红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外;
2、红、绿、黄发光二极管作信号灯,用传感器或逻辑开关作检测车辆是否到来的信号;
3、主干道处于常允许通行的状态,支干道有车来时才允许通行。
主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯;
4、主、支干道均有车时,两者交替允许通行,主干道每次放行时间A,支干道每次放行时间A,设立A、B计时显示电路;
5、在每次由绿灯亮到红灯亮的转换过程中,要亮黄灯C时间作为过渡,使行驶中的车辆有时间停到禁行线外,设立C计时显亦电路。
时间A>B>C
二、对课程设计成果的要求(包括课程设计报告、图纸、图表、实物等软硬件要求)
1.课程设计基本要求
课题分析、查阅资料、方案论证、方案实现、系统联调、撰写课程设计报告
2.成果要求
(1)系统方案
(2)电路RTL原理图
(3)VerilOg源程序和流程图(或状态机转移图)
⑷VeriIOg测试程序
(5)设计说明书(课程设计报告)
三、课程设计工作进度计划:
时间
安排容
星期一
下达任务
星期二
程序设计
星期三
程序调试
星期四
撰写报告
星期五
考核答辩
四、主要参考资料:
指导书:
《VeriIOg数字系统设计教程》夏宇闻编善航空航天大学
参考资料:
《EDA设计实验教程》艾明晶编著清华大学
第一章设计原理4
1」设计要求4
1∙2设计思路和原理4
1∙3实现方法4
第二章VeriIOgHDL程序设计6
21整体设计6
2.2具体设计7
第三章仿真测试7
3.1波形仿真7
第四章设计总结10
第一章设计原理
1∙1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s0每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。
能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
能实现特殊状态的功能显示。
⑴
1.2设计思路和原理
(1)主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。
(2)选择IHZ时钟脉冲作为系统时钟。
(3)45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。
(4)交通灯状态变化如表】及图1所示:
主干道(A)状态
主干道(A)交通灯及显示时间
支干道(B)交通灯及显示时间
支干道(B)状态
0
绿(45S)
•••
•••
红(50S)
0
1
黄(5s)
∙C∙
•••
2
红(30S)
绿(25s)
1
•••
∙O∙
黄(5s)
2
EmergeIICy
红(0)
M∙
红(0)
EmergenCy
*1交通灯状态图
检测到支路无行人和车辆
图1交通灯状态图
⑸交通灯设计输入信号4个:
CLK(时钟),EN(使能),EMERGENCY!
紧急),BCHECK(检
测);输出信号4个:
LAMPA(±干道信号灯),LAMPB(⅛干道信号灯),ACO∪NT(±干道计数器),BCOUNT(支干道计数器)。
交通灯控制原理如图2所示
图2交通灯原理图
1.3实现方法
本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,
实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
⑵
第二章VMOgHDL程序设计
21整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,
根据状态机的设计规,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
图2交通灯控制状态转化
说明:
该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态Ol后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
hold
图3交通灯控制系统结构图
其中rst为复位信号,CIk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2具体设计
根据整体设计要求,编写各个功能部分VerilogHDL程序,设置各输入输出变量说明如下
elk:
为计数时钟;
qclk:
为扫描显示时钟;
en:
使能信号,为1的话,则控制器开始工作;
rst:
复位信号,为1的话,控制及技术回到初始状态;
hold:
特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
IightI:
控制主干道方向四盏灯的亮灭;其中,Iightl[0]〜Iight[2],分别控制主干道方向的
绿灯、黄灯和红灯;
Iight2:
控制支干道方向四盏灯的亮灭;其中,∣ight2[0]〜Iight2[2],分别控制支干道方向的
绿灯、黄灯和红灯;
∩uml:
用于主干道方向灯的时间显示,8位,可驱动两个数码管;
∩um2:
用于支干道方向灯的时间显示,8位,可驱动两个数码管;counter:
用于数码管的译码输岀;
stl,st2:
数码管扫描信号0
详细设计步骤:
(1)确定4个输入信号与4个输出信号,具体见图2;
⑵将50MHZ时钟分频为IMHZ;
(3)设计红黄绿3号灯切换的时间及顺序;
(4)设计支路检测状态下的信号灯切换;
⑸设计紧急(EMERGENCY)状态下信号灯的切换;
⑹程序使用3αlwαys块⑴,详细代码如下:
总体程序见程序清单所示
第三章仿真测试
3.1波形仿真
在仿真软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设責仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
仿真截止时间:
IOOus;
时钟:
CIklus,qclkθJus
3.1.1正常工作时波形仿真图
Name
ι±→r
M5∑8ST3US
10.OO^Ceil[f/Ke-IUmCh
CO'
OlO
JU≡l≡≡M
≡n≡π≡ιu≡u≡
Jlfi≡UUUUUl
∣3u&
:
:
「:
:
:
:
/.=:
:
:
:
:
.J:
:
:
:
W(KXW>ακ
ΞX=X×XX;Q:
X:
©XXX;Q:
X••:
:
:
:
》:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
⅛∏tl'⅛hold
:
:
:
:
":
:
:
":
:
:
;「:
:
:
’.,C.:
:
:
XXwXOiO
:
工∙
GOl
►⅜!
HUflftI(7∙O)
OOOQOoli
►Rjnum2[7-O)
OooOOoii
►RjIigh以ZOl
001
►1M昭阿B
IQO
>屯counterfoil)
Oliliii
l¼m
1
Ife«2
0
Iien
1
'⅜dk
1
'⅛qclk
0
图4没有紧急借况时主干道和支干道的信号灯的显示状态
DOUXZ-HIOfiAUigcl
i<∙M<∖√∙∙⅝^÷<∙∖⅛⅛
∙√.∙√..‰√.z>!
√.>∙.j.∙.z√
SB.ΓQβ2C7“
90
100
Mmn≡j
JI
OwOeCxακ>
>Renuml∏<η
>Renum2(7<η
►宅∣≠tU2<η
►傀I沪020
>COUntCft6®
⅛Stl
⅞rt2
ODOOOolI
OOIOOIOO
OlO
OOl
IOlIOlI
图5没有紧急借况时主干道和文干道的Ar号灯的显示状态
>¾∣10.0Qqf^∣(∈
GSS0S3S55535≡0∣
∖<-∖-,i∙>∖
M
浓洱⅞⅞⅞⅞弹:
洽的:
世:
¾¾:
*Mj≡β^^∙a**∕j∣^∙>■:
・.・∏∙∙*
gjgjg⅛
>α
JliInJUInnIlr
OXX
n≡ιwmnπm
咤nυmip0]Renum2P.O)畔IighW20】电IighUg熨COUrltef(6XJ)⅜$111⅛$12
l⅛Clkl⅛qclk1⅛rst1⅛rstl1⅛hdd
∞ιooιooCoIOOOOO100OoiIoiIoiI
图6没有紧急惜况时主干道和支干道的信号灯的显示状态
€8.3743S7
VaIUG
W
∣60
:
:
:
:
:
:
;:
:
:
:
:
:
:
;:
:
:
0:
0
OO
IOC
:
:
:
:
:
:
:
:
:
:
l⅛hold
InlUmnnn
:
:
:
:
:
:
Y:
:
:
:
:
:
?
:
:
:
:
:
:
>:
:
:
:
:
:
:
:
:
:
:
:
QgXCCC*:
X>沁X<>沁號CWCC<>XCCCCCCCC曲沖XCeC«林力沁;
¢¢1-
:
:
:
:
:
:
<:
:
:
=:
:
;4:
=?
:
:
:
:
:
:
=?
:
:
=:
:
:
:
/
冃日tflG八?
It也tC々]
□►>z
LaeOUSJJJIi
PO
>⅝!
Huml(T-O)
OOOOOIOi
>IMnum2(7.OOOOOOIO
►电耶叩®
OiO
►R!
Iz2.0】
OLQ
>⅜∣CoUnterte^
IolIOlI
1¼StI
0
Ifa$12
0
1⅛“
1
1⅛CIk
0
l⅛
1
1⅛曲
0
Name
图7没有紧急At况时主干道和支干道的值号灯的显示状态
图8没有紧急情况时主干道和文干道的信号灯的显示状态
].∣∙∣χ∣
IVaIUC
>IM∏uml(7X>)
QOLIOLOI
►Renum2(7Λ)
OOIIOlQi
►RehghtU2:
0j
100
►Rg∣∙ght2(2X>)
100
►Reα>uMef[60]
IIOlIoI
Io
⅛5t2
1
l⅛en
1
⅛dkIiAdk
1
0
l⅛rst
0
1⅛Γitl
0
I4^hold
1
匕二亠〜I
土亠丄一亠∙∣
2严…1
2.613982
l--2l∖I-X-I-X-I-I-I-I
“亠,…I
∞H0101
j
XXXXXXXX
OolIOIOIJ
XXXb?
0
1'Γ
:
Co
m
.0:
C
•:
:
)
»"-0
iιιιιι-
ZXXXXX
OCa
;:
*m>二
n∞∞o∞d
\———————
"""""""
ΓLΓLΓL
ΓLΠ
⅛TΓLΓL∏2Γ⅛⅛LΠJinJ
-T-Lf
~1」
T^J~1
-J-LJLJI
Γ
ZZ_I
■-1
≡nπιuιπ≡r
^UuVUifUiW
RrUUlnf
mi
JmnnJmwUWoI≡πmuιrt
—
IgF!
G>>∑ImhaX
图9有紧急If况时主干道和支干道的信号灯的显示状态
波形仿真主要完成了控制与计数以及数码管显示的波形图。
numlznum2分别表示主干道和支干道的倒计时,num!
=OOIOOOOO主干道计时20秒nUm2二OOIoOlOl支干道计时25秒;Sl用来表示主干道最短通车时间是否已到,到了sl=l;S2用来表示支干道最长通车时间是否已到,到了s2二1,控制输出量从高位到低位分别表示红,黄,绿为IightI=O01,Iight2=100,COUnter用于时钟计数。
hold为紧急情况时主干道和支干道的信号灯为红灯。
图6顶层文件图
结果分析:
仿真结果符合设计要求,交通灯有规律的变化,显示倒计时;在检测支路无车辆和紧急情况下,交通灯可以做岀相应调整。
设计中使用FSM(三段式),此方式描述方法虽然代码结构复杂了一些,但是使FSM做到了同步寄存器输出,有利于实现交通灯控制⑵。
第四章设计总结
这次课程设计,通过对交通等控制器设计,解决了之前课上存在的一些困惑,就是对测资料.・・・
试程序的编写,调试,对于测试程序有了很大的提升。
在程序编写和调试过程中从图书馆借阅了很多相关程序,并对原理和算法进行理解,收获很大。
对于课题,首先进行了单元模块的设计,将每一个单元模块设计完成后再经行仿真,仿真成功后就可以进行顶层文件的编写了,在顶层文件的编写过程中遇到了一些问题,特别是各模块之间的连接,以及信号的定义,总是有错误。
有的时候信号的定义容易出现混淆,在反复的修改过后,顶层文件终于能够编译成功了。
在波形仿真的过程中,同样遇到了困难,有的时候会出现仿真时间过长的问题,这个时候应该修改系统时钟的频率。
在设计的过程中还应该多联系下实际情况,要了解实际情况下交通信号灯的工作情况,才能更好的完成此次的课程设计。
这次的课程设计使我巩固了以前学习到的知识,还使我掌握了以前没有掌握的知识,同时锻炼了自己的能力。
通过这次课程设计,并进一步熟练了对XilinXISE软件的操作。
通过与同学探讨和请教老师,终于把问题都解决了,并加深了对交通灯原理和设计思路的了解。
同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。
最后参照每个模块把输入和输出引脚设定,运用我们所学的VeriIOg语言进行编程。
总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程,排错调试,相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
程序清单
modulesy(enχlkzqclk∕strstlzhold,numb∩∪m2jightljight2zco∪ntecstbst2);inpute∩,clkZqCIkJStZhOIdZrStl;
OUtPUtStbSt2;
OUtPUt[7:
0]∩umLnum2;
OUtPUt[6:
0]COUnter;
OUtPUt[2:
0]IightlJight2;
regtimLtim2ZStLSt2;
reg[l:
0]StateIZState2zste;
reg[2:
0]IightIJight2;
reg[3:
0]num;
reg[6:
0]counter;
reg[7:
0]nur∩lznum2;
reg[7:
0]red1zred2zgreen1,green2,yellowlZyeIIOW2;
always(en)
if(!
e∩)
begin〃设責计数初值
greenl<=8,b00110101;
redl<=8lb∞l∞101;
yellowl<=8,b0∞00101;
gree∩2<=8,b00100101;
red2<=8lb∞l10101;
yellow2v二8b00000101;
end
always(POSedgeCIk)
begin
if(rst)〃复位与特殊情况控制
begin
Iightl<=3,b001;
nUml<=greenl;
end
elseif(hold)
begin
Iightl<=3,b100;
numl<=greenl;
end
elseif(e∩)
begin〃使能有效开始控制计数
If(Itiml)//开始控制
begin〃主干道交通灯点亮控制
tir∩l<=l;
CaSe(StateI)
2*b00:
beginnum1<=greenl;IightlV二3'b001;Statel<=2'b01;end2,b01:
beginnum1<=yellowl;lightl<=3,b010;StateI<=2,bl1;end2,b11:
beginnum1<=red1;Iight1<=3,b100;State1<=2,b10;end2,b10:
beginnum1<=yellow1;light1<=3,b010;State1<=2,b00^nddefault:
IightI<=3,bl00;
endcase
end
else
begin〃倒数计时
if(numl>0)
if(numl[3:
0]==0)
begin
numl[3^]<=4,bl001;
nUmI[7:
4]V二numl[7:
4卜1;
end
elsenur∩l[3:
0]<=numl[3:
0)-1;
if(nUmI==I)timl<=0;
end
end
else
begin
IightI<=3,b010;
numl=2,b00;
timl<=0;
end
end
always(POSedgeCIk)
begin
if(rst)〃复位与特殊情况控制
begin
Iight2<=3,bl∞;
num2<=red2;
end
elseif(hold)
begin
Iight2<=3,bl∞;
n∪r∩2<=red2;
end
elseif(e∩)
begin
if(!
tim2)
begin
tim2<=l;
CaSe(StateI)
2'b00:
beginnum2<=red2;Iight2<=3,b100;State2<=2,b01冷nd
2,b0kbeginnum2<=yellowlJight2<=3lb010;State2<=2,b]1Jend
2,bll:
beginnum2<=green2;Iight2v二3'b001;StCIte2v二2'bl0;end
2,b10:
begin∩um2<=yellow2;Iight2<=3,b010;State2<=2*b00;enddefault:
Iight2<=3'b100;
endcase
end
else
begin//倒数计时
if(num2>0)
if(num2[3:
0]==0)
begin
num2[3:
0]v二4'bl001;
num2[7:
4]<=num2[7:
4]-l;
end
elsenum2[3:
0]<=num2[3:
0]-l;
if(num2==l)tim2<=0;
end
end
else
begin
tim2<=0;
State2<=2,b00;
Iight2<=3,b010;
end
end
always(POSedgeqclk)
begin〃数码管扫描
if(rstl)
begin
stl=0;
st2=0;
end
else
begin
casθ({st2rstl})
ZbOOibeginnum<=numl[3r0]Xst2zstl}<=2,b01;end2lb0Iibeginnum<=num1[7:
4]:
{st2rst1}<=2,b10;end2*bl0:
beginnum<=num2[3:
0];{st2zstl}<=2,bl1:
end2,bll:
beginnum<=num2[7:
4];{st2zstl}<=2*b00;endendcase
end
end
always(POSedgeqclk)
begin〃数码管译码显示
case(num)
4,b0000:
COUnter<=7,b0111111:
//0
4,b0∞l:
COUnter<=7,b∞00110;/∕1
4,b0010:
COUnter<=7,bIOl1011:
//2
4,b0011:
COUnter<=7,bIOOl111:
//3
4,b0100:
COUnter<=7,bll00110;/∕4
4,b0101:
COUnter<=7,b1101101:
//5
4,b0110:
COUnter<=7,bll11101:
//6
4,b0111:
COUnter<=7,b∞00111;//7
4,bl000:
COUnter<=7,bll11111:
//8
4,bl∞l:
COUnter<=7,b1101111:
//9default:
COUnter<=7,b0111111:
//0endcase
end
endmodule
测试程序:
modulesyy;
//InPUtS
regen;
regelk;
regqclk;
regrst;
regrstl;
reghold;
//OUtPUtS
Wire[7:
0]nUm1;
Wire[7:
0]∩um2;
Wire[2:
0]Iightl;
Wire[2:
0]Iight2;
Wire[6:
0]counter;
Wirestl;
Wirest2;
//InStantiatetheUnitUnderTeSt(UUT)
SyUUt(
.en(en),
.clk(clk)z.qclk(qclk)z
.rst(rst)z.rstl(rstl)z
.hold(hold),
.numl(∩uml)z
.nUm2(num2)z
.1ightl(Iightl),
.1ight2(light2),
・Counter(Counter)r
.stl(stl)