📄 代码讲解.txt
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE P_ALARM IS --定义一个程序包
SUBTYPE T_DIGITAL IS INTEGER RANGE 0 TO 9; --定义一个子类
SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;
TYPE T_CLOCK_TIME IS ARRAY(3 DOWNTO 0) OF T_DIGITAL; --计时器的时间类型为数组类型
TYPE T_DISPLAY IS ARRAY(3 DOWNTO 0) OF STD_LOGIC_VECTOR(6 DOWNTO 0); --
TYPE SEG7 IS ARRAY(0 TO 9) OF STD_LOGIC_VECTOR(6 DOWNTO 0); --七段译码器
CONSTANT SEVEN_SEG:SEG7:=(
"0111111",
"0000110",
"1011011",
"1001111",
"1100110",
"1101101",
"1111101",
"0000111",
"1111111",
"1110011"
); --七个信号为常量
TYPE KEYPAD9 IS ARRAY (0 TO 9) OF STD_LOGIC_VECTOR(9 DOWNTO 0); --数字键
CONSTANT KEYNUMBER:KEYPAD9:=(
"0000000001",
"0000000010",
"0000000100",
"0000001000",
"0000010000",
"0000100000",
"0001000000",
"0010000000",
"0100000000",
"1000000000"
); --常量赋值
END PACKAGE P_ALARM;
------------------闹钟控制器的设计--------------
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
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;
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;
SHOW_NEW_TIME<='1';
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;
NEXT_STATE<=S4;
SHOW_A<='1';
END IF;
ENABLE_COUNT_A<='1';
END IF;
WHEN OTHERS=>
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 + -