📄 jtd1.txt
字号:
交通控制灯的设计
一、任务与要求
设计一个十字路口的红、绿、黄三色信号交通灯控制电路,具体要求如下:
1)用红、绿、黄三色发光二极管作信号灯。主干道为东西向,有红、绿、黄三个灯;支干道为南北向,也有红、绿、黄三个灯。红灯亮禁止通行;绿灯亮允许通行;黄灯亮则给行驶中的车辆有时间停靠到禁行线之外;
2)由于主干道车辆较多而支干道车辆较少,所以主干道绿灯时间较长。当主干道允许通行亮绿灯时,支干道亮红灯。而支干道允许通行亮绿灯时,主干道亮红灯,两者交替重复。主干道每次放行50秒,支干道每次放行30秒;
在每次由亮绿灯变成亮红灯的转换过程中间,需要亮5秒的黄灯作为过渡,以使行驶中的车辆有时间停靠到禁行线以外。
3)能实现正常的、即时显示功能。用DE2上的四个七段数码管作为倒计时显示器。分别显示东西、南北方向的红灯、绿灯、黄灯时间;
4)能实现特殊状态的功能显示。设S为特殊状态的传感器信号,当S=1时,进入特殊状态。当S=0时,退出特殊状态。按S后,能实现特殊状态功能:
(1)显示器闪烁;
(2)计数器停止计数并保持在原来的数据;
(3)东西、南北路口均显示红灯状态;
(4)特殊状态结束后,能继续对时间进行计数。
5)能实现总体清零功能。按下清零键后,系统实现总清零,计数器由初始状态开始计数,对应状态的指示灯亮。
二,设计说明
在正常情况下,支路车较少,主路车多,所以设计的交通灯控制要求,在支路无车时,保证主路绿灯亮;而在支路有车时,主路和支路的绿灯交替亮。控制器结构如下图所示。
下面是端口说明:
Clk: 输入,系统输入时钟;
reset:输入,是复位信号,高电平有效;
sensor:输入,为传感器信号,是高电平有效;
flash: 输出,转换期间的闪烁信号;
reda: 输出,主干道路口显示红灯信号,高电平有效;
greena: 输出,主干道路口显示绿灯信号,高电平有效;
yellowa: 输出,主干道路口显示黄灯信号,高电平有效;
redb: 输出,支干道路口显示红灯信号,高电平有效;
greenb: 输出,支干道路口显示绿灯信号,高电平有效;
yellowb: 输出,支干道路口显示黄灯信号,高电平有效;
三、实验设计程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity controller is
port
(clock:in std_logic;
reset:in std_logic;
sensor:in std_logic;
flashut std_logic;
numa,numbut integer range 0 to 90;
reda,greena,yellowaut std_logic;
redb,greenb,yellowbut std_logic
);
end;
architecture control of controller is
signal countnum:integer range 0 to 90;
begin
process(clock)
begin
if reset='1' then ---复位信号,将记数器清零
countnum<=0;
elsif rising_edge(clock) then
if sensor='1' then
flash<='1';
else
flash<='0';
if countnum=89 then ----记数到90秒时,记数器清零
countnum<=0;
else
countnum<=countnum+1; ---正常记数,计脉冲上升沿
end if;
end if;
end if;
end process;
process(clock)
begin
if rising_edge(clock) then
if sensor='1' then ---sensor信号有效期间,两组路灯都为红灯
reda<='1';
redb<='1';
greena<='0';
greenb<='0';
yellowa<='0';
yellowb<='0';
else ---sensor无效期间,系统行为:按照一个记数周期时间(90秒)描述动作
if countnum<=49 then ---前50秒,主干道的绿灯亮
numa<=50-countnum;
reda<='0';
greena<='1';
yellowa<='0';
elsif (countnum<=54) then ---51-55秒,主干道的黄灯亮
numa<=55-countnum;
reda<='0';
greena<='0';
yellowa<='1';
else
numa<=90-countnum; ---56-90秒,主干道的红灯亮
reda<='1';
greena<='0';
yellowa<='0';
end if;
if countnum<=54 then ---0-55秒(主干道为绿,黄灯期间)支干道的红灯亮
numb<=55-countnum;
redb<='1';
greenb<='0';
yellowb<='0';
elsif countnum<=84 then ---56-85秒,支干道为绿灯
numb<=85-countnum;
redb<='0';
greenb<='1';
yellowb<='0';
else
numb<=90-countnum; ---86-90秒,支干道为黄灯
redb<='0';
greenb<='0';
yellowb<='1';
end if;
end if;
end if;
end process;
end ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -