当前位置:文档之家› 北邮数字电路综合实验报告——交通灯控制器的VHDL实现

北邮数字电路综合实验报告——交通灯控制器的VHDL实现

数字电路综合实验报告班级:姓名:班内序号:学号:日期:目录一、实验摘要 (3)二、实验任务 (3)1.任务要求 (3)2.任务解析 (3)三、实验设计思路 (4)1.状态转移图 (4)2.流程图 (5)3.模块确定 (5)4.系统框图 (7)四、程序代码 (7)⒈主程序 (7)⒉分频模块 (9)⒊防抖模块 (10)⒋交通灯控制模块 (11)⒌数字译码模块 (14)五、实验结果 (15)1.仿真结果 (15)2.实物结果 (17)六、所遇问题分析 (17)七、实验总结 (18)交通灯控制器的VHDL实现一、实验摘要随着交通情况的日益复杂,交通灯在生活中所处的位置也越来越高。

本实验就是基于VHDL语言编程实现了十字路口的交通灯控制器。

对于交通等控制器的设计是分模块自顶向下的设计思想,软硬件结合来实现本设计。

关键字:交通灯、VHDL、控制器二、实验任务1.任务要求1)南北和东西方向各有一组绿、黄、红灯用于指挥交通,绿灯、黄灯和红灯的持续时间分别为20秒、5秒和25秒;2)当有特殊情况(如消防车、救护车等)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,继续正常运行;3)用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间;2.任务解析东西(A车道)和南北(B车道)方向各有一组绿、黄、红灯用于指挥交通(如图1),绿灯、黄灯和红灯的持续时间分别为20 秒、5 秒和25 秒。

图1 十字路口交通灯模型因此,可以设计如下四个状态,其关系为:状态亮灯情况车辆行驶状况持续时间(秒)下一状态A车道B车道S0 红亮红亮紧急状况,A/B车道均禁止通行~ S1S1 绿亮红亮A车道通行,B车道禁止通行20 S2S2 黄亮红亮A车道缓行,B车道禁止通行 5 S3S3 红亮绿亮A车道禁止通行,B车道通行20 S4S4 红亮黄亮A车道禁止通行,B车道缓行 5 S1三、实验设计思路1.状态转移图图2 状态转移图2.流程图图3 流程图3.模块确定⑴分频模块设计原因:由于实验板只能提供50MHz的时钟信号,而电路中只能使用较低频率的时钟:1Hz时钟信号:计数器count变化时使用;20Hz时钟信号:在防抖电路中使用的时钟信号;1kHz时钟信号哦:用于数码管位选信号的改变的时钟信号。

功能:用于将实验板上的50MHz的时钟信号经分频后输出:1kHz、20Hz、1Hz。

图4 分频模块的输入和输出⑵防抖动模块设计原因:只要有按键或是拨码开关,防抖电路就是不可缺少的一个模块。

否则,按键信号中的一些毛刺和抖动往往会引起电路不可预知的错误。

功能:将带有抖动的信号进行识别和判断,输出持续时间超过0.1s的高电平信号。

图5 防抖动模块的输入和输出⑶交通灯控制模块设计原因:这个模块是本程序设计的灵魂,是重中之重!这个模块用于控制电路的状态改变和按键响应,也就是系统中控制器的作用。

功能:根据按键信号和输入时钟,输出符合交通灯状态变化规律的LED驱动信号、数码管显示的数据、数码管位选信号。

图6 交通灯控制模块的输入和输出⑷数字译码模块设计原因:由于交通灯控制模块输出的为数码管显示的数据,为10进制数,因此必须要一个译码电路,将此十进制数转化为LED灯的驱动信号,而这个功能正是由此模块完成。

功能:将输入的十进制数转变为相应的8位2二进制数作为数码管的驱动信号。

图7 数字译码模块的输入和输出⑸整体模块连接图图8 模块整体连接图4.系统框图图9 系统框图四、程序代码⒈主程序--------------------------------主程序--------------------------------library ieee;use ieee.std_logic_1164.all;entity traffic_lights isport(clk:in std_logic; ----------时钟信号emerg,reset:in std_logic; ----------复位和紧急情况信号seg:out std_logic_vector(7 downto 0); ---------7段数码管显示select_led:out std_logic_vector(5 downto 0); ---------选通输出lights:out std_logic_vector(7 downto 0));-------led发光管输出end traffic_lights;architecture a of traffic_lights is -------分别调用各个模块signal cp1k,cp20,cp1,resetout,emergout:std_logic;signal number:integer range 0 to 9;component freq_divide -------分频模块 1k 100hz 1hzport(clk_in:in std_logic;clk_1,clk_20,clk_1k:out std_logic);end component;component noshake -------分频模块 1k 100hz 1hzport(clk_20,keyin:in std_logic;keyout:out std_logic);end component;component traffic -------交通灯控制模块port(clk1,clk1k:in std_logic;emerg,reset:in std_logic;num:out integer range 0 to 9;lights:out std_logic_vector(7 downto 0);select_led:out std_logic_vector(5 downto 0));end component;component display --------数字译码模块port(num:in integer range 0 to 9;seg:out std_logic_vector(7 downto 0));end component;beginu1:freq_divide port map(clk,cp1,cp20,cp1k); ----分频器产生时钟信号u2:noshake port map(cp20,reset,resetout); ----对复位信号防抖处理u3:noshake port map(cp20,emerg,emergout); ----对紧急信号防抖处理u4:traffic port map(cp1,cp1k,emergout,resetout,number,lights,select_led);----状态机运转u5:display port map(number,seg); ----数码管显示end;⒉分频模块--------------------------------分频模块--------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity freq_divide isport(clk_in : in std_logic;clk_1,clk_20,clk_1k : out std_logic);end;architecture a of freq_divide issignal count1 : integer range 0 to 24999;signal count2 : integer range 0 to 24;signal count3 : integer range 0 to 9;signal clk_tmp1,clk_tmp2,clk_tmp3: std_logic;begin----------------50000分频进程-------------------输出:1kHz的时钟信号---功能:用于数码管显示时刷新频率p1:process(clk_in)beginif (clk_in'event and clk_in='1') thenif count1=24999 thencount1<=0;clk_tmp1<= not clk_tmp1;elsecount1<=count1+1;end if;end if;end process p1;----------------50分频进程-------------------输出:20Hz的时钟信号---功能:防抖动电路中使用p2:process(clk_tmp1)beginif (clk_tmp1'event and clk_tmp1='1') thenif count2=24 thencount2<=0;clk_tmp2<= not clk_tmp2;elsecount2<=count2+1;end if;end if;end process p2;----------------20分频进程-------------------输出:1Hz的时钟信号---用于状态转变的时钟信号p3:process(clk_tmp2)beginif (clk_tmp2'event and clk_tmp2='1') thenif count3=9 thencount3<=0;clk_tmp3<= not clk_tmp3;elsecount3<=count3+1;end if;end if;end process p3;clk_1<=clk_tmp3;clk_20<=clk_tmp2;clk_1k<=clk_tmp1;end;⒊防抖模块--------------------------------防抖动模块--------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity noshake isport(clk_20,keyin: in std_logic;keyout: out std_logic);end;architecture a of noshake issignal cp:std_logic;begin----------------只有持续时间高于0.1s的高电平才有效---------------- process(clk_20)variable times:integer range 0 to 2;beginif (clk_20'event and clk_20='1') thenif keyin='1' thenif times=2 thentimes:=times;else times:=times+1;end if;else times:=0;end if;end if;if times=2 thencp<='1';else cp<='0';end if;keyout<=cp;end process;end;⒋交通灯控制模块--------------------------------交通灯控制模块--------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity traffic isport(clk1,clk1k:in std_logic;emerg,reset:in std_logic;num:out integer range 0 to 9;lights:out std_logic_vector(7 downto 0);select_led:out std_logic_vector(5 downto 0));end traffic;architecture control of traffic istype states is(s0,s1,s2,s3,s4);signal state:states;signal num1,num2,num3,num4:integer range 0 to 9;signal emerg_status,reset_status:std_logic:='0';signal count:integer range 1 to 50 :=50;begin----------------紧急信号的处理进程----------------p1:process(emerg)beginemerg_status<=emerg;end process p1;----------------复位信号处理及计数器count控制进程----------------p2:process(reset)beginreset_status<=reset;end process p2;p3:process(clk1)beginif(reset_status='1') thencount<=50;elsif(emerg_status='1') thencount<=count;elseif(clk1'event and clk1='1') thenif count=1 thencount<=50;else count<=count-1;end if;end if;end if;end process;----------------核心状态机----------------p4:process(emerg_status,count)----根据计数器来选择交通灯状态beginif(emerg_status='1')then state<=s0; -------6个正常状态和1个紧急情况状态elseif(count>=31)then state<=s1;elsif(count<=30 and count>=26)then state<=s2;elsif(count<=25 and count>=6)then state<=s3;else state<=s4;end if;end if;case state is ---- 交通灯状态,用LED发光管模拟交通灯when s0=>lights<="10010000"; --;RA/RBwhen s1=>lights<="00110000"; --;GA/RBwhen s2=>lights<="01010000"; --;YA/RBwhen s3=>lights<="10000100"; --;RA/GBwhen s4=>lights<="10001000"; --;RA/YBend case;end process;----------------根据计数器值确定数码管显示数字---------------- p5:process(emerg_status,count)beginif(emerg_status='1') -------紧急状态下数码管显示8 then num1<=8;num2<=8;num3<=8;num4<=8;else----状态S1if(count=50)then num1<=2;num2<=0;num3<=2;num4<=5;elsif(count>=45 and count<50)then num1<=1;num2<=count-40;num3<=2;num4<=count-45;elsif(count>=40 and count<=44)then num1<=1;num2<=count-40;num3<=1;num4<=count-35;elsif(count>=35 and count<=39)then num1<=0;num2<=count-30;num3<=1;num4<=count-35;elsif(count>=31 and count<=34)then num1<=0;num2<=count-30;num3<=0;num4<=count-25;----状态S2elsif(count>=26 and count<=30)then num1<=0;num2<=count-25;num3<=0;num4<=count-25;----状态S3elsif(count=25)then num1<=2;num2<=5;num3<=2;num4<=0;elsif(count>=20 and count<=24)then num1<=2;num2<=count-20;num3<=1;num4<=count-15;elsif(count>=15 and count<=19)then num1<=1;num2<=count-10;num3<=1;num4<=count-15;elsif(count>=14 and count<=10)then num1<=1;num2<=count-10;num3<=0;num4<=count-5;----状态S4elsif(count>=6 and count<=9)then num1<=1;num2<=count;num3<=0;num4<=count-5;else num1<=0;num2<=count;num3<=0;num4<=count;end if;end if;end process;----------------数码管选通信号输出----------------p6:process(clk1k)variable temp:integer range 0 to 3;beginif(clk1k'event and clk1k='1')thencase temp iswhen 0=>num<=num1;temp:=1;select_led<="011111"; -------选用4个数码管输出倒计时when 1=>num<=num2;temp:=2;select_led<="101111";when 2=>num<=num3;temp:=3;select_led<="111101";when 3=>num<=num4;temp:=0;select_led<="111110";end case;end if;end process;end;⒌数字译码模块--------------------------------数字译码模块------------------------------ library ieee;use ieee.std_logic_1164.all;entity display isport(num:in integer range 0 to 9;seg:out std_logic_vector(7 downto 0));end;architecture a of display isbegind1:process(num)begincase num iswhen 0=>seg<="00111111"; ------------由七位二进制数表示0到9 when 1=>seg<="00000110";when 2=>seg<="01011011";when 3=>seg<="01001111";when 4=>seg<="01100110";when 5=>seg<="01101101";when 6=>seg<="01111101";when 7=>seg<="00000111";when 8=>seg<="01111111";when 9=>seg<="01101111";when others=>seg<="XXXXXXXX";end case;end process;end;五、实验结果1.仿真结果⑴仿真说明由于分频模块的存在,导致无法整体仿真(可能可以,但是很费时间)。

相关主题