..优选基于VHDL的交通灯
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
摘要随着社会上特别是城市中机动车辆保有量的不断增加,在现代城市的日常运行控制中,车辆的交通控制越来越重要,在十字穿插路口,越来越多的使用红绿灯进展交通指挥和管理。本文以VHDL硬件描述语言为设计手段,完成了交通信号灯控制电路的设计,其中交通信号灯控制电路的开发目的是设计一个适用于主、支干道十字穿插路口的红黄绿交通灯的控制系统,通过合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。所设计的交通信号灯控制电路经过在QuartusⅡ6.0软件下进展模拟仿真,观察其波形,证明所设计的交通信号灯控制电路完全可以实现预定的功能,并有一定的实用性。关键词:FPGA;VHDL;QuartusⅡ;交通灯设计思路本设计主要是利用状态机控制,交通灯的工作分成5个状态,如下:St0:支干道亮红灯,主干道亮绿灯,数码管不显示。St1:主干道亮绿灯45秒,数码管显示45秒倒计时;支干道亮红灯,数码管显示从49秒倒计时到05秒。St2::主干道亮黄灯5秒,数码管显示5秒倒计时;支干道亮红灯,数码管显示从04秒倒计时到00秒。St3:支干道亮绿灯25秒,数码管显示25秒倒计时;主干道亮红灯,数码管显示从29秒倒计时到05秒。St4:支干道亮黄灯5秒,数码管显示5秒倒计时;主干道亮红灯,数码管显示从04秒倒计时到00秒。把交通灯的工作分成五个状态,那么写程序的时候思路就比较清晰,只要在相应的状态里完成相应的工作,控制好黄绿红灯和数码管的倒计时显示,而且把握好五个状态转换的条件即可。实现起来也方便。二、设计分析根据设计思路可以把整体设计分为三个模块:分频模块:把实验板上的50MHz的频率分成1Hz信号〔用于倒计时计数的时钟信号〕、1kHz信号〔用于数码管扫描显示的片选时钟信号〕和2hz〔用于黄灯的闪烁〕;交通灯控制以及倒计时〔五个状态的控制〕模块;数码管译码扫描显示模块。整体的系统框图如下:段码输出位码输出1khz信号50Mhz信号分频2hz信号数码显1hz信号示模块七段译码数码管位选交通灯控制以及倒计时模块六个led灯输出分频模块,就是把输入的50MHz时钟频率50000分频得到1KHz的频率用于数码管的位选信号,其原理就是设计一个0到50000循环计数的的计数器,当计数溢出,即计数到50000时使输出量取反,就得到了1KHz的方波,作为数码管位选信号。同理,1Khz再经分频即可得到2hz〔黄灯闪烁信号〕和1hz〔倒计时计数信号〕。交通灯控制及倒计时模块,就是五个状态的转换模块,是整个系统的最主要模块,其五个状态分别st0、st1、st2、st3、st4。其中st0是当支干道没有车通行的状态,st1是主干道绿灯亮45秒的状态,st2是主干道黄灯闪烁5秒的状态,st3是支干道亮绿灯25秒的状态,st4是支干道黄灯闪烁5秒的状态。当主干道亮绿灯和黄灯闪烁时,支干道都是亮红灯,当支干道亮绿灯和黄灯闪烁时,主干道都是亮红灯,并且主、支干道都会显示亮灯的倒计时时间,主、支干道的红黄绿灯用实验板上的的最左边三个和最右边三个LED发光二极管代替。数码管倒计时显示,是用实验板上的其中四个数码管,分别表示主干道和支干道的秒倒计时,动态扫描的频率用的是1KHz的频率。各模块电路符号如下:1、顶层电路图如下:图2-3顶层文件原理图三、单元模块设计与仿真3.1时钟分频模块时钟分频模块就是把输入的2kHz时钟频率2000分频得到1Hz的频率用于数码管倒计时的时钟信号,其原理就是设计一个0到999循环计数的的计数器,当计数溢出,即计数到999时使输出量取反,那么输出为0.5秒的高电平和0.5秒的低电平交替出现,就得到了1Hz的方波,作为秒倒计时的时钟信号。时钟分频模块生成的元件符号如下:2、分频模块.--.word.zl实验板上的50Mhz频率经分频后得到1Khz、2hz、1hz三路信号。3、交通灯控制及计时模块此模块是整个系统的核心局部,主要功能是完成五个状态的转换,并且在每个状态里完成相应的控制作用,即控制主干道和支干道的红黄绿灯的点亮和各自数码管倒计时显示。编程时主要是用一个进程语句,其敏感信号是时钟分频模块产生的1Hz时钟信号,进程里主要用case语句完成五个状态的控制,在每个状态里要控制主干道和支干道的红黄绿灯的点亮,而且要控制各自数码管倒计时的显示,并为扫描显示译码模块提供倒计时时间,同时要使每个状态完毕时能顺利进入下一个状态。4、数码管显示译码和扫描模块此模块中含有七段数码管译码和扫描显示两个局部。.--.word.zl其中clk1khz是输入的扫描时钟信号硬件验证结果1、引脚配置如下:2、硬件验证效果如下:说明:主干道和支干道分别继续亮绿灯和红灯,同时主干道的数码管从44开场一秒一秒地倒计时显示直至倒计时到00,而支干道的数码管从49开场一秒一秒地倒计时显示,并且主、支干道的数码管显示值始终相差5。当主干道的倒计时到00〔支干道倒计时到05〕后的下一秒,主干道的绿灯灭,黄灯闪烁,而且主干道的数码管从04开场秒倒计时直至00,支干道的红灯在这一过程中始终是亮的,而且数码管正常倒计时,和主干道的数码管显示。当主、支干道数码管倒计时到00后的下一秒,主干道的黄灯灭,红灯亮,数码管从29开场一秒一秒地倒计时,而支干道的红灯灭,绿灯亮,数码管开场从24一秒一秒地倒计时,始终和主干道的数码管少5,直至倒计时到00。当支干道数码管倒计时到00〔主干道为05〕的下一秒后,支干道的绿灯灭,黄灯闪烁,数码管开场从04一秒一秒地倒计时直至00,而主干道在这一过程中继续亮红灯,数码管继续正常地倒计时,而和支干道数码管显示一样。当主、支干道倒计时到00的下一秒,那么进入到主干道亮绿灯,支干道亮红灯的状态。五、
心得体会
决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载
这次设计给我最大的收获就是做什么事都不要急,要一步一步的做好前提工作,我开场看到这个课
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
的时候就动手去写程序,只是凭着自己脑子里想一点就写一点,但是经过几次反复的修改还是没有成功,看不到效果,所以后来干脆就放下来先把每一步每一个模块都弄清楚再动手去写,可以再本子上把各个模块的端口以及连接都画好,再去写,这样能做到事半工倍的效果,而且在设计的时候不懂得地方可以参考别人写的程序,毕竟,不管做什么课程设计都是为了让自己弄懂、学好,只要将别人的程序设计转为自己的知识就ok了,在次根底上加上自己的一些想法,学会变通,或许还有些知识没学到,比方状态机这局部,但是通过别人的程序能让自己学到更多的知识,而且能稳固知识,所以我觉得要想把程序写好平常一定要多写多练多参考,这就是我这次设计的收获。附:各模块程序代码分频模块libraryieee;--对开发板上的50MHZ信号进展分频得到1khz位选信号、--2hz黄灯闪烁信号和1hz计时信号useieee.std_logic_1164.all;entitydiv_freqisport(freq_in:instd_logic;flag_1khz,flag_2hz,flag_1hz:bufferstd_logic);endentity;architectureoneofdiv_freqissignalplete_1khz:integerrange0to50000;signalplete_2hz:integerrange0to499;signalplete_1hz:integerrange0to1000;beginprocess(freq_in)--此进程得到的是1khz的位选信号beginif(freq_in'eventandfreq_in='1')thenplete_1khz<=plete_1khz+1;if(plete_1khz=50000)thenplete_1khz<=0;elsif(plete_1khz<25000)thenflag_1khz<='0';elseflag_1khz<='1';endif;endif;endprocess;process(flag_1khz)--此进程是得到2hz信号beginif(flag_1khz'eventandflag_1khz='1')thenplete_2hz<=plete_2hz+1;if(plete_2hz=500)thenplete_2hz<=0;flag_2hz<='0';elseflag_2hz<='1';endif;endif;endprocess;process(flag_1khz)--此进程是得到1hz信号beginif(flag_1khz'eventandflag_1khz='1')thenplete_1hz<=plete_1hz+1;if(plete_1hz=1000)thenplete_1hz<=0;flag_1hz<='0';elseflag_1hz<='1';endif;endif;endprocess;endarchitectureone;2、交通灯控制及倒计时模块--交通灯控制及计时模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitystate5isport(clk1hz,clk2hz:instd_logic;--1hz倒计时时钟信号one1,ten1,one2,ten2:outintegerrange0to10;--倒计时数ra,ga,ya,rb,gb,yb:outstd_logic);--主支干道红黄绿灯end;architecturetwoofstate5istypestatesis(st0,st1,st2,st3,st4);--定义五个状态signalr1,g1,y1,r2,g2,y2:std_logic;signala,y11,y22:std_logic;-------------------------------------------------begin-----------------------------------------process(clk1hz)-------5statesvariablest:states;variableeoc:std_logic;--倒计时完毕标志位variableh1,l1,h2,l2:integerrange0to10;begin--------------------------------------------------------------ifclk1hz'eventandclk1hz='1'thencasestiswhenst0=>st:=st1;h1:=4;l1:=4;h2:=4;l2:=9;whenst1=>-----主干道绿灯亮45秒ifeoc='0'thenh1:=4;l1:=4;h2:=4;l2:=9;eoc:='1';g1<='1';r1<='0';y1<='0';g2<='0';r2<='1';y2<='0';elseifh1=0andl1=1thenst:=st2;eoc:='0';h1:=0;l1:=0;h2:=0;l2:=5;elsifl1=0thenl1:=9;h1:=h1-1;l2:=l2-1;elsifl2=0thenl2:=9;h2:=h2-1;l1:=l1-1;elsel1:=l1-1;l2:=l2-1;endif;endif;whenst2=>-----主干道黄灯亮5秒ifeoc='0'thenh1:=0;l1:=4;h2:=0;l2:=4;eoc:='1';----------------------------------------------g1<='0';r1<='0';y1<='1';g2<='0';r2<='1';y2<='0';-------------------------------elseifl1=1thenst:=st3;eoc:='0';h1:=0;l1:=0;h2:=0;l2:=0;elsel1:=l1-1;l2:=l2-1;endif;endif;whenst3=>-----支干道绿灯亮25秒ifeoc='0'thenh1:=2;l1:=9;h2:=2;l2:=4;eoc:='1';g1<='0';r1<='1';y1<='0';g2<='1';r2<='0';y2<='0';elseifh2=0andl2=1thenst:=st4;eoc:='0';h2:=0;l2:=0;h1:=0;l1:=5;elsifl2=0thenl2:=9;h2:=h2-1;l1:=l1-1;elsifl1=0thenl1:=9;h1:=h1-1;l2:=l2-1;elsel2:=l2-1;l1:=l1-1;endif;endif;whenst4=>------支干道黄灯亮5秒ifeoc='0'thenh1:=0;l1:=4;h2:=0;l2:=4;eoc:='1';g1<='0';r1<='1';y1<='0';g2<='0';r2<='0';y2<='1';elseifl2=1thenst:=st1;eoc:='0';h1:=0;l1:=0;h2:=0;l2:=0;elsel1:=l1-1;l2:=l2-1;endif;endif;endcase;endif;ra<=r1;ga<=g1;ya<=y11;rb<=r2;gb<=g2;yb<=y22;--------------------one1<=l1;ten1<=h1;one2<=l2;ten2<=h2;endprocess;process(clk2hz)beginifclk2hz'eventandclk2hz='1'thena<=nota;if(y1='1')theny11<=a;elsey11<='0';endif;if(y2='1')theny22<=a;elsey22<='0';endif;endif;endprocess;end;3、数码管译码显示及位选模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydisplayisport(clk_1khz:instd_logic;--扫描时钟信号one1,ten1,one2,ten2:inintegerrange0to10;scan:outstd_logic_vector(3downto0);--片选输出信号seg_7:outstd_logic_vector(7downto0));--七段译码输出endentitydisplay;architecturethreeofdisplayissignaldata:integerrange0to10;signalseg77:std_logic_vector(7downto0);signalt:std_logic_vector(1downto0);beginprocess(data)-------七段译码begincasedataiswhen0=>seg77<="00000011";when1=>seg77<="10011111";when2=>seg77<="00100101";when3=>seg77<="00001101";when4=>seg77<="10011001";when5=>seg77<="01001001";when6=>seg77<="01000001";when7=>seg77<="00011111";when8=>seg77<="00000001";when9=>seg77<="00001001";when10=>seg77<="11111111";whenothers=>null;endcase;endprocess;seg_7<=seg77;process(clk_1khz,one1,ten1,one2,ten2)----------数码管动态扫描计数beginifclk_1khz'eventandclk_1khz='1'then--00到11循环计数器ift="11"thent<="00";elset<=t+1;endif;endif;endprocess;process(t,one1,ten1,one2,ten2)----数码管动态扫描显示begincasetiswhen"00"=>data<=one1;scan<="0111";when"01"=>data<=ten1;scan<="1011";when"10"=>data<=one2;scan<="1101";when"11"=>data<=ten2;scan<="1110";whenothers=>null;endcase;endprocess;endthree;.--.word.zl