⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alarm_controller.vhd

📁 在ACEX EP1K30TC144-3实现了闹钟功能,并能修改定时,和当前时间
💻 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 + -