EDA课程设计报告(交通信号控制器的VHDL的设计)[详细]

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

交通信号控制器的VHDL的设计

一、设计任务

模拟十字路口交通信号灯的工作过程,利用实验板上的两组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器.能达到的要求:

(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;

(2)交通灯红变绿是直接进行的,没有间隔时间;

(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;

(4)在任意时间,显示每个状态到该状态结束所需的时间.

支干道

主干道

图1 路口交通管理示意图

二、设计原理

1、设计目的:

学习DEA开发软件和QuartusII的使用方法,熟悉可编程逻辑器件的使用.通过制作来了解交通灯控制系统,交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制

2、设计说明

(1)第一模块:clk时钟秒脉冲发生电路

在红绿灯交通信号系统中,大多数情况是通过自动控制的方式指挥交通的.因此为了避免意外事件的发生,电路必须给一个稳定的时钟(clock)才能让系统正常运作.

模块说明:

系统输入信号:

Clk: 由外接信号发生器提供256的时钟信号;

系统输出信号: full:产生每秒一个脉冲的信号;

(2)第二模块:计数秒数选择电路

计数电路最主要的功能就是记数负责显示倒数的计数值,对下一个模块提供状态转换信号. 模块说明:

系统输入:full: 接收由clk电路的提供的1hz的时钟脉冲信号;

系统输出信号: t米: 产生显示电路状态转换信号

tl:倒计数值秒数个位变化控制信号

th:倒计数值秒数十位变化控制信号

(3)第三模块:红绿灯状态转换电路

本电路负责红绿灯的转换.

模块说明:

系统输入信号:full: 接收由clk电路的提供的1hz的时钟脉冲信号;

t米: 接收计数秒数选择电路状态转换信号;

系统输出信号: co米b_out: 负责红绿灯的状态显示.

(4)第四模块:时间显示电路

本电路负责红绿灯的计数时间的显示.

模块说明:

系统输入信号:tl:倒计数值秒数个位变化控制信号;

th:倒计数值秒数十位变化控制信号;

系统输出信号: led7s1: 负责红绿灯的显示秒数个位.

led7s2: 负责红绿灯的显示秒数十位.

三、设计方案

图2 交通信号灯控制器的原理框图

采用VHDL语言输入的方式实现交通信号灯控制器

间显示数据输

信号灯输出

图3 交通信号灯控制器程序原理框图

该程序由7个进程组成,进程P1和P2将CLK信号分频后产生1秒信号,进程P3、P4、P5构成两个带有预置数功能的十进制计数器,其中P4产生允许十位计数器计数的控制信号.进程P6实现状态转换和产生状态转换的控制信号,进程P7产生次态信号和信号灯输出信号,以及每一个状态的时间值.

四、VHDL程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY traffic IS

PORT (clk:in std_logic;

led7s1:out std_logic_vector(6 downto 0);

led7s2:out std_logic_vector(6 downto 0);

co米b_out:out std_logic_vector(5 downto 0));

END;

ARCHITECTURE one OF traffic IS

TYPE d米IS (s0,s1,s2,s3);

SIgnal current_state,next_state:d米;

SIGNAL FULL : STD_LOGIC;

SIGNAL tl :STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL th:STD_LOGIC_VECTOR(1 DOWNTO 0);

SIGNAL t米:STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL TI米E :STD_LOGIC_VECTOR(6 DOWNTO 0);

BEGIN

P_REG: PROCESS(CLK)

VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF CNT8 = "11111111" THEN

CNT8:="01111111";

FULL<='1';

ELSE CNT8 := CNT8+1;

FULL <= '0';

END IF; END IF;

END PROCESS P_REG;

PROCESS(full)

BEGIN

IF full'EVENT AND full='1' THEN

IF TI米E<"1000011" THEN

TI米E<=TI米E+1;

ELSe TI米E <="0000000";

END IF;

END IF;

END PROCESS;

REG:process( full,current_state)

BEGIN

IF full='1' AND full'EVENT THEN

current_state<=next_state;

END IF;

END process;

CO米:process(current_state, ti米e)

begin

case current_state is

when s0=>co米b_out<="001100";t米<=39-ti米e;

if ti米e=39 then next_state<=s1;

else next_state<=s0;

end if;

when s1=>co米b_out<="010100";t米<=43-ti米e;

if ti米e=43 then next_state<=s2;

else next_state<=s1;

end if;

when s2=>co米b_out<="100010";t米<=63-ti米e;

if ti米e=63 then next_state<=s3;

else next_state<=s2;

end if;

when s3=>co米b_out<="100001";t米<=67-ti米e;

if ti米e=67 then next_state<=s0;

else next_state<=s3;

end if;

相关文档
最新文档