?? 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; --定義儀器監(jiān)測到的支路有無車輛的標(biāo)志,有為高電平
man_zhi:in std_logic; --定義儀器監(jiān)測到的支路有無行人的標(biāo)志,有為高電平
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; --定義對主干道綠燈亮的計數(shù)器
signal counter_flash1:integer range 0 to 255; --定義主干道綠燈向紅燈轉(zhuǎn)換的計數(shù)器
signal counter_flash2:integer range 0 to 255; --定義支路綠燈向紅燈轉(zhuǎn)換的計數(shù)器
signal counter_judge1:integer range 0 to 255; --定義對支路綠燈亮的計數(shù)器
signal counter_judge2:integer range 0 to 255; --定義對支路連續(xù)5秒無車輛和行人的計數(shù)器
signal f1_g_zhu,f2_g_zhu:std_logic; --定義主干道綠燈亮的標(biāo)志,亮為高電平
signal f_g_zhi:std_logic; --定義支路綠燈亮的標(biāo)志,亮為高電平
signal gtor_zhu: std_logic; --定義主干道綠燈向紅燈轉(zhuǎn)換的標(biāo)志,高電平開始轉(zhuǎn)換
signal rtog_zhu: std_logic; --定義主干道紅燈向綠燈轉(zhuǎn)換的標(biāo)志,高電平開始轉(zhuǎn)換
signal judge:std_logic; --判斷支路是否由綠燈向紅燈轉(zhuǎn)換的標(biāo)志,高電平開始判斷
begin
process(clk)
begin
if clk'event and clk='1' then
if start='1' then --當(dāng)start為高電平時, 對系統(tǒng)初始化
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'; --支路由綠燈向紅燈轉(zhuǎn)換的標(biāo)志初始為無效
counter_g_zhu<=0; --所有計數(shù)器初始為零
counter_flash1<=0;
counter_flash2<=0;
gtor_zhu<='0'; --主干道紅綠燈相互轉(zhuǎn)換的標(biāo)志初始化為無效
rtog_zhu<='0';
else
if f1_g_zhu='1' then --當(dāng)主干道為綠燈時,開始計數(shù)
counter_g_zhu<=counter_g_zhu+1;
if counter_g_zhu>=15 then --當(dāng)主干道綠燈已亮15個clk時(實為240個,即2分
if (car_zhi='1') or (man_zhi='1') then --鐘),開始判斷支路是否有行人或車輛等待,若有將主
gtor_zhu<='1'; --干道由綠燈轉(zhuǎn)為紅燈的標(biāo)志置為高電平有效
f1_g_zhu<='0'; --將標(biāo)志置零,不再繼續(xù)判斷
end if;
end if;
end if;
if gtor_zhu='1' then --當(dāng)為高電平時,主干道開始由綠燈向紅燈轉(zhuǎn)換
counter_flash1<=counter_flash1+1;
if counter_flash1<=3 then --當(dāng)計數(shù)在3(實為5,即綠燈閃2.5秒)以內(nèi),設(shè)置主干道
f2_g_zhu<=not f2_g_zhu; --綠燈閃爍
g_zhu<=f2_g_zhu;
elsif counter_flash1<=6 then --當(dāng)計數(shù)在3~6(實為5~10)時,主干道黃燈亮
y_zhu<='1';
else y_zhu<='0'; --當(dāng)計數(shù)在超過6(實為10,即5秒)時,主干道黃燈滅
r_zhu<='1'; --紅燈亮
gtor_zhu<='0'; --將轉(zhuǎn)換標(biāo)志清零,結(jié)束轉(zhuǎn)換
g_zhi<='1'; --支路綠燈亮
f_g_zhi<='1'; --支路綠燈亮標(biāo)志置1
r_zhi<='0'; --支路紅燈滅
counter_flash1<=0; --計數(shù)器清零,為下一次作準(zhǔn)備
judge<='1'; --啟動判斷支路是否由綠燈向紅燈轉(zhuǎn)換
counter_judge1<=0; --將判斷計數(shù)器清零
counter_judge2<=0;
end if;
end if;
if judge='1' then --當(dāng)判斷標(biāo)志為高電平時,開始啟動判斷支路是否由綠
counter_judge1<=counter_judge1+1; --燈向紅燈轉(zhuǎn)換
if counter_judge1<10 then --在計數(shù)不超過10(實為40,即20秒)時,判斷是否有車
if (car_zhi='0') and (man_zhi='0') then --輛和行人
counter_judge2<=counter_judge2+1;
if counter_judge2>=4 then --若連續(xù)4個clk(實為10個,即5秒)支路上沒有車輛
rtog_zhu<='1'; --和行人時,啟動轉(zhuǎn)換,高電平有效
judge<='0'; --同時將標(biāo)志judge置0,結(jié)束本次判斷
end if;
else counter_judge2<=0; --若在4個clk之內(nèi)有車輛和行人出現(xiàn),將計數(shù)器清零,
end if; --重新開始計數(shù)
else rtog_zhu<='1'; --若計數(shù)超過10,則無論支路有無車輛和行人,都啟動
judge<='0'; --支路由綠燈向紅燈的轉(zhuǎn)換,同時將標(biāo)志judge置0
end if;
end if;
if rtog_zhu='1' then --當(dāng)支路由綠燈向紅燈轉(zhuǎn)換的標(biāo)志有效時,啟動轉(zhuǎn)換
counter_flash2<=counter_flash2+1; --計數(shù)
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'; --將標(biāo)志清零,結(jié)束本次轉(zhuǎn)換
g_zhu<='1'; --主干道綠燈亮
f1_g_zhu<='1'; --將主干道綠燈亮標(biāo)志置1,開始啟動主干道綠燈是否
f2_g_zhu<='1'; --向紅燈轉(zhuǎn)換的判斷
r_zhu<='0'; --主干道紅燈滅
counter_flash2<=0; --計數(shù)器清零,為下一次轉(zhuǎn)換作準(zhǔn)備
counter_g_zhu<=0;
end if;
end if;
end if;
end if;
end process ;
end beh;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -