?? 交通燈.txt
字號:
自己用VHDL語言寫的交通燈控制器,在實驗板上能運行,可以應付老師的檢查了2006-10-16 19:55:00
1
推薦題目要求:1.主、支路無車時主干路“綠”;
2.若主、支路均有車時,主干路綠45S,支路綠25S,綠燈結束時黃燈亮5S;
3.主、支路傳感器信號用按鍵傳遞,高電平表示有車。
設計程序清單如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jtd IS
PORT (clk,msensor,ssensor : IN STD_LOGIC;
mr,mg,sr,sg : OUT STD_LOGIC ; --,showbt
showbt : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); --顯示位控制
mmy,ssy : BUFFER STD_LOGIC;
show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)
); --show : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)
END jtd ;
ARCHITECTURE one OF jtd IS
TYPE state_type IS (A,B,C,D);
SIGNAL state : state_type;
SIGNAL secclk,yellowsec,my,sy : STD_LOGIC;
SIGNAL showclk : STD_LOGIC_VECTOR (1 DOWNTO 0); --后加,LED顯示時鐘
SIGNAL showdata1,showdata0 : INTEGER RANGE 0 TO 45;
SIGNAL datasignal : INTEGER RANGE 0 TO 9;
BEGIN
getclk: PROCESS ( clk )
VARIABLE clkcount : INTEGER RANGE 0 TO 2; --LED位掃描信號
VARIABLE sclk : INTEGER RANGE 0 TO 600; --秒信號
VARIABLE yellowcou : INTEGER RANGE 0 TO 200; --黃燈閃爍信號
BEGIN
IF clk'EVENT AND clk = '1' THEN
clkcount := clkcount + 1;
sclk := sclk + 1;
yellowcou := yellowcou + 1;
IF clkcount = 2 THEN
showclk <= showclk + '1';
END IF;
IF sclk = 600 THEN
secclk <= '1';
ELSE secclk <= '0';
END IF;
IF yellowcou = 200 THEN
yellowsec <= '1';
ELSE yellowsec <= '0';
END IF;
END IF;
END PROCESS getclk;
jtdp: PROCESS (secclk)
VARIABLE cnt : INTEGER RANGE 0 TO 45;
VARIABLE nclr : BIT; --nclr低電平計數器清零
BEGIN
IF ( secclk'EVENT AND secclk = '1' ) THEN
IF nclr = '0' THEN cnt := 0; --同步清零
ELSE cnt := cnt + 1; --如果nclr不等于零,則計數
END IF;
--END IF;記住
CASE state IS
WHEN A => mr <= '0'; my <= '0'; mg <= '1'; --A狀態,主干道綠燈mg亮
sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 45 - cnt; showdata0 <= 50 -cnt;
IF ( msensor AND ssensor ) = '1' THEN
IF cnt = 45 THEN
state <= B; nclr := '0';
ELSE state <= A; nclr := '1'; --繼續狀態A
END IF;
ELSIF (ssensor AND (NOT msensor)) = '1' THEN --若只有之路有車
state <= B; nclr := '0';
ELSE state <= A; nclr := '1'; --繼續A狀態
IF cnt = 45 THEN cnt := 0; nclr := '0'; --防止計數超過45
END IF;
END IF;
WHEN B => mr <= '0'; my <= '1'; mg <= '0'; --B狀態,主干道黃燈my亮
sr <= '1'; sy <= '0'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <=5 - cnt;
IF cnt = 5 THEN
state <= C; nclr := '0';
ELSE state <= B; nclr := '1';
END IF;
WHEN C => mr <= '1'; my <= '0'; mg <= '0'; --C狀態,之路綠燈sg亮
sr <= '0'; sy <= '0'; sg <= '1'; showdata1 <= 30 - cnt; showdata0 <= 25 - cnt;
IF ( msensor AND ssensor ) = '1' THEN
IF cnt = 25 THEN
state <= D; nclr := '0';
ELSE state <= C; nclr := '1';
END IF;
ELSIF ssensor = '0' THEN --若之路無車
state <= D; nclr := '0'; --則為D狀態
ELSE
state <= C; nclr := '1';
IF cnt = 25 THEN
cnt := 0; nclr := '0';
END IF;
END IF;
WHEN D => mr <= '1'; my <= '0'; mg <= '0'; --D狀態,之路黃燈sy亮
sr <= '0'; sy <= '1'; sg <= '0'; showdata1 <= 5 - cnt; showdata0 <= 5 - cnt;
IF cnt = 5 THEN
state <= A; nclr := '0';
ELSE
state <= D; nclr := '1';
END IF;
END CASE;
END IF;
END PROCESS jtdp;
showp1: PROCESS ( showclk )
VARIABLE data1,data0,data2,data3 : INTEGER RANGE 0 TO 9;
BEGIN
IF showdata1 >= 50 THEN --主路計數顯示
data1 := 5; data0 := showdata1 - 50;
ELSIF showdata1 >= 40 THEN
data1 := 4; data0 := showdata1 - 40;
ELSIF showdata1 >= 30 THEN
data1 := 3; data0 := showdata1 - 30;
ELSIF showdata1 >= 20 THEN
data1 := 2; data0 := showdata1 - 20;
ELSIF showdata1 >= 10 THEN
data1 := 1; data0 := showdata1 - 10;
ELSE data1 := 0; data0 := showdata1;
END IF;
IF showdata0 >= 50 THEN
data3 := 5; data2 := showdata0 - 50;
ELSIF showdata0 >= 40 THEN
data3 := 4; data2 := showdata0 - 40;
ELSIF showdata0 >= 30 THEN
data3 := 3; data2 := showdata0 - 30;
ELSIF showdata0 >= 20 THEN
data3 := 2; data2 := showdata0 - 20;
ELSIF showdata0 >= 10 THEN
data3 := 1; data2 := showdata0 - 10;
ELSE data3 := 0; data2 := showdata0;
END IF;
CASE showclk IS
WHEN "00" => showbt <= "00"; datasignal <= data2;
WHEN "01" => showbt <= "01"; datasignal <= data3;
WHEN "10" => showbt <= "10"; datasignal <= data0;
WHEN "11" => showbt <= "11"; datasignal <= data1;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
showp2: PROCESS ( datasignal )
BEGIN
CASE datasignal IS
WHEN 0 => show <= "0111111";
WHEN 1 => show <= "0000110";
WHEN 2 => show <= "1011011";
WHEN 3 => show <= "1001111";
WHEN 4 => show <= "1100110";
WHEN 5 => show <= "1101101";
WHEN 6 => show <= "1111101";
WHEN 7 => show <= "0000111";
WHEN 8 => show <= "1111111";
WHEN 9 => show <= "1101111";
WHEN OTHERS => NULL;
END CASE;
END PROCESS showp2;
yellow: PROCESS (yellowsec)
BEGIN
IF yellowsec'EVENT AND yellowsec ='1' THEN
IF my = '1' THEN
mmy <= not mmy;
END IF;
IF sy = '1' THEN
ssy <= not ssy;
END IF;
END IF;
END PROCESS;
END one;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -