用VHDL設計交通燈
阿新 • • 發佈:2019-01-31
一. 程式程式碼
1. 分頻模組
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY fen_pin IS
PORT( CLK : IN STD_LOGIC;
CLK_1 : OUT STD_LOGIC );
END fen_pin;
ARCHITECTURE BEHAV OF fen_pin IS
SIGNAL A : INTEGER RANGE 0 TO 2499;
SIGNAL Q : STD_LOGIC;
BEGIN
PROCESS(CLK) ----5000分頻得到1Hz的頻率(假設系統頻率為5KHz)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF A=2499 THEN
Q <= NOT Q;
A <= 0;
ELSE A <= A+1;END IF;
END IF;
END PROCESS;
CLK_1 <= Q;
END;
- 控制模組
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY kong_zhi IS
PORT( CLK_1 : IN STD_LOGIC;
EMERGENCY,RESET : IN STD_LOGIC;
NUM1,NUM2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
LIGHT1 : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);--A通道交通燈
LIGHT2 : OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); --B通道交通燈
END kong_zhi;
ARCHITECTURE BEHAV OF kong_zhi IS
TYPE STATES IS (S0,S1,S2,S3,S4);---五個狀態。包括一個緊急狀態S0
SIGNAL STATE : STATES;
SIGNAL A,B,C,D : INTEGER RANGE 0 TO 9;
SIGNAL EMERGENCY_STATE,RESET_STATE : STD_LOGIC := '0';
SIGNAL COUNT : INTEGER RANGE 0 TO 49;
BEGIN
PROCESS(EMERGENCY) ---緊急狀態
BEGIN
EMERGENCY_STATE <= EMERGENCY;
END PROCESS;
PROCESS(RESET) ----復位
BEGIN
RESET_STATE <= RESET;
END PROCESS;
PROCESS(CLK_1)
BEGIN
IF(RESET_STATE = '1')THEN ----減計數。一次完整的狀態轉換需要50秒鐘
COUNT <= 49;
ELSE IF(EMERGENCY_STATE = '1')THEN
COUNT <= COUNT;
ELSE
IF(CLK_1'EVENT AND CLK_1='1')THEN
IF COUNT = 0 THEN
COUNT <= 49;
ELSE COUNT <= COUNT-1;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(EMERGENCY_STATE,COUNT)
VARIABLE Q1,Q2 : INTEGER RANGE 0 TO 9;
BEGIN
IF(EMERGENCY_STATE = '1')THEN STATE <= S0;---各狀態持續的時間
ELSE
IF(COUNT >= 30)THEN STATE <= S1;
ELSE IF(COUNT >= 25 AND COUNT <= 29)THEN STATE <= S2;
ELSE IF(COUNT >= 5 AND COUNT <= 24)THEN STATE <= S3;
ELSE STATE <= S4;
END IF;
END IF;
END IF;
END IF;
CASE STATE IS
WHEN S0 => LIGHT1 <= "010";---狀態S0,A B通道都亮紅燈
LIGHT2 <= "010";
WHEN S1 => LIGHT1 <= "100";---狀態S1,A通道亮綠燈 B通道亮紅燈
LIGHT2 <= "010";
WHEN S2 => LIGHT1 <= "001";---狀態S2,A通道亮黃燈 B通道亮紅燈
LIGHT2 <= "010";
WHEN S3 => LIGHT1 <= "010";---狀態S3,A通道亮紅燈 B通道亮綠燈
LIGHT2 <= "100";
WHEN S4 => LIGHT1 <= "010";---狀態S4,A通道亮紅燈 B通道亮黃燈
LIGHT2 <= "001";
END CASE;
Q1 := COUNT/10;
Q2 := COUNT REM 10;
NUM1 <= CONV_STD_LOGIC_VECTOR(Q1, 4);---將COUNT計數器十位數轉換
----成二進位制數輸出
NUM2 <= CONV_STD_LOGIC_VECTOR(Q2, 4); ---將COUNT計數器個位數轉換
----成二進位制數輸出
END PROCESS; ----經七段譯碼器顯示在數碼管上
END;
七段譯碼器程式碼省略