项目:交通灯控制系统班级:10-通信技术-1班姓名:XXXXXX指导教师:龚老师郭老师实训时间:2012·3·19--3·30实训地点:二教306教室前言本项目设计通过HDL技术设计交通灯控制系统,其设计描述可被不同的工具所支持,可用不同器件来实现。利用VerilogHDL语言自顶向下的设计方法设计交通灯控制系统,使其实现道路交通的快速正常运转,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,通过QuartusII此程序下载到FPGA芯片后,可应用于实际的交通灯控制系统中。通常的设计方法基于中、小规模集成电路进行,电路元件多、接线复杂、故障率高。随着大规模集成电路的发展、EDA技术的出现,数字电路的设计进入了一个崭新阶段。FPGA是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,其种类很多,内部结构也不同,但共同的特点是体积小、使用方便。本论文介绍了用VerilogHDL语言设计交通灯控制器的方法,并在QuartusII系统对FPGA芯片进行编译下载,由于生成的是集成化的数字电路,没有传统设计中的接线问题,所以故障率低、可靠性高,而且体积非常小。本论文通过EDA设计,利用VerilogHDL语言模拟仿真交通灯控制电路。说明EDA技术在数字电路设计中的优越性。【关键词】VerilogHDLFPGA硬件描述语言交通灯控制器第一章课程设计目标及要求一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、《硬件描述语言》是一门技术性、应用性很强的学科,实验课教学是它的一个极为重要的环节。不论理论学习还是实际应用,都离不开实验课教学。如果不在切实认真地抓好学生的实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节、学习与应用脱节的局面。《HDL项目设计》的目的就是让同学们在理论学习的基础上,通过完成一个涉及时序逻辑、组合逻辑、声光输出的,具有实用性、趣味性的小系统设计,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对分析、解决实际的数字电路问题进一步加深认识,为今后能够独立进行某些数字应用系统的开发设计工作打下一定的基础。二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、通过EDA实验箱进行实际调试,实现软件的功能。三、课程设计预期效果1、完成实验环境搭建;2、(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制;(2)实现A车道和B车道每次红灯亮12s,绿灯亮10s,黄灯亮2s。(3)要求黄灯亮2秒后,绿灯才能转为红灯。(4)提供紧急情况下手动控制复位。第二章系统设计第一节课题目标及总体方案一、随着现代生活节奏的加快,人们出门便更多地选择自家的交通工具,或汽车,或电动车,这无疑加大了交通流量,如何控制十字路口的红绿灯,便显得相当的重要。简单的,有效地控制红绿灯,是减小客流量,甚至减少交通事故的重要保障。而此次课题,我们小组选择了交通灯控制电路,能熟悉verilogHDL硬件描述语言在现实生活中的重要意义,提前积累经验,为以后的工作打基础。实现设计目标如下:(1)设计一个十字路口的交通灯控制电路,每条路配有红、黄、绿交通信号灯,通过电路对十字路口的两组交通灯的状态实现自动循环控制;(2)实现A车道和B车道每次红灯亮12s,绿灯亮10s,黄灯亮2s。(3)要求黄灯亮2秒后,绿灯才能转为红灯。(4)提供紧急情况下手动控制复位。第二节系统的对比与分析及确定设计方案一、通过对比确定系统设计方案:虽然是verilogHDL课程设计,虽然是硬件描述语言,但是大多数人仍然采用的是C语言的编写方法,或许可以达到目的,但是我觉得采用状态机的方法不仅简单易懂,而且如果调试不成功,修改起来也比较方便。本系统采用四个状态,即S1:A方向红灯亮B方向绿灯亮;S2:A方向红灯亮,B方向黄灯亮;S3:A方向绿灯亮,B方向红灯亮;S4:A方向黄灯亮,B方向红灯亮;再执行S1,依次循环,实现系统的设计目标。1、具体的电路分析如下表所示:状态机状态列表系统框图转换如下:状态机状态转换图A方向B方向红灯亮绿灯亮黄灯亮红灯亮黄灯亮绿灯亮S1011110S2011101S3101011S4110011状态S4状态S3状态S1状态S2系统逻辑设计:根据上文中确定的系统设计方案,运用模块化的设计思路,我们在QuartusII5.0软件系统中设计了交通灯控制模块、显示控制模块、显示译码模块、12秒和10s倒计时时器模块、2秒倒计时器模块的HDL程序,并通过各个模块程序之间的端口合理连接和协调,成功设计出交通信号灯控制电路,得到其逻辑结构原理图,即为整个交通信号灯控制电路的逻辑结构。第二节出现的问题和解决方案一、问题和解决方案1、在QuartusII软件上进行仿真时,发现不能得到预期的效果,分析得知由于分频过大的原因,软件仿真得不到预期结果。经过同学的讨论决定在软件仿真时省去时钟信号的分频操作,但是在硬件验证过程中加入分频操作,将48MHz的信号分频到1Hz,问题得以解决。2、对于Verilog语言的编程方面,特别在对变量给予初值时,完全不同于C语言编程,我们在对许多变量进行了初值设置,此后编译每每都不通过,在认真思考后,查阅了课本,发现在HDL编程中,不能对变量初值。我们恍然大悟,在以后的编程中我们牢记住了这一点。3、虽然这几天在不断的改进程序,但是最后没有做出来,是因为对芯片和引脚的不熟悉,其实在对网上下载的资料进行分析的时候掌握不到位,很多网上下载的资料是很实用,最后进过不断的修改和改进终于做了出来,对变量的定义和if语句的应用不熟悉。4、对于几个模块的应用和主次不分,导致在编译过程中出现错误。参考资料:《EDA实验与实践教程(二)》周立功主编《Verilog数字系统设计教程》夏宇闻主编《数字系统设计与VerilogHDL(第二版)》王金明主编附录一:总结经过了两个周的专项训练我学到了不少知识,不论是在语句、语法,还是在变量、常量、的定义,以及在编写程序的过程中对知识点的深化。在选择项目的时候我原本以为交通灯控制程序会很简单,但是在具体操作中才明白不是项目简单我们这个项目的同学是顶着压力做完的,我们还是感到很欣慰,至少是做出来了。第一个星期我主要是在查阅资料和对程序的简单编写,很快就实现了A、B方向的交通灯实现了s1、s2、s3、s4状态的控制,便觉得程序很简单,但是在接下来的倒计时程序控制中才发现了程序的困难,无论怎么样改进都无法实现程序的倒计时。后来又参阅其他的资料来改进倒计时,能够实现数码管的位选和扫描,但是就是不能够实现程序的倒计时,而且倒计时出来的时候只有一个数码管能够显示出来,而且是乱跳。经过老师的指导和自己的改进之后,能够实现对红灯的倒计时,但是就是不能够对绿灯也尽心倒计时,所以又陷入了僵局中,后来和另外一组同学相互讨论和改进终于把程序给弄出来了。然后是对程序的完善和改进,对其他资料的综合应用和分析,加上对编写程序的分析,充分掌握交通灯控制程序的原理和作用,了解每一个步骤的作用以及对整个程序的总体考虑和分模块进行控制,对以前的思路进行推敲和改进,打破只在一个程序中做出来的思想实行分模块的构造。项目设计虽然已经结束了,它使我懂得了理论与实际相结合是很重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知解得不够深刻,掌握得不够牢固,在边编学程序的过程中我几乎是重新复习课本上的知识。所以,我觉得无论是hdl课程设计,还是其他课程的设计,我们都要花费很多时间,认真,仔细,完整,合理完成任务,这样才能提高我们的综合素质,才能在实践中发现不足,在实践中加深对理论知识的理解和认识。总结人:XXX附录二:Traffic_top程序:moduletraffic_top(clk_lk,rst,seg,dig,lampa,lampb);inputclk_lk;inputrst;output[2:0]lampa,lampb;output[7:0]seg,dig;wireclk;wire[7:0]acount,bcount;traffictraffic(.clk_lk(clk_lk),.rst(rst),.clk(clk),.lampa(lampa),.lampb(lampb),.acount(acount),.bcount(bcount));traffic_testtraffic_test(.clk_lk(clk_lk),.clk(clk),.rst(rst),.acount(acount),.bcount(bcount),.seg(seg),.dig(dig));EndmoduleTraffic.v程序:Moduletraffic(clk_lk,rst,clk,lampa,lampb,acount,bcount);inputclk_lk,rst,clk;//产生系统时钟,复位信号,1s时钟信号output[2:0]lampa,lampb;//led灯(红黄绿)output[7:0]acount,bcount;//数码管倒计时显示reg[2:0]lampa,lampb;reg[7:0]numa,numb;regtempa,tempb;reg[2:0]statea,stateb;//led灯控制parameterared=8'h12,ayellow=8'h2,agreen=8'h10,bred=8'h12,byellow=8'h2,bgreen=8'h10;//初始值assignacount=numa;assignbcount=numb;always@(posedgeclk_lkornegedgerst)beginif(!rst)beginstatea=3'h0;lampa=3'b011;tempa=1'b0;endelseif(clk)beginif(!tempa)//A方向灯控制begintempa=1'b1;case(statea)0:beginnuma=agreen;lampa=3'b011;statea=1;end1:beginnuma=ayellow;lampa=3'b101;statea=2;end2:beginnuma=ared;lampa=3'b110;statea=0;enddefault:lampa=3'b110;endcaseendelsebeginif(numa1)if(numa[3:0]==0)beginnuma[3:0]=4'h9;numa[7:4]=numa[7:4]-4'h1;endelsenuma[3:0]=numa[3:0]-4'h1;if(numa==2)tempa=1'b0;endendendalways@(posedgeclk_lkornegedgerst)beginif(!rst)beginlampb=3'b110;stateb=3'h0;tempb=1'b0;endelseif(clk)beginif(!tempb)//B方向灯控制begintempb=1'b1;case(stateb)0:beginnumb=bred;lampb=3'b110;stateb=1;end1:beginnumb=bgreen;lampb=3'b011;stateb=2;end2:beginnumb=byellow;lampb=3'b101;stateb=0;enddefault:lampb=3'b110;endcaseendelsebegin//倒计时if(numb1)if(numb[3:0]==0)beginnumb[3:0]=4'h9;numb[7:4]=numb[7:4]-4'h1;endelse