交通信号灯控制系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档