EDA课程设计交通灯.doc
可编程逻辑器件与VHDL课程设计 基于VHDL的交通灯设计班 级: 08级通信(1)班 姓 名 : 徐 大 旺 学 号 : 指导教师姓名: 杨泽霖 摘要:伴随着社会的发展以及人类生活水平的提高,汽车的数量在不断增加,交通事业得以蓬勃发展,而随之引起的安全问题已经不容忽视。EDA技术的发展和应用领域也在不断的扩大与深入,机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域的重要性日益突出。为了确保十字路口的行人和车辆顺利,畅通的通过,往往采用电子控制的交通信号来进行指挥。利用EDA技术设计交通灯来完成这个需求就显的更加迫切,同样也是非常的实用和合理。关键字:VHDL语言、交通灯、Quartus软件、正文:一、系统分析与总体方案1系统分析 通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使南北方向有左转、直行各三个灯(红、黄、绿),东西方向有左转、直行各三个灯(红、黄、绿),三个灯能够按顺序依次亮灭。而且要求绿灯亮转黄灯亮然后其他时间为红灯,红灯亮可以直接转绿灯(三种灯的循环顺序如图2.1所示)。还要求三种灯的点亮时间能够以倒计时的形式显示出来。可以用VHDL语言合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。绿灯黄灯红灯黄灯红灯图2.1三种灯的循环顺序2 设计思路1 时间脉冲可以直接赋予得到。2 10s、5s、40s、30s定时信号用倒计时,计时起始信号由控制流程电路给出,每当计满所需时间,即向控制电路输出“时间到”的信号,并使计数器清零,由控制电路启、闭三色信号灯。3 主控电路是核心,这是一个时序电路,其输入信号为东西、南北方向:10s、5s、40s、30s定时信号,其输出状态控制相应的三色灯。4 三种灯转换状态表:时间|S105405105305东西左转绿黄红红红红红红东西直行红红绿黄红红红红南北左转红红红红绿黄红红南北直行红红红红红红绿黄3 设计方案 根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图2.2所示:CLK交通灯控制及计时模块扫描显示模块LED显示图2.2 系统的框图电路设计1控制器电路设计流程控制器的作用是根据计数器的计数值控制各方向上发光二极管的亮、灭,当计时时间到达,状态控制器就响应,自动跳转到下一个状态。此外,当检测到特殊情况(urgen =1)发生时,无条件点亮红灯的二极管(急救灯按下urgen ='1',则东西南北都亮红灯,在这种状态下原来的状态必须保持,即东西南北方向定时时间保持不变。急救灯未按下或者按下后恢复,则继续计时(计时通过计数器count),同时恢复东西南北原来灯的状态)。具体实物模块如图3.1所示:图3.1控制器模块程序实现如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ledcontrol ISPORT(reset,clk,urgen: INSTD_LOGIC;state: OUTSTD_LOGIC_VECTOR(2 DOWNTO 0);sub,set1,set2,set3,set4: OUTSTD_LOGIC);END ledcontrol;ARCHITECTURE a OF ledcontrol ISSIGNAL count : STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL subtemp: STD_LOGIC;BEGINsub<=subtemp AND (NOT clk) ;-将电平型信号变为脉冲型,即高电平时输出一个脉冲statelabel:PROCESS (reset,clk)BEGINIF reset='1' THEN-系统复位 count<=""state<="000"set2<='1'set4<='1'ELSIF clk'event AND clk='1' THEN IF urgen='0' THEN count<=count+1;subtemp<='1'ELSE subtemp<='0'END IF;-经过脉冲电平变换后,使得正常状态时,正常减计数,紧急状态下停止计数IF count=0 then state<="000"set1<='1'set2<='1'set3<='1'set4<='1' ELSIF count=10 then state<="001"set1<='1'ELSIF count=15 THEN state<="010"set1<='1'set2<='1'ELSIF count=55 THEN state<="011"set2<='1'ELSIF count=60 THEN state<="100"set2<='1'set3<='1'elsif count=70 THEN state<="101"set3<='1'elsif count=75 THEN state<="110"set3<='1'set4<='1'elsif count=105 THEN state<="111"set4<='1'ELSIF count=110 THEN count<="" ELSE set1<='0' set2<='0'set3<='0'set4<='0'END IF;END IF; - 控制流程END PROCESS statelabel;END a;2输出显示电路设计根据状态控制器所控制的状态和计数器的计时时间,选择当前状态下的显示器,使显示器输出当前状态下的数码管亮、灭指令,其中数码管的显示采用动态扫描显示。具体实物模块如图:图3.2译码显示电路模块程序实现如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ledshow ISPORT(clk,urgen: IN STD_LOGIC;state: IN STD_LOGIC_VECTOR(2 DOWNTO 0);sub,set1,set2,set3,set4: IN STD_LOGIC;eg1,ey1,er1,edg2,edy2,edr2,ng1,ny1,nr1,ndg2,ndy2,ndr2: OUTSTD_LOGIC;led1,led2: OUTSTD_LOGIC_VECTOR(7 DOWNTO 0);END ledshow;ARCHITECTURE a OF ledshow ISSIGNAL count1,count2,count3,count4 : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL setstate1,setstate2,setstate3,setstate4 : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL etg1,ety1,etr1,edirr1,edirg1,ediry1,norg2,nory2,norr2,nordirg2,nordiry2,nordirr2 : STD_LOGIC; BEGINled1<="" WHEN urgen='1' AND clk='0' ELSE -显示东西向行和停count1 WHEN state="000" ELSEcount1 WHEN state="001" ELSE count2 WHEN state="010" ELSEcount2 WHEN state="011" ELSEcount2;led2<="" WHEN urgen='1' AND clk='0' ELSEcount3 WHEN state="000" ELSEcount3 WHEN state="001" ELSE count3 WHEN state="010" ELSEcount3 WHEN state="011" ELSEcount3 WHEN state="100" ELSEcount3 WHEN state="101" ELSEcount4 WHEN state="110" ELSEcount4;etg1<='1' WHEN state="000" AND urgen='0' ELSE '0'ety1<='1' WHEN state="001" AND urgen='0' ELSE '0'etr1<='1' WHEN state="010" or urgen='1' OR state="011" OR state="100" OR state="101" OR state="110" OR state="111" ELSE '0'edirg1<='1' WHEN state="010" and urgen='0' ELSE '0'ediry1<='1' WHEN state="011" and urgen='0' ELSE '0'edirr1<='1' WHEN state="000" OR urgen='1' OR state="001" OR state="100" OR state="101" OR state="110" OR state="111" ELSE '0'norg2<='1' WHEN state="100" AND urgen='0' ELSE '0'nory2<='1' WHEN state="101" and urgen='0' ELSE '0'norr2<='1' WHEN state="000" OR state="001" OR state="010" OR state="011" OR state="110" OR state="111" OR urgen='1' ELSE '0'nordirg2<='1' WHEN state="110" AND urgen='0' ELSE '0'nordiry2<='1' WHEN state="111" and urgen='0' ELSE '0'nordirr2<='1' WHEN state="000" OR state="001" OR state="010" OR state="011" OR state="100" OR urgen='1' OR state="101" ELSE '0'setstate1<= "" WHEN state="000" ELSE"" WHEN state="001" ELSE"" ;setstate2<= "" WHEN state="000" ELSE-"" WHEN state="001" ELSE"" WHEN state="010" ELSE"" WHEN state="011" ELSE"" ;setstate3<= "" WHEN state="000" ELSE"" WHEN state="100" ELSE"" WHEN state="101" ELSE"" ;setstate4<= "" WHEN state="000" ELSE"" WHEN state="110" ELSE"" ;label4: -南北直行PROCESS (sub)BEGINIF sub'event AND sub='1' THENIF set4='1' THEN count4<=setstate4;elsif count4(3 downto 0)="0000" then count4<=count4-7; ELSE count4<=count4-1; END IF;ndy2<=nordiry2;ndg2<=nordirg2;ndr2<=nordirr2;END IF;END PROCESS label4;label3: -南北左行PROCESS (sub)BEGINIF sub'event AND sub='1' THENIF set3='1' THEN count3<=setstate3;elsif count3(3 downto 0)="0000" then count3<=count3-7;ELSE count3<=count3-1; END IF;ng1<=norg2;ny1<=nory2;nr1<=norr2;END IF;END PROCESS label3;label2: -东西直行PROCESS (sub)BEGINIF sub'event AND sub='1' THENIF set2='1' THEN count2<=setstate2;elsif count2(3 downto 0)="0000" then count2<=count2-7; ELSE count2<=count2-1; END IF;edg2<=edirg1;edy2<=ediry1;edr2<=edirr1;END IF;END PROCESS label2;label1: -东西左行PROCESS (sub)BEGINIF sub'event AND sub='1' THENIF set1='1' THEN count1<=setstate1; elsif count1(3 downto 0)="0000" then count1<=count1-7;ELSE count1<=count1-1; END IF;eg1<=etg1;er1<=etr1;ey1<=ety1;END IF;END PROCESS label1;END a;程序仿真与分析1 仿真结果利用Quartus II软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。仿真结果如图5.1所示:图5.1 仿真结果2 仿真结果分析通过设定clk值以及reset和urgen的初值,就可以得到如上所示的仿真波形图。由仿真波形图可以看出波形是由reset初值信号触发而显示出各个状态的。Urgen高电平信号输入时,所有交通灯都变为红灯状态。由仿真波形图还可以清楚的看出各时间段每个交通灯的状态。要得到正确的仿真波形图就不许设定合适的时间信号clk值。如果clk值设置的太小则交通灯状态变化得太快无法分辨,如果clk值设置得太大则交通灯状态转换缓慢,效果不明显。其次,要设定reset初值,如果没有设定reset初值就不可能触发而得到仿真图。最后,就是要设置一Urgen高电平信号来检测紧急情况下的交通灯的状态。心得体会通过此次课程设计,使我对EDA程序设计有了进一步的学习,进一步的认识;在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写EDA的大程序,很有成就感。在这几天课设的时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习EDA更是如此,程序只有在经常的写与读的过程中才能提高,加深了我对Quartus II软件的应用熟悉了此软件的具体操作,这就是我在这次课程设计中的最大收获。生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。虽然我这次做的课程设计不是非常的复杂,但在设计和仿真的过程中,遇到了不少的困难,回首整个过程,却受益匪浅。对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!参考文献1 阎石 主编,数字电子技术基础,高等教育出版社,19982 谭会生等主编,EDA技术及应用,西安电子科技大学出版社,20013 廖裕评等主编,CPLD数字电路设计使用MAX+plus入门篇,清华大学出版社,20014 冯涛等主编,可编程逻辑器件开发技术:MAX+plus入门与提高,人民邮电出版社,20025 杨崇志,特殊新型电子元件手册,辽宁科学技术出版社,19996 彭介华,电子技术课程设计指导高等教育出版社.2000年出版.7 Mark Zwolinski, Digital System Design with VHDL, 电子工业出版社,20028 Alan B. Marcovitz Introduction to logic Design, 电子工业出版社,2002