VHDL编程实现交通灯控制(数电实验)解析_第1页
VHDL编程实现交通灯控制(数电实验)解析_第2页
VHDL编程实现交通灯控制(数电实验)解析_第3页
VHDL编程实现交通灯控制(数电实验)解析_第4页
VHDL编程实现交通灯控制(数电实验)解析_第5页
已阅读5页,还剩29页未读, 继续免费阅读

下载本文档

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

文档简介

交通灯设计一、试验目的1.了解可编程规律器件设计的流程;2.把握数码管动态扫描显示的实现方法;3.把握状态机的设计方法;4.把握进程的设计方法。长江大学电工电子示范中心二、设计任务与要求长江大学电工电子示范中心1.实现正常时序把握功能;2.实现特殊状态把握功能;3.实现信号灯点亮时间预置功能;4.将东西方向、南北方向的灯亮时间分别用数码管显示;5.在MAXPLUS或QuartusII开发平台上,承受VHDL或Verilog编程设计;6.对编写的程序进展编译仿真、修改,使仿真结果到达设计要求;7.下载并测试电路的规律功能。2.1、问题描述设计并实现一十字路口的红、绿、黄三色交通灯把握与显示电路,即每个路口设置一组红、黄、绿交通灯,按图1所示状况变化,以保证车辆、行人通行安全。图12,2、功能分析1.根本功能〔见前面图〕2.扩展功能〔1〕特殊状态把握功能特殊状态如紧急车辆随时通行功能受一开关把握,无急车时,信号灯按正常时序把握。有急车来时,将特殊状态开关按下,不管原来信号灯的状态如何,一律强制让两个方向的红灯同时点亮,制止其它车辆通行,同时计时停顿;特殊状态完毕后,恢复原来状态连续运行。〔2〕信号灯点亮时间预置功能把握电路在任何时候可依据实际状况修改信号灯点亮时间。2.3、设计思路:1.参考图1,定义交通灯的状态,确定状态表;状态东西方向南北方向时间(s)S0绿灯亮红灯亮TeS1黄灯亮红灯亮TyS2红灯亮绿灯亮TsS3红灯亮黄灯亮Ty三、程序设计思路1.状态转换的实现在进程中利用自定义数据类型定义交通灯的4个状态,依据东西、南北方向的时间计数器的计数结果利用CASE语句实现4个状态的转换,在每一个状态中利用内部信号传递实现对红黄绿灯的显示把握。FSM设计方法分析把握器设计指标,建立系统算法模型,即状态转换图;分析被控对象的时序,确定把握器的有限状态机的各个状态及输入、输出条件;应用VHDL语言完成状态机的描述。FSM分类Moore型:输出信号仅与现态相关Mealy型:输出信号与现态和输入相关DFFsOutput

Comb.LogicFeedback

Comb.LogicDFFsOutput

Comb.LogicFeedback

Comb.LogicMooreMealy现态次态输入输出现态次态输出输入FSM构成FSM用来解决一般时序规律电路问题,包括同步/异步时序规律状态存放器当前状态〔现态〕存放器组合规律电路下一状态〔次态〕组合规律输出组合规律Moore和Mealy状态机描述的区分就在于输出规律进程vhdl语言描述FSM的建立过程定义状态机的状态定义状态变量描述状态机的进程定义状态机的状态在使用状态机之前应当定义状态变量的枚举类型,可以定义在状态机描述的源文件中,或者是特地的程序包中。例子:TYPEstateIS〔state1,state2〕;交通灯typecoloris(greenred,yellowred,redgreen,redyellow);

定义状态变量定义两个状态机变量:当前状态和次态,其中当前状态描述的是一组存放器,而下状态描述的是组合规律。例:signalcurrent_state:state;signalnext_state:state;交通灯:signalcurrent_state:color:=redgreen;signalnext_state:color;描述状态机的进程状态机的描述方式:三进程、二进程、单进程(本试验承受)一般承受三个进程来描述状态机描述状态机存放器的时序进程描述次态产生规律的组合规律进程描述输出组合规律进程状态机存放器的时序进程process(reset,clk)beginifreset=”1”thencurrent_state<=初始状态;elserising_edge(clk)thencurrent_state<=next_state;endif;endprocess;确定要有复位信号,否则状态机处于随机状态,无法开头正常工作次态转移规律进程process(current_state,其他输入信号)beginnext_state<=current_state;casecurrent_stateiswhenstate1=>

.......next_state<=某个状态;..........whenstate2=>.......next_state<=某个状态;..........endcase;endprocess;状态转换的条件状态的表现次态转移规律进程在case语句之前,给nenxt_state赋一个缺省值:next_state<=current_state;其意义在于:当case语句中准备下状态的规律比较简洁时,就不用给全部的状况赋值,不关心的状况就保持原状态。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityStageControlis port( clk:instd_logic;--时钟 emergencykey:instd_logic;--紧急开关 time_h,time_l:outstd_logic_vector(3downto0);;--定时 red,green,yellow:outstd_logic_vector(3downto0);--红黄绿灯 );endStageControl;architecturebehavofStageControlistypecoloris(greenred,yellowred,redgreen,redyellow);--四种状态beginprocess(clk,emergencykey) variabletempr,tempg,tempy:std_logic_vector(3downto0);--三组灯的中间变量 variabletemp_h,temp_l:std_logic_vector(3downto0);--定时的中间变量 variabletemp_color:color:=greenred;--initialstage--当前状态的中间变量begin if(clk”eventandclk=”1”)then caseemergencykeyiswhen”1”=>--thenormalstage casetemp_colorisStageControl.VHD状态把握模块本模块是单进程模式,可改写为三进程模式whengreenred=>--initialstage tempr<=“1100“; tempg<=“0011“; tempy<=“1111“; casestagechangeiswhen”0”=> temp_h<=“0000“; temp_l<=“1001“; stagechange<=”1”; whenothers=> casetemp_lis when“0000“=> temp_l<=“1001“; temp_h<=temp_h-1; when“0001“=> casetemp_his when“0000“=>temp_h<=“0000“; temp_l<=“0000“; stagechange<=”0”; temp_color<=yellowred; whenothers=>temp_l<=“0000“; endcase; whenothers=> temp_l<=temp_l-1; endcase; endcase;其中一个状态的程序其他以此类推红黄绿灯的亮灭红黄绿灯亮灭的时间下一个状态Case:处于保持状态时时间的递减Case:推断状态的转换还是保持QuartusII设计及仿真状态机查看2.时间显示的实现东西、南北两个方向共用8个数码管显示时间,为节省规律器件的I/O,时间显示承受动态扫描的方法。动态扫描的根本原理是对于一组数码管动态扫描显示需要由两组信号来把握:一组是字段输出口输出的字形代码,用来把握显示的字形,称为段码;另一组是位输出口输出的把握信号,用来选择第几位数码管工作,称为位码。各位数码管的段线并联,段码的输出对各位数码管来说都是一样的。因此,在同一时刻假设各位数码管的位选线都处于选通状态的话,8位数码管将显示一样的字符。假设要各位数码管能够显示出与本位相应的字符,就只让这一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。设计框图:QuartusII设计及仿真entityscandisplayisport(clk,emergencykey:instd_logic; catn:outstd_logic_vector(3downto0);timeh1,timel1:instd_logic_vector(3downto0);num_out:outstd_logic_vector(6downto0) );endscandisplay;architecturebehavofscandisplayissignalnum_in:std_logic_vector(3downto0);signalcounter:integerrange0to1;signalled_chioce:std_logic;Beginprocess(clk);--数码管扫描beginif(clk”eventandclk=”1”)then counter<=counter+1; ifcounter=1then num_in<=timeh1; led_sel<=“101“; else num_in<=timel1; led_sel<=“100“; endif;endif;endprocess;process(num_in);--显示译码〔共阴?共阳〕begincasenum_iniswhen“0000“=>num_out<=?; 。。。。。 when“1001“=>num_out<=?;whenothers=>num_out<=?;endcase;endprocess;Endbehav扫描显示模块scandisplay.VHD分频clk_demultiplier.vhdentityclk_demultiplierisgeneric(div_fre_1kHz:integer:=24999;div_fre_1Hz:integer:=499);port(clk:instd_logic;clk_1kHz,clk_1Hz:bufferstd_logic);endentity;signalfre_1kHz:integerrange0todiv_fre_1kHz;signalfre_1Hz:integerrange0todiv_fre_1Hz;

beginprocess(clk)--将clk_1kHz=clk/50000beginifrising_edge(clk)thenif(fre_1kHz>=div_fre_1kHz)thenfre_1kHz<=0;clk_1kHz<=notclk_1kHz;elsefre_1kHz<=fre_1kHz+1;endif;endif;endprocess;process(clk_1kHz)

--将clk_1Hz=clk_1kHz/1000beginifrising_edge(clk_1kHz)thenif(fre_1Hz>=div_fre_1Hz)thenfre_1Hz<=0;clk_1Hz<=notclk_1Hz;elsefre_1Hz<=fre_1Hz+1;endif;endif;endprocess;

endbehav;libraryieee;useieee.std_logic_1164.all;entitytraffic_light_controlisport( clk,emergencykey:instd_logic; red,green,yellow:outstd_logic_vector(3downto0); led_seg:outstd_logic_vector(7downto0); led_sel:outstd_logic_vector(2downto0) );endtraffic_light_control;architecturebehavoftraffic_light_controlissignalscan_clk,count_clk,temp_key,temp_show:std_logic;signaltemp_sel:std_logic;signaltemp_h,temp_l:std_logic_vector(3downto0);componentclk_demultiplierisgeneric(div_fre_1kHz:integer:=24999;div_fre_1Hz:integer:=499);port(clk:instd_logic;clk_1kHz,clk_1Hz:outstd_logic);endcomponent;componentscandisplayis port( clk:instd_logic; led_sel:outstd_logic_vector(2downto0); time_h,time_l:instd_logic_vector(3downto0); led_segcode:outstd_logic_vector(7downto0) );endcomponent;componentStageControlis port( clk:instd_logic; emergencykey:instd_logic; time_h,time_l:outstd_logic_vector(3downto0); red,green,yellow:outstd_logic_vector(3downto0) );endcomponent;beginu0:clk_demultiplierportmap(clk=>clk,clk_1kHz=>scan_clk,clk_1Hz=>count_clk); u1:StageControlportmap(clk=>count_clk,emergencykey=>emergencykey,red=>red,green=>green,yellow=>yellow,time_h=>temp_h,time_l=>temp_l); u2:scandisplayportmap(clk=>scan_clk,time_h=>temp_h,time_l=>temp_l,led_segcode=>led_seg,led_sel=>led_sel);end;顶层实体:traffic_light_control.vhd交通灯把握的RTL示意图引脚锁定:长江大学电工电子示范中心三、提示数码管:a(pin_171)b(pin_174)c(pin_176)

d(pin_181)

e(pin_183)f(pin_185)

g(pin_187)

DR(pin_189)

共阴极数码管片选:

LED_SEL2(pin_199)

LED_SEL1(pin_197)LED_SEL0(pin_195)

芯片:

CycloneIII,EP3C16Q240C8试验箱数码管电路图数码管是4位8段共阴极型,引脚6、8、9、12为位选端,对应从右至左的4位数码管的共阴极,低电平有效;引脚11、7、4、2、1、10、5、3对应数码管的a~g、DR等8段LED灯,高电平发亮。LED东西南北方向:红色r

L11(pin_214)

红色rL5(pin_186)

红色rL6(pin_188)红色r

L0(pin_173)

黄色y

L10(pin_203)黄色y

L4(pin_184)

温馨提示

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

最新文档

评论

0/150

提交评论