?? 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 + -