《基于verilog-HDL数字系统设计--交通灯.docx》由会员分享,可在线阅读,更多相关《基于verilog-HDL数字系统设计--交通灯.docx(5页珍藏版)》请在三一办公上搜索。
1、交通灯控制器数字系统设计文档姓名:学号:一.课题简介:我在本课程中所选择的课题是用VerilogHDL实现的交通灯控制器。该交通灯控制器处在一个城乡结合处的十字路口,这个十字路口分为主干道和乡村公路,由于主干道的车流量远大于乡村公路的车流量,所以这个交通灯控制器不同于常见的交通灯控制器。这个交通控制器的功能有如下几点:1 .当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。2 .当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通行,让乡村公路通行。主干道最短通车时间为25s。3 .当乡村公路和主干道都有车时,按主干道通车25s,乡村公路通车16s交替进行。4 .不
2、管主干道情况如何,乡村公路通车最长时间为16s5 .在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。6 .用开关代替传感器作为检测车辆是否到来的信号。用红、绿、黄三种颜色的发光二极管作交通灯。要求显示时间,倒计时。二.控制抱图和设计流程图:1 .这个交通灯控制器由三个主要局部组成一核心控制器以及、译码器、分频器。2 .流程图的内容同上面交通灯的功能,这里不再多做解释。三.各局部组件的具体实现和分析:1.核心控制器实现根本功能:(1)它的输入端有4个输入信号C、RST、ST、CLKoC信号是一个检测信号,检测乡村公路是否有车,C=O示无车,这种情况下乡村公路一直亮红灯,主干道
3、一直亮红灯,并且两个计数器都同步30秒重复计数,直到C=I即乡村公路有车是才跳变到其他情况。RST信号是复位信号,当RST=O时,这个交通灯控制器才能正常工作。当RST=I时,所有计数器都立刻赋初值,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。ST信号表示使能信号,当ST=I时,交通灯控制器才能正常工作。ST=O时,所有计数器都停止计数,并且乡村公路和主干道都亮红灯,表示交通灯控制器出了故障,为防止意外发生,禁止通行。CLK信号是时钟信号,通过分频器产生适宜的时钟信号驱动计数器实现实时计数。(2)它还有22个输出端,MR、MY、MG、CR、CY、CG分别表
4、示主干道的红灯、黄灯、绿灯,乡村公路的红灯、黄灯、绿灯。在我的代码中这6组字母用于储存相应的亮灯时间,而用LAMPR和LAMPC表示实际的灯,LAMPR2、LAMPRkLAMPRo分别表示主干道的红灯、绿灯、黄灯:LAMPC2,LAMPCkLAMPCO分别表示乡村公路的红灯、绿灯、黄灯。还有CoUNTR【7:0】、COUNTC7:016个计数的输出端,通过译码器译码实现驱动7段数码管计数功能。(3)下列图是核心控制器的编译成功截图:从图中可以看出文件名为:下面的几张图为核心控制器的功能仿真图,分为不同情况下的仿真。上图中,可以看出C=I表示乡村公路没有车,RST=O并且ST=I说明交通灯控制器
5、正常工作。由CoUNTC和COUNTR中的两行计数可以看出,当计数从30减到01后又从30开始递减计数。LAMPC=4表示乡村公路亮红灯,LAMPR=2表示主干道亮绿灯。当乡村公路没有车时,乡村公路一直亮红灯,主干道一直亮绿灯,并且同步计数(每30秒重复),符合要求。从上图可以看出RST=O并且ST=I说明交通灯控制器正常工作。C在15秒时发生了跳变,表示乡村公路由没车的状态变为了有车,在这15秒里,LAMPC=4,LAMPR=2表示乡村公路依然亮红灯,主干道依然亮绿灯,待本次计数到Ol后,由图可以看出,乡村公路的计数器从30开始计时,而主干道的计数器从25开始计数,表示乡村公路还要继续亮30
6、秒的红灯,而主干道还要继续亮25秒的绿灯。这正是我的代码的最大的缺陷,会让司机多等一段时间(这里是15秒,但可能是0-30秒内的任一一个时间段,假设司机在第25秒的时候来到路口,那么他就得多等25秒)。由于我的代码计数模块的特殊性(计数模块有四个,计数过程被复杂化),所以这个缺陷我一直没法修改。从上图可以看出,RST=O并且ST=I说明交通灯控制器正常工作。最开始,LAMPC=2表示乡村公路亮绿灯,LAMPR=4表示主干道亮红灯,在乡村公路计数器COUNTC=5主干道计数器COUNTr=IO时,检测信号C由1跳变到0,表示乡村公路由有车变为了无车。所以等乡村公路亮完绿灯经过黄灯缓冲后,由于乡村
7、公路此时没有车,两个计数器都从30开始同步计数,并且LAMPC=4,LAMPR=2表示乡村公路一直亮红灯,主干道一直亮绿灯。从上图可以看出,在计数到20时,ST跳变为0,使得交通灯控制器瘫痪,计数器停止计数,保持19这个数字,同时乡村公路和主干道都亮红灯,禁止通行,防止意外发生。从上图可以看出,在计数到11时,RST跳变为1,使得交通灯控制器瘫痪,计数器停止计数,保持U这个数字,同时乡村公路和主干道都亮红灯,禁止通行,防止意外发生。在该图最后RST=O并且ST=I,保证交通灯控制器正常工作;C=I表示乡村公路有车,所以LAMPC=4,LAMPR=2,CoUNTC=30,CoUNTR=25表示控
8、制器恢复正常后重新启动,由于乡村公路有车所以乡村公路亮30秒红灯,而主干道亮25秒绿灯。从上图可以看出,进行的时功能仿真,选择的仿真输入为:核心控制器模块的芯片图如下:该局部的实现代码如下:产值号定义说明,CLKi同步时IhC为传M作检,车柄是否到来的信号,CE衰示多村公路有车RST.仅位信号,RST=I时直位STi使能信号.ST=I交通灯开0工作MR*主干道红灯时间MGt主干MT时间MY.主干道黄灯片间CR:多村公略红灯时间CG.学村公略量灯时间CY.乡村公踞黄灯叫1.AMPR:挂主干亮灭,其中IAMPRO-LANPR2分现控制红灯,雨,黄灯IAMPCi控制多HT的充灭.其中LAMpCl,A
9、MPC分刷控制砌,n.收C()LVR*用于Ktt.可里动两个数日*COUNTC*用于多指畔间Jl示,8位,可蟹动两个数码管*,11M)dukfuhaislian080(HM19(CLK.C,RSTT.LAMPR.LAMPC,COllNTR,COCNTCKinputCLKCSTfRST;output5:0LMPR,I.MPu(pu|7:0)COIlNTR,COUres|7:0)MRM(kMCK,(re(7:0NUMRUMC;reg(3:0LAMPR,LAMPC;re|2:0countr,countc;Etemprempc:regCViintECoungFvSCOUNTCC,CNTRR:alway
10、s(STorRST)begin(!ST)IKgln神各冷灯的计效的初值.当有直位信号网者使能信号为H时执行MR=8b(MI100001;MG-K,hOO!OOIOI;MYM,bOOO(三)l01;CR=8h00IKMM)0;CG8bOOOIOIIO:CY=8MHMW0101;endekei11RST)beinMR=rwwooooi;M(;=X,MM)100101;MY8bOOOOOIOI;CR=,M)0llMM)0;CG=SbU001011U;CYcinkmpr,拄灯亮的IlMFO:beginNUMRvMG;IAMPR-2;countr-1:COIINTRRI;end1:MginNlMR=MY
11、:LAMPR=lcountr=2:eid2:beginNLMR=MR;LAMPR=4;cmintr=O:enddefault:1.MPR4;dcseend和正上方的begin相对应elsebegin倒计时iANMMRX)iRM;MR|3:0|=0)beginNl:MK|3:0|V=4%1001:NuMRl7:4=NUMR|7:4pi:endekeheinNUMR3:0三NUMR3rOl;end/1117beinendInNlMR三=2)beginkmpr=4Htnl/*加了beginendendendelseinST&!C),当使俺信号为1且检信号工承乡村公Ie没有车时begini!tenpr
12、)beginIempr=1;Case(CoUntrr)0:heENUMR*CR;LAMPR三2end1:beginNUMR三CYLAMPRQLenddefault:LAMPRl)if(NCMR(3:0=0)M&inNUMR3:0MblOOI;NLMR(7:41NUMR7:4l;endelwNUMR3:0|aNUMR3:0l;W(NuMRH2begintempr=O;ift!C)begincountrr=0;i11countr=l)beincounlrrunlr=2:endendendendendelsebeginLAMPR=4:countr=O;tempr=0endendalways(PaSe
13、dReCl-K/,ItM多村公IB方向的三灯KginI(ST&C)xgin/当使能信号ST=I且检费信号示女村公1车时if(!tempcIbegintempcsl;CaMMCCUlHe)拄灯亮的IluFO:beginNUMC=CR;LAMPC=4;count-三1;end1:beginNUMC=CGLAMPC,=2;countc=2:CoUyTCC=1;Cnd/11了COUntCC2:heinNUMCVCY;LAMPCa|;countc三0;enddefault:LAMPC1)if(N(JMC3!)heinNUMcl3:0-4,bl(M)lN(JMC7z4v、l:MC7:4.1;enddebe
14、ginNUMC3:0=NUMC3:01;endiflNUMC=2)begintempc=0;endend血hegintempc!;Cftse(CounlCC)O:IMKinNVMC=CR:LAMPC=4:endI:WQnNUMC三CYJ.MPCal;enddefault:LAMPC1)河、IMCI3:0=0beginNLMC|3:0)=4bI(M)I;NtMC|7:4|=NUMC|7:4|l:endeM、UMC3:0Nl:MC|3:0-I;I11NlMC=三2lbegintempc=0;ifCC)bej*nmuntccV=U;Iftcounlc2heincountccIicountc三0:en
15、dendendendendelbeginLAMPC*4tempc*0:countc*O;endrndendmodule这段代码的编写着实花了不少时间,而且功能还有缺陷,这段代码一共有四块计数模块,计数过程很多时候是需要两块计数模块共同来完成的,说一上面说的司时机多等一段时间的缺陷一直无法改变,就是由这4块繁杂的计数模块造成的。2 .分频器的实现:由于试验箱上提供的时钟频率为2MHz,为了实现实时计数必须进行分频,得到频率为IHz的CLK信号。图一中,elk为2MHz的输入信号,clk_ll为IHZ的输出信号,reset为复位信号,当reset=O时,分频器正常工作。由图像可知输出信号ck_ll
16、一直等于0,这不表示分频不成功,而是因为要将2MHz的信号经过分频器变为IHZ的信号要进行1000000(一百万)分频,所以在下列图所能显示的时间范围内还不能显示超过半个周期的clk_ll信号。为了证明我的分频器能够正常工作,我将程序代码中的分频数由IOooooO该为10,重新仿真的到下面的第二个图,从该图中就可以看出我的分频器能够正常工作。(图一)图二分频器的芯片图为:分频器的实现代码为:nw)dul*flelk,dk_11,!iethinputelk.reset:outputclk-ll;Inlegerk;regclk_ll;always(PoKedgeelkorpmedgemwlbegi
17、nif(resetlbegink=O:clk_ll=O:endekeMQnifl(kal0000(M)heinclk_H三clk-ll+1;k*O;enlelsebeginkutal,*uta2.outbI,oUlb2);input|7:0|ina,inb:output|7:0|outal,outa2,nuth!,outh2;reg7:0nuUI,uta2,routbI,utb2;reg(3:0InahJnaUnbhUnbI;aw4nnutal*rtA;a6nouta2=roula2;assignoutbl-routbl:aignnuth2三rnutb2;alwaysUna)begininah
18、|3:0ina|7:4|;CaSedmh)Oibeginroutal=8M)000M)ll;endI:beginrnutaluUl=,bOOI(M)IOl;r#id3:beginroutal0010kend4:heginroutalX,bl001HMll:end5:beginnuU1=,b1001IM)1;end6:beginroutalWbO100000Lend7:heginroutalXhOuU1=8b00000001;end9:bcginroutal000n:enddefaultrheinroutalSb11ll1lll;endendeseendalwaysdraHheninal|3:0
19、=ina|3:0):*scinal)0:beinrula2=Rb0fi(MXM)ll;wdIrbeginrouta2=8bl0011111:end2zheinrnuta2uti*2=,MOOOlIOhend4:beginnuta2=rbl(M)l1(MH;endSrbeginrouta2010010kend6:beginrnuta20H;enuu2=8bOOOll1ll;en(l8:beginrouta2=Xb0(0000H:end9:hcginmuta2Xh0*00lMH;enidrfuull:beginroula2=8lbl1111Ilhendendcaseendalways(lnb)hc
20、giinhh|3:O|-inh|7:4;caelnbh)Orbeginroutbl=8b00000011;endl:heQurnuthluthl=8,b0010010i;end3:beginroutbl=S,NM)(M)IIOhend4:beginrnuthlBXblOOI100I;endS=TWglnmuthl=4b410lft0i;eikd6:beginroutblM,b01(KMMM)l!end7:beginrnuthlutbi=8bOOOOOOOIjend9:beginroutb1=8,NM)(M)1OO1:enddefaultrheinrouthlH8bll1ll111:endend
21、es*endalways(inb)begininbll3:0尸inb3:0:easelinbl)0:bclnrouth2=8,b(NMM)0Ml;endIrbeginroutb2Sbl0011111:end2:heginrnutl2*X,MM)lOOIOI;end3:beginroutb2utb2=8,b!00ll011zend5:heginmuth2utb2=8,bI(MXMM)I;end7:beginroutb2=S,b4M)011111:end8:heginmuth2-S,h4M)OOOOhend9:beginrtutb2=8,b0000100henddefault:beginroutb28,blllIlllkendendcaseendendmodule8.蒸片的封装和引片的分配U局部过程图如下:通过在试验箱上进行试验,各局部均能正常工作,试验根本符合要求。五.忌结:通过这个课程,我对VeriIOgHDL语言有了一个根本的了解,对QUatUS软件的应用有了初步的认识。对简单的EDA设计的流程也有所了解,提高了我的动手能力,并且锻炼了自己的耐心,收获颇多。我会把在这次课程设计中学到的东西应用到以后的学习生活中,最后感谢老师和同学在这次课程中给予我的帮助。