?? alarm_controller.vhd
字號:
-- 控制器源程序ALARM_CONTROLLER.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY ALARM_CONTROLLER IS
PORT(KEY : IN STD_LOGIC;
ALARM_BUTTON : IN STD_LOGIC;
TIME_BUTTON : IN STD_LOGIC;
CLK : IN STD_LOGIC;
RESET : IN STD_LOGIC;
LOAD_NEW_A : OUT STD_LOGIC;
LOAD_NEW_C : OUT STD_LOGIC;
SHOW_NEW_TIME :OUT STD_LOGIC;
SHOW_A : OUT STD_LOGIC);
END ENTITY ALARM_CONTROLLER;
ARCHITECTURE ART OF ALARM_CONTROLLER IS
TYPE T_STATE IS (S0,S1,S2,S3,S4);
CONSTANT KEY_TIMEOUT :T_SHORT := 500;
CONSTANT SHOW_ALARM_TIMEOUT : T_SHORT := 500;
SIGNAL CURR_STATE : T_STATE;
SIGNAL NEXT_STATE : T_STATE;
SIGNAL COUNTER_K : T_SHORT;
SIGNAL ENABLE_COUNT_K : STD_LOGIC;
SIGNAL COUNT_K_END : STD_LOGIC;
SIGNAL COUNTER_A : T_SHORT;
SIGNAL ENABLE_COUNT_A : STD_LOGIC;
SIGNAL COUNT_A_END : STD_LOGIC;
BEGIN
REG:PROCESS(CLK,RESET)IS
BEGIN
IF RESET ='1'THEN
CURR_STATE <= S0;
ELSIF RISING_EDGE(CLK) THEN
CURR_STATE <= NEXT_STATE;
END IF;
END PROCESS;
COM: PROCESS(KEY,ALARM_BUTTON,TIME_BUTTON,
CURR_STATE,COUNT_A_END,COUNT_K_END) IS
BEGIN
NEXT_STATE <= CURR_STATE;
LOAD_NEW_A <= '0';
LOAD_NEW_C <= '0';
SHOW_A <= '0';
SHOW_NEW_TIME <= '0';
ENABLE_COUNT_K <= '0';
ENABLE_COUNT_A <= '0';
CASE CURR_STATE IS
WHEN S0 =>
IF (KEY = '1') THEN
NEXT_STATE <= S1;
SHOW_NEW_TIME <= '1';
ELSIF (ALARM_BUTTON = '1') THEN
NEXT_STATE <= S4;
SHOW_A <= '1';
ELSE
NEXT_STATE <= S0;
END IF;
WHEN S1 =>
IF (KEY = '1') THEN
NEXT_STATE <= S1;
ELSIF (ALARM_BUTTON = '1') THEN
NEXT_STATE <= S2;
LOAD_NEW_A <= '1';
ELSIF (TIME_BUTTON = '1') THEN
NEXT_STATE <= S3;
LOAD_NEW_C <= '1';
ELSE
IF (COUNT_K_END = '1') THEN
NEXT_STATE <= S0;
ELSE
NEXT_STATE <= S1;
END IF;
ENABLE_COUNT_K <= '1';
END IF;
SHOW_NEW_TIME <= '1';
WHEN S2 =>
IF (ALARM_BUTTON = '1') THEN
NEXT_STATE <= S2;
LOAD_NEW_A <= '1';
ELSE
NEXT_STATE <= S0;
END IF;
WHEN S3 =>
IF (TIME_BUTTON = '1') THEN
NEXT_STATE <= S3;
LOAD_NEW_C <= '1';
ELSE
NEXT_STATE <= S0;
END IF;
WHEN S4 =>
IF (KEY = '1') THEN
NEXT_STATE <= S1;
ELSE
NEXT_STATE <= S4;
IF (COUNT_A_END = '1') THEN
NEXT_STATE <= S0;
ELSE
NEXT_STATE <= S4;
SHOW_A <= '1';
END IF;
ENABLE_COUNT_A <= '1';
END IF;
WHEN OTHERS =>
NEXT_STATE <= S0;
NULL;
END CASE;
END PROCESS;
COUNT_KEY : PROCESS(ENABLE_COUNT_K,CLK) IS
BEGIN
IF (ENABLE_COUNT_K = '0') THEN
COUNTER_K <= 0;
COUNT_K_END <= '0';
ELSIF (RISING_EDGE(CLK)) THEN
IF (COUNTER_K >= KEY_TIMEOUT) THEN
COUNT_K_END <= '1';
ELSE
COUNTER_K <= COUNTER_K + 1;
END IF;
END IF;
END PROCESS COUNT_KEY;
COUNT_ALARM : PROCESS(ENABLE_COUNT_A,CLK) IS
BEGIN
IF (ENABLE_COUNT_A = '0') THEN
COUNTER_A <= 0;
COUNT_A_END <= '0';
ELSIF RISING_EDGE(CLK) THEN
IF (COUNTER_A >= SHOW_ALARM_TIMEOUT) THEN
COUNT_A_END <= '1';
ELSE
COUNTER_A <= COUNTER_A + 1;
END IF;
END IF;
END PROCESS COUNT_ALARM;
END ARCHITECTURE ART;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -