1. 程式人生 > >用VHDL設計交通燈

用VHDL設計交通燈

一. 程式程式碼
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;
  1. 控制模組
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;

七段譯碼器程式碼省略