📄 alarm_clock.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 + -