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

📄 alarm_clock.vhd

📁 在ACEX EP1K30TC144-3实现了闹钟功能,并能修改定时,和当前时间
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.P_ALARM.ALL;
ENTITY ALARM_CLOCK IS
    PORT(--KEYPAD :IN  STD_LOGIC_VECTOR(9 DOWNTO 0);
         KEYROW :      IN  STD_LOGIC_VECTOR(3 DOWNTO 0);--行输入
         KEYCOL :      OUT  STD_LOGIC_VECTOR(3 DOWNTO 0);--列输出
         --KEY_DOWN :  IN  STD_LOGIC;
         ALARM_BUTTON: IN  STD_LOGIC;
         TIME_BUTTON : IN  STD_LOGIC;
         CLK :         IN  STD_LOGIC;--40M
         RESET :       IN  STD_LOGIC;
         --DISPLAY :     OUT T_DISPLAY;
         LEDSEG :      OUT  STD_LOGIC_VECTOR(6 DOWNTO 0);--段输出
         LEDSEL :      OUT  STD_LOGIC_VECTOR(5 DOWNTO 0);--位输出
         SOUND_ALARM : OUT STD_LOGIC);
END ENTITY ALARM_CLOCK;

ARCHITECTURE ART OF ALARM_CLOCK IS
    COMPONENT KEYSCAN IS
        PORT(clk_kb :  in  std_logic;                --输入,键盘扫描的触发时钟,频率为25Hz
            reset :   in  std_logic;                --输入,复位信号
            row :     in  std_logic_vector(0 to 3); --输入,为延时后的行扫描输入信号
            col :     out std_logic_vector(0 to 3); --输出,列扫描信号
            keyvalue :out T_DIGITAL; --输出,按键的二进制编码
            keypress :out std_logic); --输出按键状态,未测到键按下是为0,当测到有按键按下时跳变为1。
    END COMPONENT KEYSCAN;
     
    COMPONENT KEY_BUFFER IS
        PORT( KEY :IN T_DIGITAL;
              CLK :IN STD_LOGIC;
              RESET :IN STD_LOGIC;
              NEW_TIME:OUT T_CLOCK_TIME);
    END COMPONENT KEY_BUFFER;

    COMPONENT 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 COMPONENT ALARM_CONTROLLER;

    COMPONENT ALARM_COUNTER IS
        PORT(NEW_CURRENT_TIME: IN  T_CLOCK_TIME;
             LOAD_NEW_C:  IN  STD_LOGIC;
             CLK:         IN  STD_LOGIC;
             RESET:       IN  STD_LOGIC;
             CURRENT_TIME:OUT T_CLOCK_TIME);
    END COMPONENT ALARM_COUNTER;

    COMPONENT ALARM_REG IS
        PORT(NEW_ALARM_TIME: IN  T_CLOCK_TIME;
             LOAD_NEW_A:IN  STD_LOGIC;
             CLK :      IN  STD_LOGIC;
             RESET :    IN  STD_LOGIC;
             ALARM_TIME:OUT T_CLOCK_TIME);
    END COMPONENT ALARM_REG;

    COMPONENT DISPLAY_DRIVER IS
        PORT(ALARM_TIME :  IN  T_CLOCK_TIME;
             CURRENT_TIME :IN  T_CLOCK_TIME;
             NEW_TIME :    IN  T_CLOCK_TIME;
             SHOW_NEW_TIME:IN  STD_LOGIC;
             SHOW_A :      IN  STD_LOGIC;
             SOUND_ALARM : OUT STD_LOGIC;
             CLK :         IN  STD_LOGIC;
             SEL :         OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
             SEG :         OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
    END COMPONENT DISPLAY_DRIVER;

    COMPONENT FQ_DIVIDER IS
        PORT( CLK_40Mhz: IN  STD_LOGIC;
              RESET:     IN  STD_LOGIC;
              CLK_1Khz:  OUT STD_LOGIC;
              CLK_50hz:  OUT STD_LOGIC;  --20ms
              CLK_1hz:   OUT STD_LOGIC );--1s
    END COMPONENT FQ_DIVIDER;

    SIGNAL CLK_KB  : STD_LOGIC;     
    SIGNAL CLK_CNT : STD_LOGIC;     
    SIGNAL CLK_DISP: STD_LOGIC;     
    SIGNAL KEY_DOWN : STD_LOGIC;     
    SIGNAL S0  : T_DIGITAL;     
    SIGNAL S1,S2,S3,S4 : STD_LOGIC;--,S5
    SIGNAL S6,S7,S8 : T_CLOCK_TIME;
BEGIN
    U1: KEYSCAN PORT MAP(clk_kb=>CLK_KB,--输入,键盘扫描时钟,频率为50Hz
            reset=>RESET,        --输入,复位信号
            row=>KEYROW,         --输入,为延时后的行扫描输入信号
            col=>KEYCOL,         --输出,列扫描信号
            keyvalue=>S0,        --输出,按键的二进制编码
            keypress=>KEY_DOWN); --输出按键状态,未测到键按下是为0,当测到有按键按下时跳变为1。
    U2: KEY_BUFFER PORT MAP(S0, KEY_DOWN,RESET, S6);
    U3: ALARM_CONTROLLER PORT  MAP(KEY_DOWN,
                                 ALARM_BUTTON,TIME_BUTTON,
                                 CLK,RESET,S1,S2,S3,S4);
    U4: ALARM_COUNTER PORT MAP(S6,S2,CLK_CNT,RESET,S8);
    U5: ALARM_REG PORT MAP(S6,S1,CLK,RESET,S7);
    U6: DISPLAY_DRIVER PORT MAP
            (ALARM_TIME=>S7,
             CURRENT_TIME=>S6,
             NEW_TIME=>S8,
             SHOW_NEW_TIME=>S3,
             SHOW_A=>S4,
             SOUND_ALARM=>SOUND_ALARM,
             CLK=>CLK_DISP,
             SEL=>LEDSEL,
             SEG=>LEDSEG);
        --DISPLAY:OUT T_DISPLAY);
    U7: FQ_DIVIDER PORT MAP(
          CLK_40Mhz=>CLK,
          RESET=>RESET,
          CLK_1Khz=>CLK_DISP,
          CLK_50hz=>CLK_KB,  --20ms
          CLK_1hz=>CLK_CNT);--1s
END ARCHITECTURE ART;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -