交通信号控制系统1. 设计任务设计一个十字路口交通控制系统,要求:(1)东西(用A表示)、南北(用B表示)方向均有绿灯、黄灯、红灯指示,其持续时间分别是30秒、3秒和30秒,交通灯运行的切换示意图如图1-1所示。
(2)系统设有时钟,以倒计时方式显示每一路允许通行的时间。
(3)当东西或南北两路中任意一路出现特殊情况时,系统可由交警手动控制立即进入特殊运行状态,即红灯全亮,时钟停止记时,东西、南北两路所有车辆停止通行;当特殊运行状态结束后,系统恢复工作,继续正常运行。
2.总体框图本系统主要由分频计、计数器和控制器等电路组成,总体框图如1-2所示。
分频计将晶振送来的信号变为1Hz时钟信号;当紧急制动信号无效时,选择开关将1Hz脉冲信号送至计数器进行倒计时计数,并使控制器同步控制两路红、黄、绿指示灯时序切换;当紧急制动信号有效时,选择开关将紧急制动信号送至计数器使其停止计数,同时控制器控制两路红灯全亮,所有车辆停止运行。
2-1 交通灯总体结构框图3 模块设计(1)分频器设晶振产生的信号为2MHz,要求输出1Hz时钟信号,则分频系数为2M,需要21位计数器。
用VHDL设计的2M分频器文本文件如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY fenpin2m ISPORT(clk:IN STD_LOGIC;reset:IN STD_LOGIC; --时钟输入clk_out:out STD_LOGIC);END ENTITY fenpin2m;ARCHITECTURE one OF fenpin2m ISsignal count:integer range 0 to 1999999;BEGINPROCESS(clk)BEGINif reset='1' thencount<=0;clk_out<='0';elseif clk'EVENT and clk='1'THENIF count<999999 THENcount<=count+1;clk_out<='0';ELSif count<1999999 thencount<=count+1;clk_out<='1';elsecount<=0;END IF;END IF;END IF;END PROCESS ;END one;(2) 模30倒计时计数器采用原理图输入法,用两片74168实现。
74168为十进制可逆计数器,当U/DN=0时实现9~0减法计数,记到0时TCN=0;当U/DN=1时实现0~9加法计数,计到9时TCN=0;ENTN+ENPN=0时执行计数,否则计数器保持。
该电路执行减法计数,当两片计数器计到0时同步置数,因此该计数器的计数范围是29~0,当系统检测到紧急制动信号有效时,CP=0计数器停止计数。
图3-1 模30减法计数器电路图图3-2 模30减法计数器仿真波形(3)显示译码器显示译码器为动态显示,用VHDL文本输入法设计的七子段译码器如下:图3-3 显示译码器的仿真波形LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; --调用库文件ENTITY xianshi IS --实体开始PORT(CLK:IN STD_LOGIC;datain1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--扫描时钟信号SEL:OUT STD_LOGIC_VECTOR(1 DOWNTO 0); --数码管选择信号q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --数码管八端输入end xianshi; --实体结束ARCHITECTURE one OF xianshi IS --结构体开始beginPROCESS(CLK) --进程开始V ARIABLE TMP:STD_LOGIC_vector(1 downto 0);V ARIABLE d:STD_LOGIC_VECTOR(3 DOWNTO 0);--中间变量beginIF(CLK'EVENT AND CLK='1')THEN --时钟上升沿有效IF(TMP="00")THENTMP:="01";d:=datain2;CASE d ISWHEN"0000"=>q<="00111111"; --0WHEN"0001"=>q<="00000110"; --1WHEN"0010"=>q<="01011011"; --2WHEN"0011"=>q<="01001111"; --3WHEN"0100"=>q<="01100110"; --4WHEN"0101"=>q<="01101101"; --5WHEN"0110"=>q<="01111101"; --6WHEN"0111"=>q<="00000111"; --7WHEN"1000"=>q<="01111111"; --8WHEN"1001"=>q<="01100111"; --9WHEN OTHERS=>q<="00000000"; --数码管不显示END CASE;elsif(tmp="01")thenTMP:="00"; --如果tmp为"001"即第2个数码管显示b输入d:=datain1;CASE d ISWHEN"0000"=>q<="00111111"; --0WHEN"0001"=>q<="00000110"; --1WHEN"0010"=>q<="01011011"; --2WHEN"0011"=>q<="01001111"; --3WHEN"0100"=>q<="01100110"; --4WHEN"0101"=>q<="01101101"; --5WHEN"0110"=>q<="01111101"; --6WHEN"0111"=>q<="00000111"; --7WHEN"1000"=>q<="01111111"; --8WHEN"1001"=>q<="01100111"; --9WHEN OTHERS=>q<="00000000"; --数码管不显示END CASE;end if;end if;sel<=tmp; --把tmp的值赋予selend process; --进程结束end one;(4)控制器该模块输入为1Hz时钟,和紧急制动信号PE,输出为两路红、黄、绿指示灯,当紧急制动信号无效(PE=1)时,两路红、黄、绿灯时序切换。
当紧急制动信号有效时,选项开关将紧急制动信号送至计数器使其停止计数,同时使控制器控制两路红灯全亮,所有车辆停止通行。
用VHDL文本输入法设计的控制器如下;图3-4控制器的仿真波形LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY contr ISPORT(cp1:IN STD_LOGIC;pe:IN STD_LOGIC;chan:IN STD_LOGIC;ra,ga,ya,rb,gb,yb:out STD_LOGIC);END ENTITY contr;ARCHITECTURE one OF contr ISsignal count:integer range 0 to 59;BEGINprocess(cp1)beginif pe='0'thencount<=0;elseIF(cp1'EVENT AND cp1='1') THENif count<59 thencount<=count+1;elsecount<=0;end if;end if;end if;END PROCESS;PROCESSBEGINif pe='1'thenif chan='1' thenif count<30 thenrb<='0';gb<='1';yb<='1';ra<='1';if count<27 thenga<='0';ya<='1';elsega<='1';ya<='0';end if;elserb<='1';ga<='1';ya<='1';ra<='0';if count<57 thengb<='0';yb<='1';elsegb<='1';yb<='0';end if;end if;elseif count<30 thenrb<='1';ga<='1';ya<='1';ra<='0';if count<27 thengb<='0';yb<='1';elsegb<='1';yb<='0';end if;elserb<='0';gb<='1';yb<='1';ra<='1';if count<57 thenga<='0';ya<='1';elsega<='1';ya<='0';end if;end if;end if;elserb<='0';ra<='0';gb<='0';yb<='0';ga<='0';ya<='0';end if;end process;end one;4 交通灯原理图图4-1 交通灯原理图。