?? 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; --輸入,鍵盤掃描的觸發(fā)時鐘,頻率為25Hz
reset : in std_logic; --輸入,復(fù)位信號
row : in std_logic_vector(0 to 3); --輸入,為延時后的行掃描輸入信號
col : out std_logic_vector(0 to 3); --輸出,列掃描信號
keyvalue :out T_DIGITAL; --輸出,按鍵的二進(jìn)制編碼
keypress :out std_logic); --輸出按鍵狀態(tài),未測到鍵按下是為0,當(dāng)測到有按鍵按下時跳變?yōu)?。
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, --輸入,復(fù)位信號
row=>KEYROW, --輸入,為延時后的行掃描輸入信號
col=>KEYCOL, --輸出,列掃描信號
keyvalue=>S0, --輸出,按鍵的二進(jìn)制編碼
keypress=>KEY_DOWN); --輸出按鍵狀態(tài),未測到鍵按下是為0,當(dāng)測到有按鍵按下時跳變?yōu)?。
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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -