数电综合实验报告2--交通灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数电综合实验报告2--交通灯
数字逻辑与数字系统设计综合实验二——十字路口交通灯自动控制器的设计
学院电子工程学院
班级卓越001012班
学号00101201
姓名冉艳伟
实验时间2012.6.8
十字路口交通灯自动控制器的设计
一、实验目的
学习QuartusII的使用方法,熟悉可编程逻辑器件的使用。通过制作来了解交通灯控制系统,交通灯控制系统主要是实现城市十字交叉路口红绿灯的控制。
二、设计任务
设计一个十字路口交通控制系统,其东西,南北两个方向除了有红、黄、绿灯指示是否允许通行外,还设有时钟,以倒计时方式显示每一路允许通行的时间,绿灯,黄灯,红灯的持续时间分别是40、5和45秒。当东西或南北两路中任一道上出现特殊情况,例如有消防车,警车要去执行任务,此时交通控制系统应可由交警手动控制立即进入特殊运行状态,即两条道上的所有车辆皆停止通行,红灯全亮,时钟停止计时,且其数字在闪烁。当特殊运行状态结束后,管理系统恢复原来的状态,继续正常运行。
东西干道
图1 路口交通管理示意图
三、实验要求
(1)按照设计任务设计,采用VHDL语言编写程序,并在QUARTUSII工具平台中进行仿真,下载到EDA实验箱进行验证。交通灯用发光二级管模拟,观察交通灯的运行是否正常,如果不正常,排除故障直至正确为止。
(2)编写设计报告,要求包括方案选择、程序清单、调试过程、测试结果及心得体会。
要求:必须用可编程器件实现电路功能。可以是原理图,也可以是VHDL代码,也可以混合输入。
五、设计说明
(1)第一模块:CLK时钟秒脉冲发生电路
在红绿灯交通信号系统中,大多数情况是通过自动控制的方式指挥交通的。因此为了避免意外事件的发生,电路必须给一个稳定的时钟(clock)才能让系统正常运作,故对1MHz的时钟信号进行1000000分频。
模块说明:
系统输入信号:
CLKi: 由外接信号发生器提供1MHz的时钟信号;
系统输出信号: CLK:产生每秒一个脉冲的信号;
(2)第二模块:模90倒计数器
按照实验要求,交通灯循环一次为90秒,且显示倒数的计数值,故设计一模90倒计数器通过主程序运算即可显示各路计数值。
模块说明:
系统输入:CLK: 接收由CLK电路的提供的1hz的时钟脉冲信号;
reset:紧急情况输入
系统输出信号: L1:倒计数值秒数十位变化控制信号;
L0:倒计数值秒数个位变化控制信号;
(3)交通灯主程序
说明:
系统输入:CLK: 接收由CLK电路的提供的1hz的时钟脉冲信号;
reset:紧急情况输入
系统输出信号:Lx:东西方向红绿黄灯控制信号;
Ly:南北方向红绿黄灯控制信号;
NUMx1:东西方向倒计数值秒数十位变化控制信号;
NUMx0:东西方向倒计数值秒数个位变化控制信号;
NUMx1:南北方向倒计数值秒数十位变化控制信号;
NUMx0:南北方向倒计数值秒数个位变化控制信号;
六、设计方案
图2 交通灯控制系统示意图
数据
信号
图2 交通信号灯控制器的原理框图
采用VHDL语言输入的方式实现交通信号灯控制器
数据
图3 交通信号灯控制器程序原理框图
七、程序清单
(1)第一模块:CLK时钟秒脉冲发生电路
entity defreq is
port(CLKi:in std_logic;
CLK:out std_logic
);
end defreq;
architecture behav of defreq is
signal q:integer range 999999 downto 0;
begin
process(CLKi,q)
begin
if(CLKi'event and CLKi ='1') then
if(q=999999) then
q<=0;
else
q<=q+1;
end if;
end if;
if (q<500000) then
CLK<='0';
else
CLK<='1';
end if;
end process;
end behav;
(2)第二模块:模90倒计数器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity subcounter90 is
port(CLK:in std_logic;
reset:in std_logic;
L1,L0:out std_logic_vector(3 downto 0) );
end subcounter90;
architecture behav of subcounter90 is
signal lt1,lt0:std_logic_vector(3 downto 0); begin
process(CLK,reset,lt1,lt0)
begin
if(reset='0') then
if(CLK'event and CLK ='1') then
if(lt0="0000") then
if(lt1="0000") then
lt1<="1000";
lt0<="1001";
else
lt1<=lt1-1;