交通灯控制器设计Word格式文档下载.docx
《交通灯控制器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《交通灯控制器设计Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
Verilog_HDLFPGA交通灯控制器硬件描述语言
1、简介
课程设计的目的和内容
用VerilogHDL语言设计实现一个交通灯控制器电路:
十字路口A方向和B方向各设红、黄、绿和左拐四盏灯,两个方向各种灯亮的时间能够进行设置和修改,此外,假设A方向是主干路,车流量大,因此A方向通行的时间应比B方向长;
四盏灯按合理的顺序亮灭,并能将灯亮的时间以倒计时的形式显示出来。
每个方向四种灯依次按如下顺序点亮,并不断循环:
绿灯—黄灯—左拐灯—黄灯—红灯,并且每个方向红灯亮的时间应该与另一方向绿、黄、左拐、黄灯亮的时间相等。
黄灯所起的作用是用来在绿灯和左拐灯后进行缓冲。
在本课程设计中,着重培养学生的如下能力:
熟悉EDA技术概况。
培养综合应用数字电子技术、EDA设计工具、HDL语言等各领域知识的能力。
提高设计能力和实际操作能力,使学生能够独立完成具有一定难度的数字电子系统的设计,并锻炼动手实践能力。
Verilog语言简介
VerilogHDL是一种硬件描述语言(HDL:
HardwareDescriptionLanguage),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
VerilogHDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。
前者由GatewayDesignAutomation公司(该公司于1989年被Cadence公司收购)开发。
两种HDL均为IEEE标准。
VerilogHDL的设计流程
1)文本编辑:
用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。
通常VerilogHDL文件保存为.v文件。
2)功能仿真:
将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只有在布线完成之后,才进行时序仿真)。
3)逻辑综合:
将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式。
逻辑综合软件会生成.edf(EDIF)的EDA工业标准文件。
(最好不用MAX+PLUSII进行综合,因为只支持VHDL/VerilogHDL的子集)
4)布局布线:
将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLD/FPGA内。
5)时序仿真:
需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序也叫后仿真。
2、总体设计
黄灯所起的作用是用来在绿灯和左拐灯后进行缓冲,以提醒行人及驾驶员该方向上要禁行了;
信号灯变换次序为:
A主干道每次放行40秒,亮5秒黄灯让行驶中的车辆有时间停到禁行线外,左拐放行15秒,亮5秒黄灯;
支干道放行30秒,亮5秒黄灯,左拐放行15秒,亮5秒黄灯......,各计时电路位倒计时显示。
图1设计流程图
根据系统的功能要求,可分为四个部分来实现,分别是定时模块,主控电路,译码驱动电路和扫描显示几部分。
分频部分是把外部提供的1Hz进行分频得到系统工作需要的工作脉冲,显示部分包括两个内容,一个是主干道红绿灯显示,另一个是支干道红绿灯显示。
然后将红绿灯显示时间以BCD码形式显示出来,显示模块将其译码轮流扫描显示4具有四种信号灯的交通灯控制器设计如图2
交通信号灯控制器系统工作流程
(1)主干道放行亮绿灯40秒,支干道红灯显示65秒;
(2)主干道绿灯转黄灯5秒,支干道红灯显示25秒
(3)主干道黄灯转左拐15秒,支干道红灯显示20秒;
(4)主干道左拐转红灯55秒,支干道绿灯显示30秒;
(5)主干道红灯显示25秒,支干道绿灯转黄灯5秒;
(6)主干道红灯显示20秒,支干道黄灯转左拐15秒;
(7)主干道亮红灯5秒,支干道左拐转黄灯5秒;
(8)依次循环跳到主干道,红绿灯重新计时
图2设计电路图
道红绿灯显示;
输出部分为七段译码显示和位选码MS,数码管显示的是交通信号灯转换时间。
3、实验方法
仿真平台简介
Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。
它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
主要特点:
RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;
单内核VHDL和Verilog混合仿真;
源代码模版和助手,项目管理;
集成了性能分析、波形比较、代码覆盖、数据流ChaseX、SignalSpy、虚拟对象VirtualObject、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;
C和Tcl/Tk接口,C调试;
对SystemC的直接支持,和HDL任意混合;
支持SystemVerilog的设计功能;
对系统级描述语言的最全面支持,SystemVerilog,SystemC,PSL;
ASICSignoff。
可以单独或同时进行行为(behavioral)、RTL级、和门级(gate-level)的代码。
仿真步骤
1)点开file,选择new,点击project,来创建一个新工程。
2)在弹出的对话框中输入工程名和库名称,这里直接采用默认库work,输入的工程名为“testtraffic”,输入完毕后点击ok完成。
3)在弹出的对话框中选中AddExistingFile按钮,找到文件存储的路径“modelsim”点击ok。
同时两个程序文件处会有两个问号。
4)右键点击空白处,选择其中的Compile选项,会出现一系列的编译方式。
最常用的是前两个,即编译选中文件CompileSelected。
同时两个程序文件处的问号变为对号。
5)选中Simulate,选择第二个startSimulation。
在弹出的对话框中选择work里的testtraffic并且去掉左下角的对号,点击ok。
6)右键点击testtraffic模块,选中Add,然后AddtoWave。
这时会出现一个新窗口:
wave-default。
这里就是观察信号变化的区域,在仿真没有运行时,输出的信号均为空,快捷键中有Run-All按钮进行仿真。
4、仿真步骤
图3仿真结果示意图
如图3所示,我们看出看出主干道红灯亮的时间等于支路绿灯,黄灯,左转灯,黄灯亮的时间之和,同时支路红灯亮的时间等于主干道绿灯,黄灯,左转灯,黄灯亮的时间之和。
本设计中设定A方向红、绿、黄、左拐灯亮的时间分别为55秒、40秒、5秒和15秒,B方向红、绿、黄、左拐灯亮的时间分别为:
65秒、30秒、5秒和15秒,该系统满足我们的设计需求。
5、结论
通过本次课设,是我从一个verilogHDL编程语言的菜鸟逐渐升级为一个感兴趣的初学者.体验到了细心对一个编程者的重要性,和程序的规范性对于程序的重要性在verilog语言中,我们必须注意其与C语言的异同,比如格式和变量定义,还有模块的调用,和时钟信号的应用。
还有,verilogHDL设计语言是一门很好的硬件描述语言,可以直白的描述实际的电路,实际的系统模型,易懂而且易于实现,我觉得在以后多加练习,可以对以后的学习和工作带来莫大的帮助。
通过做熊老师的课程设计培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
如果说大学的学习就像是在充实自己,那么课设的意义就是让所学的东西充分的发挥出来,我希望大学的制度也可以从大一就开始抓起,这才是对我们学生的一次提升。
在实战中自由发挥,只有困难才能让我们更加强大。
参考文献
1、《CPLD/FPGA应用系统设计与(基础篇)》作者:
亿特科技人民邮电出版社出
版日期:
2005年7月书号:
ISBN7-/
2、林明权.VHDL数字控制系统设计范例(第一版)[M]北京:
电子工业出版社;
3、杨晓慧.电子技术EDA实践教程(第一版)[M],北京:
国防工业出版社;
附录
moduleaa(clk,rst,LAMPA,ledcom,data_out);
output[7:
0]LAMPA,ledcom,data_out;
inputclk,rst;
reg[7:
0]numa,ledcom;
regtempa,i;
reg[3:
0]data_in;
0]counta;
0]ared,ayellow,agreen;
0]LAMPA,data_out;
reg[24:
0]c,k,c1;
regclk1s;
regclk_100;
reg[19:
0]cnt2;
always@(posedgeclk)
begin
if(c==)
c<
=0;
clk1s=~clk1s;
end
else
=c+1;
cnt2<
=cnt2+1;
if(cnt2==100000)
clk_100=~clk_100;
always@(posedgeclk1sornegedgerst)//该模块控制东西方向的三种灯
if(!
rst)
LAMPA<
=8'
b00001001;
ayellow<
b00000110;
agreen<
b00000111;
tempa)
tempa<
=1;
if(counta==0)
numa<
=agreen;
b00100001;
//南北方向通绿灯亮东西方向红灯亮
counta<
=counta+1;
if(counta==1)
=ayellow;
b00010001;
//南北方向黄灯亮东西方向红灯亮
if(counta==2)
=ayellow;
b00000001;
//南北方向黄灯灭东西方向红灯亮
if(counta==3)
if(counta==4)
b00001100;
//南北方向红灯亮东西方向绿灯亮
if(counta==5)
b00001010;
//南北方向红灯亮东西方向黄灯亮
if(counta==6)
b00001000;
//南北方向红灯亮东西方向黄灯灭
if(counta==7)
begin//倒计时模块
if(numa)
if(numa==0)
if(numa[7:
4]==4'
b0000)
numa[3:
0]<
=4'
b1111;
numa[7:
4]<
=numa[7:
4]-
4'
b0001;
=numa[3:
0]-
//////////////////////////////////////////////////////////////////////
always@(posedgeclk_100ornegedgerst)
i<
ledcom<
b;
data_out<
=~(1<
<
i);
if(i==0)
data_in<
=numa[7:
4];
=i+1'
b1;
if(i==1)
0];
=1'
b0;
case(data_in)
b0000:
data_out<
=8'
//0
b0001:
//1
b0010:
//2
b0011:
//3
b0100:
//4
b0101:
//5
b0110:
//6
b0111:
//7
b1000:
//8
b1001:
//9
//4'
b1111:
default:
endcase
endmodule