(2)要求在绿灯亮(通行时间内)和红灯亮(禁止通行时间内)时均有倒计时显示。所以基本符合现实功能,能够指挥车辆在十字路口完成左转和不同路口的直行。 2、 基本功能、扩展功能分析
考虑交通灯的功能,一个十字路口至少需8组交通灯:东西南北各两组,一组指挥转弯,一组指挥直行。而设计的关键是控制交通灯的亮灭。
考虑南北、东西方向灯的亮灭规律相同,故可以考虑用四组交通灯来模拟实际的八组交通灯:东西两组灯,南北两组灯,分别用来指示转弯和直行。可用计数器控制时间,在不同的时间显示不同的灯。根据设计分析,可以采用如下方案实现交通灯显示:通过计数来计时,不同的时间输出不同的使能信号,使各方向的不同交通灯显示不同的颜色。夜间车少需交通灯,则红灯、绿灯灭,黄灯闪烁使司机明白前方为十字路口,小心行驶。
倒计时显示需设计不同的倒计时计数器,显示不同方向交通灯的显示时间,通过数码管显示时间,使行人方便。 3、 总体方案 (1) 结构图
(2)主要模块
交通灯设计主要分以下几个模块:时钟分频模块,交通灯亮灭控制模块,交通灯显示模块,倒计时计数模块,倒计时显示模块。
① 时钟分频模块可以将10MHz的信号,用一个二进制计数器,对其进行分频,从而得到适合的频率。选一个合适的作为时间计数器的扫描信号,另外再选一个作为数码管选通电路的触发信号。本方案是用一个24位的计数器,倒计时计数的周期比较慢,而数码管比较快所以可以将分得的23位和10位分别给两者作为扫描信号。
② 交通灯亮灭控制模块,是通过时间的变化来传输的。条件达到时即进行状态转换。用一个120的计数器,当时间递减到达93、90、63、60、33、30、3时发生相应的交通灯亮灭的转变。而时间为0时,重新置为120。
③ 交通灯显示模块,利用LP2900装置的LED灯,将LED__COM端共阴点即P49=’1’,就可以启动。由交通灯控制模块来控制交通灯的亮灭变换。
管脚号 基本功能
开关,按下时输出高电平;
P56
没按下时输出为低电平
发光二极管使能端,
P49
高电平有效
本实验中具备功能
开关按下时:交通灯停止工作,黄灯闪烁;弹起时,交通灯正常工作
做分频器的输入端,用来产生待测
石英晶振输出端,产生10MHz周期
P47
信号
信号
P2、3、4、5、9、10、12、13、14、
15、16、138
12只发光二极管,
模拟交通灯,不同时刻不同的灯亮
高电平发亮
数码管扫描管脚,三管脚为不同的
P30、31、32
数时,选择不同的数码管,实现动
态显示
三、 各模块的设计 (1) 顶层模块的设计
信号、开关门信号,即时基、时标
10MHz作为脉冲信号,需要分频,NS、NSL、EW、EWL分别为南北、东西方向的直行和左转灯;GA为7段LED数码管所对应的段;P49为LED__COM端共阴点;P32选择数码管的扫描管脚。
(2) 分频模块
10Mhzshi FPGA芯片内部提供的脉冲振荡源,通过24位的计数器可以分得所需的频率。可以将FREQ10赋给数码管选通显示模块的扫描信号,将FREQ23赋给倒计时交通灯显示模块的扫描信号。
(3) 倒计时计数模块
EN=0,赋初值TIME=120;EN=1,TIME=TIME-1;且当TIME=0时,将TIME重新赋初值120。构成的就是一个8位M120的递减计数器。
(4) 交通灯显示模块
TIME的条件达到时,NS、NSL、EW、EWL灯发生相应的变化。
(5) 74LS138数码管选通模块
(2)另外,在现实中晚上没有行人,可以不用交通灯控制,只需要黄灯亮着提醒人们前方有路口即可。那就需要一个始终显示模块,指定的时间内回到初始状态也就是我用的EN=0是的状态。只是人为控制,若有24小时的计时会使交通灯的控制智能化。
(3)有些城市的交通灯中也有右转灯,这个程序中有很多地方仍然需要改进。
附录:程序清单 library IEEE;
use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all;
entity traffic is port (
clk: in STD_LOGIC; en: in STD_LOGIC; p49: out STD_LOGIC;
nnsl: out STD_LOGIC_VECTOR (2 downto 0); eewl: out STD_LOGIC_VECTOR (2 downto 0); nns: out STD_LOGIC_VECTOR (2 downto 0); eew: out STD_LOGIC_VECTOR (2 downto 0); ga: out STD_LOGIC_VECTOR (6 downto 0); p32: out STD_LOGIC_VECTOR (2 downto 0) ); end traffic;
architecture traffic_arch of traffic is
signal cp,cp1: std_logic;
signal freq:std_logic_vector(23 downto 0);
signal v: std_logic_vector(2 downto 0);
signal data:std_logic_vector(3 downto 0);
signal nsl,ewl,ns,ew:std_logic_vector(2 downto 0);
signal nbcd,nbcd1,nbcd2,ebcd,ebcd1,ebcd2: std_logic_vector(7 downto 0); signal time:std_logic_vector(7 downto 0);
begin
frequence:block --div_fren
begin
process(clk)
begin
if clk'event and clk='1' then freq
end if;
end process;
cp
cp1
end block frequence;
state:block --state
begin
process(en,cp)
begin
if en='0' then
ns
time
elsif cp'event and cp='1' then time
if time=120 then
ns
elsif time=93 then
ns
elsif time=90 then
ns
elsif time=63 then
ns
elsif time=60 then
ns
elsif time=33 then
ns
elsif time=30 then
ns
elsif time= 3 then
ns
elsif time= 0 then time
end if;
if time93 then nbcd90 then
nbcd
elsif time63 then
nbcd
elsif time60 then
nbcd
elsif time33 then
nbcd
elsif time30 then
ebcd
elsif time3 then
ebcd
elsif time0 then
nbcd
end if;
end if;
nnsl
nbcd1
--binary covert to bcd
if nbcd1>=50 and nbcd1=40 and nbcd1=30 and nbcd1=20 and nbcd1=10 and nbcd1
end if;
--binary covert to bcd
if ebcd1>=50 and ebcd1=40 and ebcd1=30 and ebcd1=20 and ebcd1=10 and ebcd1
end if;
end process;
process(cp1) --M6 ,choose LED
begin
if cp1'event and cp1='1' then
if v=5 then v
else v
end if;
end if;
end process;
process(v,cp1,en)
begin
if en='0' then
if v=
else data
end if;
elsif cp1'event and cp1='1' then
if v=
elsif v=
end if;
end if;
end process;
ga
end block state;
p49
p32
end traffic_arch;