VHDL的交通灯设计分析与实现_第1页
VHDL的交通灯设计分析与实现_第2页
VHDL的交通灯设计分析与实现_第3页
VHDL的交通灯设计分析与实现_第4页
VHDL的交通灯设计分析与实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...华中科技大学基于xilinxFPGA的VHDL交通灯控制器的设计 --基于Spartan3E开发板专业: 电子信息工程任务设计要求①设计一个十字路口交通信号灯的定时控制电路。要求红、绿灯按一定的规律亮和灭,并在亮灯期间进展倒计时,并将运行时间用数码管/液晶显示出来。②绿灯亮时,为该车道允许通行信号,红灯亮时,为该车道制止通行信号。要求主干道每次通行时间为99秒,支干道每次通行时间为30秒。每次变换运行车道前绿灯闪烁,持续时间为5秒。即车道要由主干道转换为支干道时,主干道在通行时间只剩下5秒钟时,绿灯闪烁显示,支干道仍为红灯,以便主干道上已过停车线的车继续通行,未过停车线的车停顿通行。同理,当车道由支干道转换为主干道时,支干道绿灯闪烁显示5秒钟,主干道仍为红灯。③对红、绿灯的运行时间要能比拟方便的进展重新设置。④对器件进展在系统编程和实验验证。⑤用VHDL语言对设计进展描述,设计一个测试方案,通过ISE对设计进展仿真验证。并能够下载到实验板上调试成功。任务扩展:在原设计的根基上参加指示方向的功能。系统设计1.系统原理图与说明由系统设计原理图,我以清楚地将系统分为六个模块:分频模块,时间设置模块,状态转换模块,时间计算模块,LED流水灯模块,LCD显示模块。1〕分频模块分频模块其作用为:由于Spartan3E板上提供的时钟信号为50MHz,而设计所需时钟信号为1Hz,故使用分频模块将50MHz信号分频为1Hz信号。2〕时间置数模块由于任务设计要求可以对主干道,支干道上左转、绿灯运行的时间进展重新设置调整,所以要对系统进展参数化设计。首先引入一组参数,main_gh,main_gl,main_lh,main_ll,branch_gh,branch_gl,branch_lh,branch_ll(下划线后面的字母分别取green,left,high,low首字母).需要置数时,首先选择对主干道还是支干道时间置数,这里设置一个main_or_branch参数,当main_or_branch为高时设置支干道时间,为低时设置主干道时间。置数时,通过s_set_button,l_set_button对时间进展设置,具体方法参见代码。为了置数方便,引入一个add_or_decent参数,低电平时按下button可以增计数,高电平时按下可以减计数。3〕状态转换模块状态转化模块是整个系统的核心模块它控制整个交通灯系统的状态变化,整个过程划分为四个根本状态:主干道绿灯、主干道左转、支干道绿灯、支干道左转,用state、s_or_l为00、01、10、11来代表。每当一个状态的计数器为00时,state、s_or_l发生改变,以实现状态间的转换,进而控制交通灯的变化。4〕时间计算模块这次设计中扩展了左转向的功能,因此红灯时间不仅仅是另一干道的直行时间,而是直行时间和左转时间之和。5〕LCD显示模块Spartan3E板上只有LCD显示模块,所以采用此模块显示当前亮灯的剩余时间和设置时间模块的时间显示。通过输入counterplay_1l,counterplay_1h,counterplay_2l,counterplay_2h四位二进制数,加上0011显示成十进制数,分别代表两位数的低位和高位6〕LED显示模块由输入信号state、s_or_l、flash,分别取000,001,010,011,100,101,110,111所得到的main_green,main_left,main_red,branch_left,branch_green,branch_red的不同值,来控制主干道,支干道红绿左转灯的亮灭。其中1表示亮,0表示灭。如表3-1所示。由上表可得到:main_green<=NOT(state)ANDNOT(s_or_l)AND(NOT((flashANDclk)));main_left<=NOT(state)ANDs_or_lAND(NOT((flashANDclk)));main_red<=state;branch_green<=stateANDNOT(s_or_l)AND(NOT((flashANDclk)));branch_left<=stateANDs_or_lAND(NOT((flashANDclk)));branch_red<=NOT(state);2.输入输出设计任务设计开发板基于Spartan3E板,具体输入输出设定如下:1〕输入:开关:main_or_branch:设置主干道还是支干道EN: 使能信号run_or_set: 设置运行模式还是时间设置模式add_or_decent: 置数模式:增加或者减少按键:s_set_button: 直行时间设置按键l_set_button: 左转时间设置按钮 时钟:clk输出:LCD显示屏:分别显示当前亮灯的剩余秒数LED灯:main_green,main_red,main_leftbranch_left,branch_green,branch_red3、状态转换图S0状态:主干道绿灯、支干道红灯S1状态:主干道左转、支干道红灯S2状态:支干道绿灯、主干道红灯S3状态:支干道左转、主干道红灯三.各模块代码以及仿真波形分频模块代码因为1HZ波形太长,不易仿真,故仿真波形采用100HZ的输入clk:50MHZ输出clk1:100HZ时间设置模块局部代码以上是直行时间设置代码。左转设置类似,在此不再复制仿真设置输入 :clkmain_or_branch设置为0add_or_decent设置为0s_set_button设置为周期为1周期的信号l_set_button设置为低电平波形如下时间计算模块代码波形仿真输入输出与预期相符合。状态转换模块波形仿真分别给主干道,支干道个颜色灯持续时间赋值,再给定,当前亮灯的剩余时间,然后又进展仿真,结果符合预期LED模块代码波形仿真分别给予输入不同周期的上下点评,相互叠加的结果符合预期。LCD模块代码libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityLCDis port( clk:inSTD_LOGIC; rst_n:inSTD_LOGIC; counter_play1h,counter_play1l:inSTD_LOGIC_VECTOR(3downto0); counter_play2h,counter_play2l:inSTD_LOGIC_VECTOR(3downto0); --degree1,degree2:inSTD_LOGIC_VECTOR(3downto0); SF_D:outSTD_LOGIC_VECTOR(3downto0); LCD_E,LCD_RS,LCD_RW:outSTD_LOGIC );endLCD;architecturebehaviorofLCDis typetx_sequenceis(high_setup,high_hold,oneus,low_setup,low_hold,fortyus,done); signaltx_state:tx_sequence:=done; signaltx_byte:std_logic_vector(7downto0); signaltx_init:std_logic:='0'; typeinit_sequenceis(idle,fifteenms,one,two,three,four,five,six,seven,eight,done); signalinit_state:init_sequence:=idle; signalinit_init,init_done:std_logic:='0'; signali:integerrange0to750000:=0; signali2:integerrange0to2000:=0; signali3:integerrange0to82000:=0; signalSF_D0,SF_D1:std_logic_vector(3downto0); signalLCD_E0,LCD_E1:std_logic; signalmux:std_logic;--???? typedisplay_stateis(init,function_set,entry_set,set_display,clr_display,pause,set_addr, max_degree_1,max_degree_2,temperature_1,temperature_2,degree_1,degree_2,blank1,blank2,blank3); signalcur_state:display_state:=init;begin --LED<=tx_byte;--fordiagnosticpurposes --SF_CE0<='1';--disableintelstrataflash LCD_RW<='0';--writeonly --Thefollowing"with"statementssimplifytheprocessofaddingandremovingstates. --whentotransmitacommand/dataandwhennotto withcur_stateselect tx_init<='0'wheninit|pause, '1'whenothers; --controlthebus withcur_stateselect mux<='1'wheninit, '0'whenothers; --controltheinitializationsequence withcur_stateselect init_init<='1'wheninit, '0'whenothers; --registerselect withcur_stateselect LCD_RS<='0'whenfunction_set|entry_set|set_display|clr_display|set_addr, '1'whenothers; --whatbytetotransmittolcd --refertodatasheetforanexplanationofthesevalues withcur_stateselect tx_byte<="00101000"whenfunction_set,--??????? "00000110"whenentry_set, "00001100"whenset_display, "00000001"whenclr_display, "10000000"whenset_addr, "0011"&counter_play1hwhenmax_degree_1, "0011"&counter_play1lwhenmax_degree_2, "00100000"whenblank1, "0011"&counter_play2hwhentemperature_1, "0011"&counter_play2lwhentemperature_2, "00100000"whenblank2, "00100000"whendegree_1, "00100000"whendegree_2, "00100000"whenblank3, "00100000"whenothers; --mainstatemachine display:process(clk,rst_n) begin if(rst_n='0')then cur_state<=function_set; elsif(clk='1'andclk'event)then casecur_stateis --refertointializestatemachinebelow wheninit=> if(init_done='1')then cur_state<=function_set; else cur_state<=init; endif; --everyotherstatebutpauseusesthetransmitstatemachine whenfunction_set=> if(i2=2000)then cur_state<=entry_set; else cur_state<=function_set; endif; whenentry_set=> if(i2=2000)then cur_state<=set_display; else cur_state<=entry_set; endif; whenset_display=> if(i2=2000)then cur_state<=clr_display; else cur_state<=set_display; endif; whenclr_display=> i3<=0; if(i2=2000)then cur_state<=pause; else cur_state<=clr_display; endif; whenpause=> if(i3=82000)then cur_state<=set_addr; i3<=0; else cur_state<=pause; i3<=i3+1; endif; whenset_addr=> if(i2=2000)then cur_state<=max_degree_1; else cur_state<=set_addr; endif; whenmax_degree_1=> if(i2=2000)then cur_state<=max_degree_2; else cur_state<=max_degree_1; endif; whenmax_degree_2=> if(i2=2000)then cur_state<=blank1; else cur_state<=max_degree_2; endif; whenblank1=> if(i2=2000)then cur_state<=temperature_1; else cur_state<=blank1; endif; whentemperature_1=> if(i2=2000)then cur_state<=temperature_2; else cur_state<=temperature_1; endif; whentemperature_2=> if(i2=2000)then cur_state<=blank2; else cur_state<=temperature_2; endif; whenblank2=> if(i2=2000)then cur_state<=degree_1; else cur_state<=blank2; endif; whendegree_1=> if(i2=2000)then cur_state<=degree_2; else cur_state<=degree_1; endif; whendegree_2=> if(i2=2000)then cur_state<=blank3; else cur_state<=degree_2; endif; whenblank3=> if(i2=2000)then cur_state<=set_addr; else cur_state<=blank3; endif; endcase; endif;endprocessdisplay; withmuxselect SF_D<=SF_D0when'0',--transmit SF_D1whenothers;--initialize withmuxselect LCD_E<=LCD_E0when'0',--transmit LCD_E1whenothers;--initialize --specifiedbydatasheet transmit:process(clk,rst_n,tx_init) begin if(rst_n='0')then tx_state<=done; elsif(clk='1'andclk'event)then casetx_stateis whenhigh_setup=>--40ns LCD_E0<='0'; SF_D0<=tx_byte(7downto4); if(i2=2)then tx_state<=high_hold; i2<=0; else tx_state<=high_setup; i2<=i2+1; endif; whenhigh_hold=>--230ns LCD_E0<='1'; SF_D0<=tx_byte(7downto4); if(i2=12)then tx_state<=oneus; i2<=0; else tx_state<=high_hold; i2<=i2+1; endif; whenoneus=> LCD_E0<='0'; if(i2=50)then tx_state<=low_setup; i2<=0; else tx_state<=oneus; i2<=i2+1; endif; whenlow_setup=> LCD_E0<='0'; SF_D0<=tx_byte(3downto0); if(i2=2)then tx_state<=low_hold; i2<=0; else tx_state<=low_setup; i2<=i2+1; endif; whenlow_hold=> LCD_E0<='1'; SF_D0<=tx_byte(3downto0); if(i2=12)then tx_state<=fortyus; i2<=0; else tx_state<=low_hold; i2<=i2+1; endif; whenfortyus=> LCD_E0<='0'; if(i2=2000)then tx_state<=done; i2<=0; else tx_state<=fortyus; i2<=i2+1; endif; whendone=> LCD_E0<='0'; if(tx_init='1')then tx_state<=high_setup; i2<=0; else tx_state<=done; i2<=0; endif; endcase; endif; endprocesstransmit; --specifiedbydatasheet power_on_initialize:process(clk,rst_n,init_init)--poweroninitializationsequence begin if(rst_n='0')then init_state<=idle; init_done<='0'; elsif(clk='1'andclk'event)then caseinit_stateis whenidle=> init_done<='0'; if(init_init='1')then init_state<=fifteenms; i<=0; else init_state<=idle; i<=i+1; endif; whenfifteenms=> init_done<='0'; if(i=750000)then init_state<=one; i<=0; else init_state<=fifteenms; i<=i+1; endif; whenone=> SF_D1<="0011"; LCD_E1<='1'; init_done<='0'; if(i=11)then init_state<=two; i<=0; else init_state<=one; i<=i+1; endif; whentwo=> LCD_E1<='0'; init_done<='0'; if(i=205000)then init_state<=three; i<=0; else init_state<=two; i<=i+1; endif; whenthree=> SF_D1<="0011"; LCD_E1<='1'; init_done<='0'; if(i=11)then init_state<=four; i<=0; else init_state<=three; i<=i+1; endif; whenfour=> LCD_E1<='0'; init_done<='0'; if(i=5000)then init_state

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论