📄 light.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity light is
port (start:in std_logic; --定义初始化信号,高电平有效
clk: in std_logic; --定义参考时钟
car_zhi:in std_logic; --定义仪器监测到的支路有无车辆的标志,有为高电平
man_zhi:in std_logic; --定义仪器监测到的支路有无行人的标志,有为高电平
g_zhu,y_zhu,r_zhu:out std_logic; --定义主干道绿、黄、红灯,亮为高电平
g_zhi,y_zhi,r_zhi:out std_logic --定义支路绿、黄、红灯,亮为高电平
);
end light;
architecture beh of light is
signal counter_g_zhu:integer range 0 to 255; --定义对主干道绿灯亮的计数器
signal counter_flash1:integer range 0 to 255; --定义主干道绿灯向红灯转换的计数器
signal counter_flash2:integer range 0 to 255; --定义支路绿灯向红灯转换的计数器
signal counter_judge1:integer range 0 to 255; --定义对支路绿灯亮的计数器
signal counter_judge2:integer range 0 to 255; --定义对支路连续5秒无车辆和行人的计数器
signal f1_g_zhu,f2_g_zhu:std_logic; --定义主干道绿灯亮的标志,亮为高电平
signal f_g_zhi:std_logic; --定义支路绿灯亮的标志,亮为高电平
signal gtor_zhu: std_logic; --定义主干道绿灯向红灯转换的标志,高电平开始转换
signal rtog_zhu: std_logic; --定义主干道红灯向绿灯转换的标志,高电平开始转换
signal judge:std_logic; --判断支路是否由绿灯向红灯转换的标志,高电平开始判断
begin
process(clk)
begin
if clk'event and clk='1' then
if start='1' then --当start为高电平时, 对系统初始化
f1_g_zhu<='1'; --主干道绿灯亮,黄灯和红灯灭
f2_g_zhu<='1';
g_zhu<='1';
y_zhu<='0';
r_zhu<='0';
g_zhi<='0'; --支路红灯亮,绿灯和黄灯灭
y_zhi<='0';
r_zhi<='1';
judge<='0'; --支路由绿灯向红灯转换的标志初始为无效
counter_g_zhu<=0; --所有计数器初始为零
counter_flash1<=0;
counter_flash2<=0;
gtor_zhu<='0'; --主干道红绿灯相互转换的标志初始化为无效
rtog_zhu<='0';
else
if f1_g_zhu='1' then --当主干道为绿灯时,开始计数
counter_g_zhu<=counter_g_zhu+1;
if counter_g_zhu>=15 then --当主干道绿灯已亮15个clk时(实为240个,即2分
if (car_zhi='1') or (man_zhi='1') then --钟),开始判断支路是否有行人或车辆等待,若有将主
gtor_zhu<='1'; --干道由绿灯转为红灯的标志置为高电平有效
f1_g_zhu<='0'; --将标志置零,不再继续判断
end if;
end if;
end if;
if gtor_zhu='1' then --当为高电平时,主干道开始由绿灯向红灯转换
counter_flash1<=counter_flash1+1;
if counter_flash1<=3 then --当计数在3(实为5,即绿灯闪2.5秒)以内,设置主干道
f2_g_zhu<=not f2_g_zhu; --绿灯闪烁
g_zhu<=f2_g_zhu;
elsif counter_flash1<=6 then --当计数在3~6(实为5~10)时,主干道黄灯亮
y_zhu<='1';
else y_zhu<='0'; --当计数在超过6(实为10,即5秒)时,主干道黄灯灭
r_zhu<='1'; --红灯亮
gtor_zhu<='0'; --将转换标志清零,结束转换
g_zhi<='1'; --支路绿灯亮
f_g_zhi<='1'; --支路绿灯亮标志置1
r_zhi<='0'; --支路红灯灭
counter_flash1<=0; --计数器清零,为下一次作准备
judge<='1'; --启动判断支路是否由绿灯向红灯转换
counter_judge1<=0; --将判断计数器清零
counter_judge2<=0;
end if;
end if;
if judge='1' then --当判断标志为高电平时,开始启动判断支路是否由绿
counter_judge1<=counter_judge1+1; --灯向红灯转换
if counter_judge1<10 then --在计数不超过10(实为40,即20秒)时,判断是否有车
if (car_zhi='0') and (man_zhi='0') then --辆和行人
counter_judge2<=counter_judge2+1;
if counter_judge2>=4 then --若连续4个clk(实为10个,即5秒)支路上没有车辆
rtog_zhu<='1'; --和行人时,启动转换,高电平有效
judge<='0'; --同时将标志judge置0,结束本次判断
end if;
else counter_judge2<=0; --若在4个clk之内有车辆和行人出现,将计数器清零,
end if; --重新开始计数
else rtog_zhu<='1'; --若计数超过10,则无论支路有无车辆和行人,都启动
judge<='0'; --支路由绿灯向红灯的转换,同时将标志judge置0
end if;
end if;
if rtog_zhu='1' then --当支路由绿灯向红灯转换的标志有效时,启动转换
counter_flash2<=counter_flash2+1; --计数
if counter_flash2<=3 then --同前,支路绿灯闪
f_g_zhi<=not f_g_zhi;
g_zhi<=f_g_zhi;
elsif counter_flash2<=6 then --然后黄灯亮
y_zhi<='1';
else y_zhi<='0';
r_zhi<='1'; --再红灯亮
rtog_zhu<='0'; --将标志清零,结束本次转换
g_zhu<='1'; --主干道绿灯亮
f1_g_zhu<='1'; --将主干道绿灯亮标志置1,开始启动主干道绿灯是否
f2_g_zhu<='1'; --向红灯转换的判断
r_zhu<='0'; --主干道红灯灭
counter_flash2<=0; --计数器清零,为下一次转换作准备
counter_g_zhu<=0;
end if;
end if;
end if;
end if;
end process ;
end beh;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -