课程设计报告课程名称:FPGA现代数字系统设计设计名称:交通信号灯控制器姓名:***学号:2010000379专业:通信指导教师:***起止日期:2010.12.25-2011.1.92课程设计任务书设计名称:设计要求:(1)设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。(2)红、绿、黄发光二极管作信号灯,用传感器或逻辑开关作检测车辆是否到来的信号。(3)主干道处于常允许通行的状态,支干道有车来时才允许通行。主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。(4)主、支干道均有车时,两者交替允许通行,主干道每次放行45s,支干道每次放行25s,设立45s、25s计时、显示电路。(5)在每次由绿灯亮到红灯亮的转换过程中,要亮5s黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5s计时、显示电路。(6)发生紧急事件,如救护车、警车、抢险车通过,可以手动控制四个方向的红灯全亮。3一、设计目的和意义通过应用Verilog语言在QuartusⅡ软件平台上设计交通信号灯控制器,并借助硬件来测试仿真效果。通过课程设计,熟悉硬件编程语言的应用,特别是有限状态机的灵活使用,为以后进一步的学习实践打下良好的基础。二、设计原理(1)主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。(2)选择1HZ时钟脉冲作为系统时钟。(3)45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。(4)交通灯状态变化如表1及图1所示:表1:交通灯状态图2黄(5s)1绿(25s)红(30s)2红(0)黄(5s)绿(45s)红(0)红(50s)EmergencyEmergency100支干道(B)状态支干道(B)交通灯及显示时间主干道(A)交通灯及显示时间主干道(A)状态2黄(5s)1绿(25s)红(30s)2红(0)黄(5s)绿(45s)红(0)红(50s)EmergencyEmergency100支干道(B)状态支干道(B)交通灯及显示时间主干道(A)交通灯及显示时间主干道(A)状态状态2状态1状态0Emergency检测到支路无行人和车辆状态2状态1状态0Emergency检测到支路无行人和车辆状态2状态1状态0Emergency检测到支路无行人和车辆图1:交通灯状态图(5)交通灯设计输入信号4个:CLK(时钟),EN(使能),EMERGENCY(紧急),BCHECK(检测);输出信号4个:LAMPA(主干道信号灯),LAMPB(支干道信号灯),ACOUNT(主干道计数器),4BCOUNT(支干道计数器)。交通灯控制原理如图2所示。图2:交通灯原理图三、详细设计步骤(1)确定4个输入信号与4个输出信号,具体见图2;(2)将50MHZ时钟分频为1MHZ;(3)设计红黄绿3中信号灯切换的时间及顺序;(4)设计支路检测状态下的信号灯切换;(5)设计紧急(EMERGENCY)状态下信号灯的切换;(6)程序使用3always块[1],详细代码如下:moduletraffic_control(CLK,EN,EMERGENCY,BCHECK,LAMPA,LAMPB,ACOUNT,BCOUNT);output[2:0]ACOUNT,BCOUNT;output[2:0]LAMPA,LAMPB;regclk1;inputCLK,EN,EMERGENCY,BCHECK;reg[2:0]numa,numb;regtempa,tempb;reg[25:0]count;reg[2:0]counta,countb;reg[2:0]ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;reg[2:0]LAMPA,LAMPB;/*信号定义与说明:CLK:为同步时钟;EN:使能信号,为1的话,则控制器开始工作;LAMPA:控制A方向四盏灯的亮灭;其中,LAMPA0~LAMPA2,分别控制A方向的绿灯、黄灯和红灯;LAMPB:控制B方向四盏灯的亮灭;其中,LAMPB0~LAMPB2,分别控制B方向的绿灯、黄灯和红灯;ACOUNT:用于A方向灯的时间显示,8位BCOUNT:用于B方向灯的时间显示,8位*/always@(posedgeCLK)//将50MHZ时钟分频为1MHZbeginif(count==49999999)begin5count=0;clk1=~clk1;endelsecount=count+1;endassignACOUNT=numa;assignBCOUNT=numb;always@(EN)if(!EN)beginared=6;ayellow=2;agreen=4;bred=6;byellow=2;bgreen=4;endalways@(posedgeclk1)//该进程控制A方向beginif(EMERGENCY)//EMERGENCY高电平有效,手动控制beginnuma=0;LAMPA=4;counta=0;tempa=0;endelseif(EN)beginif(!tempa)//亮灯begintempa=1;case(counta)//控制亮灯的顺序0:beginnuma=agreen;LAMPA=1;counta=1;end1:beginnuma=ayellow;LAMPA=2;counta=2;end2:beginnuma=ared;LAMPA=4;counta=0;enddefault:LAMPA=4;endcaseendelse//倒计时beginif(numa2)numa=numa-1;if(numa==2)beginnuma=1;tempa=0;if((BCHECK)&&(counta==2))counta=0;end/*if(numa1)if(numa[3:0]==0)begin6numa[3:0]=4'b1001;numa[7:4]=numa[7:4]-1;endelsenuma[3:0]=numa[3:0]-1;if(numa==2)begintempa=0;if((!BCHECK)&&(counta==1))counta=0;end*/endendelsebeginLAMPA=3'b100;counta=0;tempa=0;endendalways@(posedgeclk1)//该进程控制B方向的四种灯beginif(EMERGENCY)//EMERGENCY高电平有效,手动控制beginnumb=0;LAMPB=4;countb=0;tempb=0;endelseif(EN)beginif(!tempb)begintempb=1;case(countb)0:beginnumb=bred;LAMPB=4;countb=1;end1:beginnumb=bgreen;LAMPB=1;countb=2;end2:beginnumb=byellow;LAMPB=2;countb=0;enddefault:LAMPB=4;endcaseendelsebeginif(numb2)numb=numb-1;if(numb==2)beginnumb=1;tempb=0;if((BCHECK)&&(countb==1))countb=0;end/*if(numb1)if(!numb[3:0])beginnumb[3:0]=9;7numb[7:4]=numb[7:4]-1;endelsenumb[3:0]=numb[3:0]-1;if(numb==2)begintempb=0;if((!BCHECK)&&(countb==1))countb=0;end*/endendelsebeginLAMPB=3'b100;tempb=0;countb=0;endendendmodulemodule四、结果分析程序仿真效果如图3和图4所示:为观察方便,将红黄绿灯显示时间分别缩短,图中[4]表示红灯亮,[2]表示黄灯亮,[1]表示绿灯亮,BCHECK信号代表支干道检测状况,低电平表示检测到有车辆正常通过,EMERGENCY代表紧急状态信号,低电平表示紧急信号无效。从图3中可以看出,在支干道检测到有车辆正常通过并且紧急信号无效时,主干道和支干道的信号灯有条不紊的正确变换;图3:BCHECK低电平EMERGENCY低电平时,主干道和支干道的信号灯的显示状态从图4中可以看出,在支干道检测到无车辆通过或者紧急信号发生时,主干道和支干道的信号灯能够按照预先设计正确变换。8图4:BCHECKEMERGENCY低电平或高电平时,主干道和支干道的信号灯的显示状态五、总结仿真结果符合设计要求,交通灯有规律的变化,显示倒计时;在检测支路无车辆和紧急情况下,交通灯可以做出相应调整。设计中使用FSM(三段式),此方式描述方法虽然代码结构复杂了一些,但是使FSM做到了同步寄存器输出,有利于实现交通灯控制[2]。六、体会通过课程设计,更加体会到硬件编程语言的特点,与以前所学C语言有一些相似之处,但更重要的是硬件语言编程需要特别中重视与实际器件功能的结合,以保证最后能够正确实现设计的功能。在设计过程中遇到不少问题,如编程能力不够,相关知识运用不熟等问题,还需要进一步学习。七、参考文献[1]马建国孟宪元,等.FPGA现代数字系统设计[M].北京:清华大学出版社.2010:190-220.[2]华清远见嵌入式培训中心,等.FPGA应用开发入门与典型实例[M].北京:人民邮电出版社.2008:118-124.