340 likes | 522 Views
长江大学电工电子示范中心. 交通灯设计. 一、实验目的. 1 .了解可编程逻辑器件设计的流程; 2 .掌握数码管动态扫描显示的实现方法; 3 .掌握状态机的设计方法; 4 .掌握进程的设计方法。. 长江大学电工电子示范中心. 二、设计任务与要求. 1 .实现正常时序控制功能; 2 .实现特殊状态控制功能; 3 .实现信号灯点亮时间预置功能; 4 .将东西方向、南北方向的灯亮时间分别用数码管显示; 5 .在 MAX PLUS 或 Quartus II 开发平台上,采用 VHDL 或 Verilog 编程设计;
E N D
长江大学电工电子示范中心 交通灯设计 一、实验目的 1.了解可编程逻辑器件设计的流程; 2.掌握数码管动态扫描显示的实现方法; 3.掌握状态机的设计方法; 4.掌握进程的设计方法。
长江大学电工电子示范中心 二、设计任务与要求 1.实现正常时序控制功能; 2.实现特殊状态控制功能; 3.实现信号灯点亮时间预置功能; 4.将东西方向、南北方向的灯亮时间分别用数码管显示; 5.在MAX PLUS或Quartus II开发平台上,采用VHDL或Verilog编程设计; 6.对编写的程序进行编译仿真、修改,使仿真结果达到设计要求; 7.下载并测试电路的逻辑功能。
2.1、问题描述 设计并实现一十字路口的红、绿、黄三色交通灯控制与显示电路,即每个路口设置一组红、黄、绿交通灯,按图1所示情况变化,以保证车辆、行人通行安全。 图1
2,2、功能分析 1.基本功能(见前面图) 2.扩展功能 (1)特殊状态控制功能 特殊状态如紧急车辆随时通行功能受一开关控制,无急车时,信号灯按正常时序控制。有急车来时,将特殊状态开关按下,不管原来信号灯的状态如何,一律强制让两个方向的红灯同时点亮,禁止其它车辆通行,同时计时停止;特殊状态结束后,恢复原来状态继续运行。 (2)信号灯点亮时间预置功能 控制电路在任何时候可根据实际情况修改信号灯点亮时间。
2.3、设计思路: 1.参考图1,定义交通灯的状态,确定状态表;
三、程序设计思路 1.状态转换的实现 在进程中利用自定义数据类型定义交通灯的4个状态,根据东西、南北方向的时间计数器的计数结果利用CASE语句实现4个状态的转换,在每一个状态中利用内部信号传递实现对红黄绿灯的显示控制。
FSM设计方法 • 分析控制器设计指标,建立系统算法模型,即状态转换图; • 分析被控对象的时序,确定控制器的有限状态机的各个状态及输入、输出条件; • 应用VHDL语言完成状态机的描述。
FSM分类 • Moore型:输出信号仅与现态相关 • Mealy型:输出信号与现态和输入相关 输出 输出 OutputComb. Logic OutputComb. Logic 现态 现态 DFFs FeedbackComb. Logic DFFs FeedbackComb. Logic 次态 输入 次态 Moore Mealy 输入
FSM 构成 FSM用来解决一般时序逻辑电路问题,包括同步/异步时序逻辑 • 状态寄存器 • 当前状态(现态)寄存器 • 组合逻辑电路 • 下一状态(次态)组合逻辑 • 输出组合逻辑 Moore和Mealy状态机描述的区别就在于输出逻辑进程
vhdl语言描述FSM的建立过程 • 定义状态机的状态 • 定义状态变量 • 描述状态机的进程
定义状态机的状态 • 在使用状态机之前应该定义状态变量的枚举类型,可以定义在状态机描述的源文件中,或者是专门的程序包中。 • 例子: TYPE state IS (state1,state2); 交通灯 type color is(greenred,yellowred,redgreen,redyellow);
定义状态变量 • 定义两个状态机变量:当前状态和次态,其中当前状态描述的是一组寄存器,而下状态描述的是组合逻辑。 • 例: signal current_state:state; signal next_state:state; 交通灯: signal current_state:color:=redgreen; signal next_state:color;
描述状态机的进程 状态机的描述方式: 三进程、二进程、单进程(本实验采用) 一般采用三个进程来描述状态机 描述状态机寄存器的时序进程 描述次态产生逻辑的组合逻辑进程 描述输出组合逻辑进程
状态机寄存器的时序进程 process(reset,clk) begin if reset='1' then current_state<=初始状态; else rising_edge(clk) then current_state<=next_state; end if; end process; 一定要有复位信号,否则状态机处于随机状态,无法开始正常工作
次态转移逻辑进程 process(current_state,其他输入信号) begin next_state<=current_state; case current_state is when state1 => ....... next_state<=某个状态; .......... when state2 => ....... next_state<=某个状态; .......... end case; end process; 状态的表现 状态转换的条件
次态转移逻辑进程 在case语句之前,给nenxt_state赋一个缺省值: next_state<=current_state; 其意义在于: 当case语句中决定下状态的逻辑比较复杂时,就不用给所有的情况赋值,不关心的情况就保持原状态。
StageControl.VHD状态控制模块 本模块是单进程模式, 可改写为三进程模式 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_unsigned.all; • entity StageControl is • port( • clk:in std_logic;--时钟 • emergencykey:in std_logic; --紧急开关 • time_h,time_l:out std_logic_vector(3 downto 0); ; --定时 • red,green,yellow:out std_logic_vector(3 downto 0) ;--红黄绿灯 • ); • end StageControl; • architecture behav of StageControl is • type color is(greenred,yellowred,redgreen,redyellow); --四种状态 • begin • process(clk,emergencykey) • variable tempr,tempg,tempy:std_logic_vector(3 downto 0);--三组灯的中间变量 • variable temp_h,temp_l:std_logic_vector(3 downto 0);--定时的中间变量 • variable temp_color:color:=greenred; --initial stage--当前状态的中间变量 • begin • if(clk'event and clk='1')then • case emergencykey is • when '1'=> --the normal stage • case temp_color is
红黄绿灯的亮灭 Case:判断状态的转换还是保持 • when greenred=> --initial stage • tempr<="1100"; • tempg<="0011"; • tempy<="1111"; • case stagechange is • when '0' => • temp_h<="0000"; • temp_l<="1001"; • stagechange<='1'; • when others => • case temp_l is • when "0000"=> • temp_l<="1001"; • temp_h<=temp_h-1; • when "0001"=> • case temp_h is • when "0000" => • temp_h<="0000"; • temp_l<="0000"; • stagechange<='0'; • temp_color<=yellowred; • when others => • temp_l<="0000"; • end case; • when others=> • temp_l<=temp_l-1; • end case; • end case; Case:处于保持状态时时间的 递减 红黄绿灯亮灭的时间 下一个状态 其中一个状态的程序 其他以此类推
2.时间显示的实现 东西、南北两个方向共用8个数码管显示时间,为节省逻辑器件的I/O,时间显示采用动态扫描的方法。动态扫描的基本原理是对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。 因此,在同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位数码管能够显示出与本位相应的字符,就只让这一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
扫描显示模块scandisplay.VHD • if counter=1 then • num_in<=timeh1; • led_sel<="101"; • else • num_in<=timel1; • led_sel<="100"; • end if; • end if; • end process; • entity scandisplay is • port( • clk,emergencykey:in std_logic; • catn:out std_logic_vector(3 downto 0); • timeh1,timel1:in std_logic_vector(3 downto 0); • num_out:out std_logic_vector(6 downto 0) • ); • end scandisplay; • architecture behav of scandisplay is • signal num_in: std_logic_vector(3 downto 0); • signal counter:integer range 0 to 1; • signal led_chioce:std_logic; • Begin • process(clk) ; --数码管扫描 • begin • if(clk'event and clk='1')then • counter<=counter+1; • process(num_in) ; --显示译码(共阴?共阳) • begin • case num_in is • when "0000"=>num_out<=?; • 。。。。。 • when "1001"=>num_out<=?; • when others=>num_out<=?; • end case; • end process; • End behav
分频clk_demultiplier.vhd • fre_1kHz<=fre_1kHz+1; • end if; • end if; • end process; • process(clk_1kHz) • --将clk_1Hz =clk_1kHz/1000 • begin • if rising_edge(clk_1kHz) then • if(fre_1Hz>=div_fre_1Hz) then • fre_1Hz<=0; • clk_1Hz<=not clk_1Hz; • else • fre_1Hz<=fre_1Hz+1; • end if; • end if; • end process; • end behav; • entity clk_demultiplier is • generic(div_fre_1kHz:integer:=24999; • div_fre_1Hz:integer:=499 • ); • port( • clk:in std_logic; • clk_1kHz,clk_1Hz:buffer std_logic • ); • end entity; • signal fre_1kHz:integer range 0 to div_fre_1kHz; • signal fre_1Hz:integer range 0 to div_fre_1Hz; • begin • process(clk) --将clk_1kHz =clk/50000 • begin • if rising_edge(clk) then • if(fre_1kHz>=div_fre_1kHz) then • fre_1kHz<=0; • clk_1kHz<=not clk_1kHz; • else
顶层实体: traffic_light_control.vhd port( clk:in std_logic; clk_1kHz,clk_1Hz:out std_logic ); end component; component scandisplay is port( clk:in std_logic; led_sel:out std_logic_vector(2 downto 0); time_h,time_l:in std_logic_vector(3 downto 0); led_segcode:out std_logic_vector(7 downto 0) ); end component; component StageControl is port( clk:in std_logic; emergencykey:in std_logic; time_h,time_l:out std_logic_vector(3 downto 0); red,green,yellow:out std_logic_vector(3 downto 0) ); end component; • library ieee; • use ieee.std_logic_1164.all; • entity traffic_light_control is • port( • clk,emergencykey:in std_logic; • red,green,yellow:out std_logic_vector(3 downto 0); • led_seg:out std_logic_vector(7 downto 0); • led_sel:out std_logic_vector(2 downto 0) • ); • end traffic_light_control; • architecture behav of traffic_light_control is • signal scan_clk,count_clk, temp_key, temp_show: std_logic; • signal temp_sel: std_logic; • signal temp_h,temp_l: std_logic_vector(3 downto 0); • component clk_demultiplier is • generic(div_fre_1kHz:integer:=24999; • div_fre_1Hz:integer:=499 • ); begin u0:clk_demultiplier port map(clk=>clk, clk_1kHz=>scan_clk, clk_1Hz=>count_clk); u1:StageControl port map(clk=>count_clk, emergencykey=>emergencykey, red=>red, green=>green,yellow=>yellow,time_h=>temp_h, time_l=>temp_l); u2:scandisplay port map(clk=>scan_clk,time_h=>temp_h,time_l=>temp_l,led_segcode=>led_seg,led_sel=>led_sel); end;
长江大学电工电子示范中心 三、提示 芯片: Cyclone III,EP3C16Q240C8 引脚锁定: 数码管: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)
试验箱数码管电路图 数码管是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) 红色r L5 (pin_186) 红色r L6 (pin_188) 红色rL0 (pin_173) 黄色y L10 (pin_203) 黄色y L4 (pin_184) 黄色y L7 (pin_194) 黄色y L1 (pin_175) 绿色g L9(pin_201) 绿色g L3 (pin_182) 绿色g L8 (pin_196) 绿色gL2 (pin_177) CLK: (pin_33) KEY: (pin_72)
长江大学电工电子示范中心 四、思考题 1.位扫描时间间隔长短对路口时间显示效果影响如何? 2.若东西方向和南北方向的控制时间不等时,状态机中如何预置东西方向和南北方向的控制时间? 3.用8个数码管显示时间信息设计中,采用动态扫描方法,占用逻辑器件多少个I/O?若采用静态方式显示,占用逻辑器件多少个I/O?设计中有何变化? 4.仿真中如何设置状态机中东西、南北方向的预置时间? 5.程序编译完后生成*.sof和*.pof两个文件,这两个文件的差别是什么?实验过程中下载*.sof还是*.pof?
长江大学电工电子示范中心 五、实验报告 1.课题的任务及要求。 2.课题分析与编程思路。 对课题认真分析,正确理解,明确设计思路。 3.仿真结果分析。 建立测试向量文件,然后编译该文件,进行功能仿真 和时序仿真,给出仿真结果并进行分析。 4.实验测试、问题分析与研究。 实验设备清单(名称、型号、数量等); 调试和测试过程简介,故障分析及解决办法; 第四项中的问题解答。 5.实验设计中各功能模块的源程序。(作为附录) 6.总结。 总结课题存在的问题,提出改进的设想; 完成本课题后的收获、体会和建议。