交通信号灯控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通信号控制系统
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 IS
PORT(clk:IN STD_LOGIC;
reset:IN STD_LOGIC; --时钟输入
clk_out:out STD_LOGIC);
END ENTITY fenpin2m;
ARCHITECTURE one OF fenpin2m IS
signal count:integer range 0 to 1999999;
BEGIN
PROCESS(clk)
BEGIN
if reset='1' then
count<=0;
clk_out<='0';
else
if clk'EVENT and clk='1'THEN
IF count<999999 THEN
count<=count+1;
clk_out<='0';
ELSif count<1999999 then
count<=count+1;
clk_out<='1';
else
count<=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 --结构体开始
begin
PROCESS(CLK) --进程开始
V ARIABLE TMP:STD_LOGIC_vector(1 downto 0);
V ARIABLE d:STD_LOGIC_VECTOR(3 DOWNTO 0);
--中间变量
begin
IF(CLK'EVENT AND CLK='1')THEN --时钟上升沿有效
IF(TMP="00")THEN
TMP:="01";
d:=datain2;
CASE d IS
WHEN"0000"=>q<="00111111"; --0
WHEN"0001"=>q<="00000110"; --1
WHEN"0010"=>q<="01011011"; --2
WHEN"0011"=>q<="01001111"; --3
WHEN"0100"=>q<="01100110"; --4
WHEN"0101"=>q<="01101101"; --5
WHEN"0110"=>q<="01111101"; --6
WHEN"0111"=>q<="00000111"; --7
WHEN"1000"=>q<="01111111"; --8
WHEN"1001"=>q<="01100111"; --9
WHEN OTHERS=>q<="00000000"; --数码管不显示
END CASE;
elsif(tmp="01")then
TMP:="00"; --如果tmp为"001"即第2个数码管显示b输入
d:=datain1;
CASE d IS
WHEN"0000"=>q<="00111111"; --0
WHEN"0001"=>q<="00000110"; --1
WHEN"0010"=>q<="01011011"; --2
WHEN"0011"=>q<="01001111"; --3
WHEN"0100"=>q<="01100110"; --4
WHEN"0101"=>q<="01101101"; --5
WHEN"0110"=>q<="01111101"; --6
WHEN"0111"=>q<="00000111"; --7
WHEN"1000"=>q<="01111111"; --8
WHEN"1001"=>q<="01100111"; --9