基于verilog-HDL数字系统设计-交通灯_第1页
基于verilog-HDL数字系统设计-交通灯_第2页
基于verilog-HDL数字系统设计-交通灯_第3页
基于verilog-HDL数字系统设计-交通灯_第4页
基于verilog-HDL数字系统设计-交通灯_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

交通灯控制器-------数字系统设计文档姓名:学号:一.课题简介:我在本课程中所选择的课题是用VerilogHDL实现的交通灯控制器。该交通灯控制器处在一个城乡结合处的十字路口,这个十字路口分为主干道和乡村公路,由于主干道的车流量远大于乡村公路的车流量,所以这个交通灯控制器不同于常见的交通灯控制器。这个交通控制器的功能有如下几点:1.当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。2.当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通行,让乡村公路通行。主干道最短通车时间为25s。3.当乡村公路和主干道都有车时,按主干道通车25s,乡村公路通车16s交替进行。4.不管主干道情况如何,乡村公路通车最长时间为16s。5.在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。6.用开关代替传感器作为检测车辆是否到来的信号。用红、绿、黄三种颜色的发光二极管作交通灯。要求显示时间,倒计时。二.控制框图和设计流程图:1.这个交通灯控制器由三个主要局部组成---核心控制器以及、译码器、分频器。2.流程图的内容同上面交通灯的功能,这里不再多做解释。三.各局部组件的具体实现和分析:1.核心控制器实现根本功能:〔1〕它的输入端有4个输入信号—C、RST、ST、CLK。C信号是一个检测信号,检测乡村公路是否有车,C=0示无车,这种情况下乡村公路一直亮红灯,主干道一直亮红灯,并且两个计数器都同步30秒重复计数,直到C=1即乡村公路有车是才跳变到其他情况。RST信号是复位信号,当RST=0时,这个交通灯控制器才能正常工作。当RST=1时,所有计数器都立刻赋初值,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。ST信号表示使能信号,当ST=1时,交通灯控制器才能正常工作。ST=0时,所有计数器都停止计数,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。CLK信号是时钟信号,通过分频器产生适宜的时钟信号驱动计数器实现实时计数。〔2〕它还有22个输出端,MR、MY、MG、CR、CY、CG分别表示主干道的红灯、黄灯、绿灯,乡村公路的红灯、黄灯、绿灯。在我的代码中这6组字母用于储存相应的亮灯时间,而用LAMPR和LAMPC表示实际的灯,LAMPR2、LAMPR1、LAMPR0分别表示主干道的红灯、绿灯、黄灯;LAMPC2、LAMPC1、LAMPC0分别表示乡村公路的红灯、绿灯、黄灯。还有COUNTR【7:0】、COUNTC【7:0】16个计数的输出端,通过译码器译码实现驱动7段数码管计数功能。〔3〕下列图是核心控制器的编译成功截图:从图中可以看出文件名为:下面的几张图为核心控制器的功能仿真图,分为不同情况下的仿真。上图中,可以看出C=1表示乡村公路没有车,RST=0并且ST=1说明交通灯控制器正常工作。由COUNTC和COUNTR中的两行计数可以看出,当计数从30减到01后又从30开始递减计数。LAMPC=4表示乡村公路亮红灯,LAMPR=2表示主干道亮绿灯。当乡村公路没有车时,乡村公路一直亮红灯,主干道一直亮绿灯,并且同步计数〔每30秒重复〕,符合要求。从上图可以看出RST=0并且ST=1说明交通灯控制器正常工作。C在15秒时发生了跳变,表示乡村公路由没车的状态变为了有车,在这15秒里,LAMPC=4,LAMPR=2表示乡村公路依然亮红灯,主干道依然亮绿灯,待本次计数到01后,由图可以看出,乡村公路的计数器从30开始计时,而主干道的计数器从25开始计数,表示乡村公路还要继续亮30秒的红灯,而主干道还要继续亮25秒的绿灯。这正是我的代码的最大的缺陷,会让司机多等一段时间〔这里是15秒,但可能是0—30秒内的任一一个时间段,假设司机在第25秒的时候来到路口,那么他就得多等25秒〕。由于我的代码计数模块的特殊性〔计数模块有四个,计数过程被复杂化〕,所以这个缺陷我一直没法修改。从上图可以看出,RST=0并且ST=1说明交通灯控制器正常工作。最开始,LAMPC=2表示乡村公路亮绿灯,LAMPR=4表示主干道亮红灯,在乡村公路计数器COUNTC=5、主干道计数器COUNTR=10时,检测信号C由1跳变到0,表示乡村公路由有车变为了无车。所以等乡村公路亮完绿灯经过黄灯缓冲后,由于乡村公路此时没有车,两个计数器都从30开始同步计数,并且LAMPC=4,LAMPR=2表示乡村公路一直亮红灯,主干道一直亮绿灯。从上图可以看出,在计数到20时,ST跳变为0,使得交通灯控制器瘫痪,计数器停止计数,保持19这个数字,同时乡村公路和主干道都亮红灯,禁止通行,防止意外发生。从上图可以看出,在计数到11时,RST跳变为1,使得交通灯控制器瘫痪,计数器停止计数,保持11这个数字,同时乡村公路和主干道都亮红灯,禁止通行,防止意外发生。在该图最后RST=0并且ST=1,保证交通灯控制器正常工作;C=1表示乡村公路有车,所以LAMPC=4,LAMPR=2,COUNTC=30,COUNTR=25表示控制器恢复正常后重新启动,由于乡村公路有车所以乡村公路亮30秒红灯,而主干道亮25秒绿灯。R1Y42确认98从上图可以看出,进行的时功能仿真,选择的仿真输入为:R1Y42确认98核心控制器模块的芯片图如下:该局部的实现代码如下:/*信号定义说明:CLK:同步时钟;C:为传感器作检测车辆是否到来的信号,C=1表示乡村公路有车RST:复位信号,RST=1时复位ST:使能信号,ST=1交通灯开始工作MR:主干道红灯时间MG:主干道绿灯时间MY:主干道黄灯时间CR:乡村公路红灯时间CG:乡村公路绿灯时间CY:乡村公路黄灯时间LAMPR:控制主干道的三盏灯的亮灭,其中LAMPR0~~LAMPR2分别控制红灯,绿灯,黄灯LAMPC:控制乡村公路的三盏灯的亮灭,其中LAMPC0~~LAMPC2分别控制红灯,绿灯,黄灯COUNTR:用于主干道灯的时间显示,8位,可驱动两个数码管COUNTC:用于乡村公路灯的时间显示,8位,可驱动两个数码管*/modulefuhaishan08009419(CLK,C,RST,ST,LAMPR,LAMPC,COUNTR,COUNTC);inputCLK,C,ST,RST;output[3:0]LAMPR,LAMPC;output[7:0]COUNTR,COUNTC;reg[7:0]MR,MG,MY,CR,CG,CY;reg[7:0]NUMR,NUMC;reg[3:0]LAMPR,LAMPC;reg[2:0]countr,countc;regtempr,tempc;regcountrr,countcc;regCOUNTCC,COUNTRR;always@(STorRST)beginif(!ST)begin//设置各种灯的计数器的初值,当有复位信号或者使能信号为0时执行MR<=8'b00100001;MG<=8'b00100101;MY<=8'b00000101;CR<=8'b00110000;CG<=8'b00010110;CY<=8'b00000101;endelseif(RST)beginMR<=8'b00100001;MG<=8'b00100101;MY<=8'b00000101;CR<=8'b00110000;CG<=8'b00010110;CY<=8'b00000101;endendassignCOUNTR=NUMR;assignCOUNTC=NUMC;always@(posedgeCLK)//控制主干道方向的三盏灯beginif(ST&C)//当使能信号为1且检测信号显示乡村公路有车时#beginif(!tempr)begintempr<=1;case(countr)//控制灯亮的顺序0:beginNUMR<=MG;LAMPR<=2;countr<=1;COUNTRR<=1;end1:beginNUMR<=MY;LAMPR<=1;countr<=2;end2:beginNUMR<=MR;LAMPR<=4;countr<=0;enddefault:LAMPR<=4;endcaseend//和正上方的begin相对应elsebegin//倒计时if(NUMR>1)if(NUMR[3:0]==0)beginNUMR[3:0]<=4'b1001;NUMR[7:4]<=NUMR[7:4]-1;endelsebeginNUMR[3:0]<=NUMR[3:0]-1;end//¥¥¥¥¥¥¥加了beginendif(NUMR==2)begintempr<=0;end//¥¥¥¥¥¥¥加了beginendendendelseif(ST&!C)//当使能信号为1且检测信号显示乡村公路没有车时beginif(!tempr)begintempr<=1;case(countrr)0:beginNUMR<=CR;LAMPR<=2;end1:beginNUMR<=CY;LAMPR<=1;enddefault:LAMPR<=2;endcaseend//和正上方的begin对应。elsebeginif(NUMR>1)if(NUMR[3:0]==0)beginNUMR[3:0]<=4'b1001;NUMR[7:4]<=NUMR[7:4]-1;endelseNUMR[3:0]<=NUMR[3:0]-1;if(NUMR==2)begintempr<=0;if(!C)begincountrr<=0;if(countr==1)begincountrr<=1;countr<=2;endendendendendelsebeginLAMPR<=4;countr<=0;tempr<=0;endendalways@(posedgeCLK)//控制乡村公路方向的三盏灯beginif(ST&C)begin//当使能信号ST=1且检测信号显示乡村公路有车时if(!tempc)begintempc<=1;case(countc)//控制灯亮的顺序0:beginNUMC<=CR;LAMPC<=4;countc<=1;end1:beginNUMC<=CG;LAMPC<=2;countc<=2;COUNTCC<=1;end//加了countcc2:beginNUMC<=CY;LAMPC<=1;countc<=0;enddefault:LAMPC<=4;endcaseendelsebegin//倒计时if(NUMC>1)if(NUMC[3:0]==0)beginNUMC[3:0]<=4'b1001;NUMC[7:4]<=NUMC[7:4]-1;endelsebeginNUMC[3:0]<=NUMC[3:0]-1;endif(NUMC==2)begintempc<=0;endendendelseif(ST&!C)begin//当使能信号ST=1且检测信号显示乡村公路没车时if(!tempc)begintempc<=1;case(countcc)0:beginNUMC<=CR;LAMPC<=4;end1:beginNUMC<=CY;LAMPC<=1;enddefault:LAMPC<=4;endcaseendelsebegin//倒计时if(NUMC>1)if(NUMC[3:0]==0)beginNUMC[3:0]<=4'b1001;NUMC[7:4]<=NUMC[7:4]-1;endelseNUMC[3:0]<=NUMC[3:0]-1;if(NUMC==2)begintempc<=0;if(!C)begincountcc<=0;if(countc==2)begincountcc<=1;countc<=0;endendendendendelsebeginLAMPC<=4;tempc<=0;countc<=0;endendendmodule这段代码的编写着实花了不少时间,而且功能还有缺陷,这段代码一共有四块计数模块,计数过程很多时候是需要两块计数模块共同来完成的,说一上面说的司时机多等一段时间的缺陷一直无法改变,就是由这4块繁杂的计数模块造成的。2.分频器的实现:由于试验箱上提供的时钟频率为2MHz,为了实现实时计数必须进行分频,得到频率为1Hz的CLK信号。图一中,clk为2MHz的输入信号,clk_11为1Hz的输出信号,reset为复位信号,当reset=0时,分频器正常工作。由图像可知输出信号clk_11一直等于0,这不表示分频不成功,而是因为要将2MHz的信号经过分频器变为1Hz的信号要进行1000000〔一百万〕分频,所以在下列图所能显示的时间范围内还不能显示超过半个周期的clk_11信号。为了证明我的分频器能够正常工作,我将程序代码中的分频数由1000000该为10,重新仿真的到下面的第二个图,从该图中就可以看出我的分频器能够正常工作。〔图一〕〔图二〕分频器的芯片图为:分频器的实现代码为:modulef(clk,clk_11,reset);inputclk,reset;outputclk_11;integerk;regclk_11;always@(posedgeclkorposedgereset)beginif(reset)begink<=0;clk_11<=0;endelsebeginif(k==1000000)beginclk_11<=clk_11+1;k<=0;endelsebegink<=k+1;endendendendmodule在编写分频器代码的时候,先做的的10分频的分频器,最初k的定义我定义为regk;输出一直为clk_11=0;思来想去也不知道是哪里出了问题,通过和室友的讨论,终于知道regk;这句定义中,k只有一位,不是0就上1,所以k不可能有其他的值。发现了问题,改变了k的定义,结果就正确了。3.译码器的实现:计数器计数是用的16进制,为了能够在7段数码管上显示,必须经过译码。译码器的仿真图如下:由于输入的选择不上太好,所以输出是重复的译码。〔图一〕〔图二〕译码器的芯片图为:实现代码为:moduleff(ina,inb,outa1,outa2,outb1,outb2);input[7:0]ina,inb;output[7:0]outa1,outa2,outb1,outb2;reg[7:0]routa1,routa2,routb1,routb2;reg[3:0]inah,inal,inbh,inbl;assignouta1=routa1;assignouta2=routa2;assignoutb1=routb1;assignoutb2=routb2;always@(ina)begininah[3:0]=ina[7:4];case(inah)0:beginrouta1<=8'b00000011;end1:beginrouta1<=8'b10011111;end 2:beginrouta1<=8'b00100101;end 3:beginrouta1<=8'b00001101;end 4:beginrouta1<=8'b10011001;end 5:beginrouta1<='b01001001;end 6:beginrouta1<=8'b01000001;end 7:beginrouta1<=8'b00011111;end 8:beginrouta1<=8'b00000001;end 9:beginrouta1<=8'b00001001;end default:beginrouta1<=8'b11111111;endendcaseendalways@(ina)begininal[3:0]=ina[3:0];case(inal)0:beginrouta2<=8'b00000011;end1:beginrouta2<=8'b10011111;end 2:beginrouta2<=8'b00100101;end 3:beginrouta2<=8'b00001101;end 4:beginrouta2<=8'b10011001;end 5:beginrouta2<=8'b01001001;end 6:beginrouta2<=8'b01000001;end 7:beginrouta2<=8'b00011111;end 8:beginrouta2<=8'b00000001;end 9:beginrouta2<=8'b00001001;end default:beginrouta2<=8'b11111111;endendcaseendalways@(inb)begininbh[3:0]=inb[7:4];case(inbh)0:beginroutb1<=8'b00000011;end1:beginroutb1<=8'b10011111;end 2:beginroutb1<=8'b00100101;end 3:beginroutb1<=8'b00001101;end 4:beginroutb1<=

温馨提示

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

评论

0/150

提交评论