VerilogHDL的交通灯控制器设计Word格式.docx
《VerilogHDL的交通灯控制器设计Word格式.docx》由会员分享,可在线阅读,更多相关《VerilogHDL的交通灯控制器设计Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
主干道亮绿灯时,支干道亮红灯;
支干道亮绿灯时,主干道亮红灯;
4、主、支干道均有车时,两者交替允许通行,主干道每次放行时间A,支干道每次放行时间A,设立A、B计时显示电路;
5、在每次由绿灯亮到红灯亮的转换过程中,要亮黄灯C时间作为过渡,使行驶中的车辆有时间停到禁行线外,设立C计时显示电路。
时间A>
B>
C
二、对课程设计成果的要求(包括课程设计报告、图纸、图表、实物等软硬件要求)
1.课程设计基本要求
课题分析、查阅资料、方案论证、方案实现、系统联调、撰写课程设计报告
2.成果要求
(1)系统方案
(2)电路RTL原理图
(3)Verilog源程序和流程图(或状态机转移图)
(4)Verilog测试程序
(5)设计说明书(课程设计报告)
三、课程设计工作进度计划:
时间
安排容
星期一
下达任务
星期二
程序设计
星期三
程序调试
星期四
撰写报告
星期五
考核答辩
四、主要参考资料:
指导书:
《Verilog数字系统设计教程》夏宇闻编著航空航天大学
参考资料:
《EDA设计实验教程》艾明晶编著清华大学
第一章设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;
反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。
能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
能实现特殊状态的功能显示。
[1]
1.2设计思路和原理
(1)主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。
(2)选择1HZ时钟脉冲作为系统时钟。
(3)45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。
(4)交通灯状态变化如表1及图1所示:
表1交通灯状态图
图1交通灯状态图
(5)交通灯设计输入信号4个:
CLK(时钟),EN(使能),EMERGENCY(紧急),BCHECK(检测);
输出信号4个:
LAMPA(主干道信号灯),LAMPB(支干道信号灯),ACOUNT(主干道计数器),BCOUNT(支干道计数器)。
交通灯控制原理如图2所示。
图2交通灯原理图
1.3实现方法
本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。
设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
[2]
第二章VerilogHDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
图2交通灯控制状态转化
说明:
该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。
进入10状态两路黄灯亮起。
结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
图3交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2具体设计
根据整体设计要求,编写各个功能部分VerilogHDL程序,设置各输入输出变量说明如下
clk:
为计数时钟;
qclk:
为扫描显示时钟;
en:
使能信号,为1的话,则控制器开始工作;
rst:
复位信号,为1的话,控制及技术回到初始状态;
hoid:
特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1:
控制主干道方向四盏灯的亮灭;
其中,light1[0]~light[2],分别控制主干道方向的
绿灯、黄灯和红灯;
light2:
控制支干道方向四盏灯的亮灭;
其中,light2[0]~light2[2],分别控制支干道方向的
num1:
用于主干道方向灯的时间显示,8位,可驱动两个数码管;
num2:
用于支干道方向灯的时间显示,8位,可驱动两个数码管;
counter:
用于数码管的译码输出;
st1,st2:
数码管扫描信号。
详细设计步骤:
(1)确定4个输入信号与4个输出信号,具体见图2;
(2)将50MHZ时钟分频为1MHZ;
(3)设计红黄绿3号灯切换的时间及顺序;
(4)设计支路检测状态下的信号灯切换;
(5)设计紧急(EMERGENCY)状态下信号灯的切换;
(6)程序使用3always块[1],详细代码如下:
总体程序见程序清单所示
第三章仿真测试
3.1波形仿真
在仿真软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。
设置仿真时间,时钟周期,输入输出端口,进行波形仿真。
具体仿真波形图及说明如下所示:
仿真截止时间:
100us;
时钟:
clk1us,qclk0.1us
3.1.1正常工作时波形仿真图
图4没有紧急情况时主干道和支干道的信号灯的显示状态
图5没有紧急情况时主干道和支干道的信号灯的显示状态
图6没有紧急情况时主干道和支干道的信号灯的显示状态
图7没有紧急情况时主干道和支干道的信号灯的显示状态
图8没有紧急情况时主干道和支干道的信号灯的显示状态
图9有紧急情况时主干道和支干道的信号灯的显示状态
波形仿真主要完成了控制与计数以及数码管显示的波形图。
num1,num2分别表示主干道和支干道的倒计时,num1=00100000主干道计时20秒num2=00100101支干道计时25秒;
s1用来表示主干道最短通车时间是否已到,到了s1=1;
s2用来表示支干道最长通车时间是否已到,到了s2=1,控制输出量从高位到低位分别表示红,黄,绿为light1=001,light2=100,counter用于时钟计数。
hold为紧急情况时主干道和支干道的信号灯为红灯。
图6顶层文件图
结果分析:
仿真结果符合设计要求,交通灯有规律的变化,显示倒计时;
在检测支路无车辆和紧急情况下,交通灯可以做出相应调整。
设计中使用FSM(三段式),此方式描述方法虽然代码结构复杂了一些,但是使FSM做到了同步寄存器输出,有利于实现交通灯控制[2]。
第四章设计总结
这次课程设计,通过对交通等控制器设计,解决了之前课上存在的一些困惑,就是对测试程序的编写,调试,对于测试程序有了很大的提升。
在程序编写和调试过程中从图书馆借阅了很多相关程序,并对原理和算法进行理解,收获很大。
对于课题,首先进行了单元模块的设计,将每一个单元模块设计完成后再经行仿真,仿真成功后就可以进行顶层文件的编写了,在顶层文件的编写过程中遇到了一些问题,特别是各模块之间的连接,以及信号的定义,总是有错误。
有的时候信号的定义容易出现混淆,在反复的修改过后,顶层文件终于能够编译成功了。
在波形仿真的过程中,同样遇到了困难,有的时候会出现仿真时间过长的问题,这个时候应该修改系统时钟的频率。
在设计的过程中还应该多联系下实际情况,要了解实际情况下交通信号灯的工作情况,才能更好的完成此次的课程设计。
这次的课程设计使我巩固了以前学习到的知识,还使我掌握了以前没有掌握的知识,同时锻炼了自己的能力。
通过这次课程设计,并进一步熟练了对XilinxISE软件的操作。
通过与同学探讨和请教老师,终于把问题都解决了,并加深了对交通灯原理和设计思路的了解。
同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。
最后参照每个模块把输入和输出引脚设定,运用我们所学的Verilog语言进行编程。
总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程,排错调试,相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
程序清单
modulesy(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);
inputen,clk,qclk,rst,hold,rst1;
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:
reg[7:
0]red1,red2,green1,green2,yellow1,yellow2;
always(en)
if(!
en)
begin//设置计数初值
green1<
=8'
b00110101;
red1<
b00100101;
yellow1<
b00000101;
green2<
red2<
yellow2<
end
always(posedgeclk)
begin
if(rst)//复位与特殊情况控制
begin
light1<
=3'
b001;
num1<
=green1;
end
elseif(hold)
b100;
elseif(en)
begin//使能有效开始控制计数
if(!
tim1)//开始控制
begin//主干道交通灯点亮控制
tim1<
=1;
case(state1)
2'
b00:
beginnum1<
light1<
state1<
=2'
b01;
b01:
=yellow1;
b010;
b11;
b11:
=red1;
b10;
b10:
b00;
default:
endcase
else
begin//倒数计时
if(num1>
0)
if(num1[3:
0]==0)
num1[3:
0]<
=4'
b1001;
num1[7:
4]<
=num1[7:
4]-1;
elsenum1[3:
=num1[3:
0]-1;
if(num1==1)tim1<
=0;
end
begin
num1=2'
light2<
num2<
=red2;
tim2)
tim2<
beginnum2<
light2<
state2<
=green2;
=yellow2;
if(num2>
if(num2[3:
num2[3:
num2[7:
=num2[7:
elsenum2[3:
=num2[3:
if(num2==1)tim2<
else
state2<
always(posedgeqclk)
begin//数码管扫描
if(rst1)
st1=0;
st2=0;
case({st2,st1})
beginnum<
0];
{st2,st1}<
4];
begin//数码管译码显示
case(num)
4'
b0000:
counter<
=7'
b0111111;
//0
b0001:
b0000110;
//1
b0010:
b1011011;
//2
b0011:
b1001111;
//3
b0100:
b1100110;
//4
b0101:
b1101101;
//5
b0110:
b1111101;
//6
b0111:
b0000111;
//7
b1000:
b1111111;
//8
b1001:
b1101111;
//9
default:
endcase
endmodule
测试程序:
modulesyy;
//Inputs
regen;
regclk;
regqclk;
regrst;
regrst1;
reghold;
//Outputs
wire[7:
0]num1;
0]num2;
wire[2:
0]light1;
0]light2;
wire[6:
0]counter;
wirest1;
wirest2;
//InstantiatetheUnitUnderTest(UUT)
syuut(
.en(en),
.clk(clk),
.qclk(qclk),
.rst(rst),
.rst1(rst1),
.hold(hold),
.num1(num1),
.num2(num2),
.light1(light1),
.light2(light2),
.counter(counter),
.st1(st1),
.st2(st2)
);
initialbegin
//InitializeInputs
en=0;
clk=0;
qclk=0;
rst=0;
rst1=0;
hold=0;
#500en=0;
#500en=1;
hold=0;
#500rst=1;
rst1=1;
#500rst=0;
rst1=0;
always#500clk=~clk;
always#50qclk=~qclk;
参考资料
[1]《Verilog数字系统设计教程》夏宇闻编著航空航天大学
[2]《EDA设计实验教程》艾明晶编著清华大学
小组分工
VerilogHDL程序编写
周立
仿真测试
徐婷
PPT答辩
王小晗
报告撰写
邱越
课程设计评语及成绩评定记录
指导教师评语:
学习态度:
□积极■较积极
□一般□较差
现场设计操作:
□准确■基本正确
□误差较大□不准确
答辩:
□准确、有条理■基本正确
□一般□不清晰、没有条理
报告、PPT等书写:
□规、清晰、全面■较规、较清晰、较全面
□一般□不符合要求
设计完成质量:
□出色■非常好
□一般□较差
综合评定分数:
分
指导教师签名
2016年7月15日