1130334303沈海亮基于VerilogHDL的数字交通灯_第1页
1130334303沈海亮基于VerilogHDL的数字交通灯_第2页
1130334303沈海亮基于VerilogHDL的数字交通灯_第3页
1130334303沈海亮基于VerilogHDL的数字交通灯_第4页
1130334303沈海亮基于VerilogHDL的数字交通灯_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国计量学院现代科技学院课程设计报告(系统设计与仿真实践)课题名称:基于VerilogHDL的数字交通灯设计系(部):信息工程系专业班级:通信113姓名:沈海亮学号:1130334303指导教师:李世忠 2014年06月06日 目录一、绪论EDA技术介绍1`使用的软件简单介绍1二、课题的内容及要求2.1技术要求12.2设计任务要求12.3实现方法1三、实现原理及整机原理框图3.1课题的实现原理23.3整机原理框图4四、设计原理4.1设计代码84.2交通灯控制电路设计的难点与解决方法12五、电路仿真及测试5.1总体仿真125.2设计步骤及过程12六、总结14第第十七页一.绪论:基于Verilog-HDL的交通灯控制器的设计摘要:现代城市在日常运行控制中,越来越多的使用红绿灯对交通进行指挥和管理。而一套完整的交通灯控制系统通常要实现自动控制和手动控制去实现其红绿灯的转换。基于FPGA设计的交通灯控制系统电路简单、可靠性好。本设计利用VerilogHDL语言、采用层次化混合输入方式,可控制4个路口的红、黄、绿、左转四盏信号灯,让其按特定的规律进行变化。在QUARTUSⅡ下对系统进行了综合与仿真。仿真结果表明系统可实现十字路口红绿灯及左转弯控制和倒计时显示,并能够自动控制交通灯转变。关键词:交通灯自动控制;VerilogHDL;Max+plusⅡMax+plusⅡ开发系统简介:Max+plusⅡ是Altera公司上一代的PLD开发软件,提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一。Max+plusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程。目前Altera已经停止开发MaxplusII,而转向QuartusII软件平台。交通灯控制器设计第二章设计原理2.1设计要求设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示,2.2设计思路和原理本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:图1.交通灯点亮时间控制说明2.3实现方法本次采用文本编辑法,即利用VerilogHDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。实现原理及整机原理框图3.1整体设计根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:图2.交通灯控制状态转化说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:图3.交通灯控制系统结构图其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。3.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:数码管扫描信号。输入输出及中间变量设置如下:moduletraffic(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:0]counter;reg[7:0]num1,num2;reg[7:0]red1,red2,green1,green2,yellow1,yellow2;二极管点亮控制该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下:1)主干道方向always@(posedgeclk)beginif(rst)//复位与特殊情况控制beginlight1<=3'b001;num1<=green1;endelseif(hold)beginlight1<=3'b100;num1<=green1;endelseif(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;endcaseend2)支干道方向always@(posedgeclk)beginif(rst)//复位与特殊情况控制beginlight2<=3'b100;num2<=red2;endelseif(hold)beginlight2<=3'b100;num2<=red2;endelseif(en)beginif(!tim2)begintim2<=1;case(state1)2'b00:beginnum2<=red2;light2<=3'b100;state2<=2'b01;end2'b01:beginnum2<=yellow1;light2<=3'b010;state2<=2'b11;end2'b11:beginnum2<=green2;light2<=3'b001;state2<=2'b10;end2'b10:beginnum2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:light2<=3'b100;endcaseend倒数计时该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:always@(posedgeclk)beginelsebegin//倒数计时if(num1>0)if(num1[3:0]==0)beginnum1[3:0]<=4'b1001;num1[7:4]<=num1[7:4]-1;endelsenum1[3:0]<=num1[3:0]-1;if(num1==1)tim1<=0;endendelsebeginlight1<=3'b010;num1=2'b00;tim1<=0;endend数码管的译码及扫描显示该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示:always@(posedgeqclk)begin//数码管扫描if(rst1)beginst1=0;st2=0;endelsebegincase({st2,st1})2'b00:beginnum<=num1[3:0];{st2,st1}<=2'b01;end2'b01:beginnum<=num1[7:4];{st2,st1}<=2'b10;end2'b10:beginnum<=num2[3:0];{st2,st1}<=2'b11;end2'b11:beginnum<=num2[7:4];{st2,st1}<=2'b00;endendcaseendendalways@(posedgeqclk)begin//数码管译码显示case(num)4'b0000:counter<=7'b0111111;//04'b0001:counter<=7'b0000110;//14'b0010:counter<=7'b1011011;//24'b0011:counter<=7'b1001111;//34'b0100:counter<=7'b1100110;//44'b0101:counter<=7'b1101101;//54'b0110:counter<=7'b1111101;//64'b0111:counter<=7'b0000111;//74'b1000:counter<=7'b1111111;//84'b1001:counter<=7'b1101111;//9default:counter<=7'b0111111;//0endcaseendendmodule总体程序见程序清单所示

第四章设计原理4.1设计代码moduletraffic(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: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;endalways@(posedgeclk)beginif(rst)//复位与特殊情况控制beginlight1<=3'b001;num1<=green1;endelseif(hold)beginlight1<=3'b100;num1<=green1;endelseif(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;endcaseendelsebegin//倒数计时if(num1>0)if(num1[3:0]==0)beginnum1[3:0]<=4'b1001;num1[7:4]<=num1[7:4]-1;endelsenum1[3:0]<=num1[3:0]-1;if(num1==1)tim1<=0;endendelsebeginlight1<=3'b010;num1=2'b00;tim1<=0;endendalways@(posedgeclk)beginif(rst)//复位与特殊情况控制beginlight2<=3'b100;num2<=red2;endelseif(hold)beginlight2<=3'b100;num2<=red2;endelseif(en)beginif(!tim2)begintim2<=1;case(state1)2'b00:beginnum2<=red2;light2<=3'b100;state2<=2'b01;end2'b01:beginnum2<=yellow1;light2<=3'b010;state2<=2'b11;end2'b11:beginnum2<=green2;light2<=3'b001;state2<=2'b10;end2'b10:beginnum2<=yellow2;light2<=3'b010;state2<=2'b00;enddefault:light2<=3'b100;endcaseendelsebegin//倒数计时if(num2>0)if(num2[3:0]==0)beginnum2[3:0]<=4'b1001;num2[7:4]<=num2[7:4]-1;endelsenum2[3:0]<=num2[3:0]-1;if(num2==1)tim2<=0;endendelsebegintim2<=0;state2<=2'b00;light2<=3'b010;endendalways@(posedgeqclk)begin//数码管扫描if(rst1)beginst1=0;st2=0;endelsebegincase({st2,st1})2'b00:beginnum<=num1[3:0];{st2,st1}<=2'b01;end2'b01:beginnum<=num1[7:4];{st2,st1}<=2'b10;end2'b10:beginnum<=num2[3:0];{st2,st1}<=2'b11;end2'b11:beginnum<=num2[7:4];{st2,st1}<=2'b00;endendcaseendendalways@(posedgeqclk)begin//数码管译码显示case(num)4'b0000:counter<=7'b0111111;//04'b0001:counter<=7'b0000110;//14'b0010:counter<=7'b1011011;//24'b0011:counter<=7'b1001111;//34'b0100:counter<=7'b1100110;//44'b0101:counter<=7'b1101101;//54'b0110:counter<=7'b1111101;//64'b0111:counter<=7'b0000111;//74'b1000:counter<=7'b1111111;//84'b1001:counter<=7'b1101111;//9default:counter<=7'b0111111;//0endcaseendendmodule4.2交通灯控制电路设计的难点与解决方法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,故会溢出,得不到正确的结果。我采用的是把这些情况单独列出来进行解决。第五章电路仿真及测试5.1波形仿真在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示:仿真截止时间:100us;时钟:clk1us,qclk0.1us1.正常工作时波形仿真图图4.正常工作时波形仿真图图形说明波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论