资源描述
数字闹钟的设计
系统的设计要求
本课题要求设计一个24小时的数字闹钟,该数字闹钟的面板如图9.1所示,它包括以下几个组成部分:(1)显示屏,由7个七段数码管组成,其中6个用于显示当前时间(时:分:秒)或设置的闹钟时间,而另一个则用于显示系统内部产生的周期性循环变化的待选预置数字; (2)YES(确认)键:用于输入新的时间或新的闹钟时间时,对每位待选预置数字输入的确认;(3)TIME(时间)键:用于确定新的时间设置;(4)ALARM(闹钟)键:用于确定新的闹钟时间设置,或显示已设置的闹钟时间;(5)扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声。
该数字闹钟的具体功能要求如下:
(1)计时功能:这是本数字闹钟设计的基本功能,每隔1秒钟计时一次,并在显示屏上显示当前时间;
(2)闹钟功能::如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声;
(3)设置新的计时器时间:系统内部产生的周期性循环变化的待选预置数字,当用户按”YES”键后则该数字将作为预置数字输入;在输入过程中,输入数字在显示屏上从右到左依次显示,例如,用户要设置新的时间12:48:56,则按顺序先后输入”1”,”2”,”4”,”8”,”5”,”6”,与之对应,显示屏依次显示的信息为:”1”,”12”,”124”,”1248”,”12485”,”124856”。如果用户在输入任意几个数字后较长时间内,例如5秒,没有按任何键,则计时器恢复到正常的计时显示状态。
(4)设置新的闹钟时间:用户用YES键输入新的时间,然后按”ALARM”键确认,过程与3类似。
(5)显示所设置闹钟时间:在正常计时显示状态下,用户直接按下“ALARM”键则已设置的闹钟时间显示在显示屏上。
根据该系统的设计功能要求,整个系统大致包括如下几个组成部分:用于预置数字输入的预置数字缓冲器;用于数字闹钟计时的计数器;用于保存闹钟时间的寄存器;用于显示的七段数码显示电路以及控制以上各个部分协同工作的控制器。
图1 数字闹钟面板图
系统的总体设计
图2 计时器的外部端口
根据该数字闹钟的设计要求,我们可得到其外部端口如图2所示。各个输入/输出端口的作用如下:
(1) CLK为外部时钟信号,RESET为复位信号。
(2) 当YES为高电平时(YES= ‘1’),表示用户选择了某个预置数字。
(3) 当ALARM_BUTTON为高电平时,表示用户按下ALARM键。
(4) 当TIME_BUTTON为高电平时,表示用户按下TIME键。
(5) SEG7是数据动态扫描显示的公共八段数码显示管驱动端,而LEDW则是数码管的位选择端,它经过外接的3—8译码器译码后接数码管的公共端COM。
(6) SOUND_ALARM用于控制扬声器发声,当SOUND_ALARM = ‘1’时,扬声器发出蜂鸣,表示到了设定的闹钟时间。
根据系统的设计要求,整个系统可分为闹钟控制器、预置寄存器、分频电路、时间计数器、闹钟寄存器、显示驱动控制器等6个模块,其总体设计原理图如图3所示。各
图 3 系统总体设计原理图
个模块的作用介绍如下:
(1) 闹钟控制器(CONTROL):它是整个系统正常有序工作的核心,按设计要求产生相应的控制逻辑,以控制其他各部分的协调工作。
(2) 预置寄存器(KEYBUFFER):这时一个预置数字产生器和移位寄存器的结合体。通过对YES进行操作,选择输入欲输入的数字,暂存用户输入的数字,并且用户每输入一个数字,暂存数字移位一次,实现用户输入数字在显示器上从右到左的依次显示。
(3) 分频电路(DIVIDER):将较高速的外部时钟频率分频成每秒钟一次的时钟频率,以便进行时钟计数。
(4) 时间计数器(COUNTER):实际上是一个异步复位、异步置数的累加器,通常情况下进行时钟累加计数,必要时可置入新的时钟值,然后从该值开始新的计数。
(5) 闹钟寄存器(REG):用于保存用户设置的闹钟时间,是一个异步复位寄存器。
(6) 显示驱动器(DRIVER):根据需要显示当前时间、用户设置的闹钟时间或用户输入的预置时间,同时判断当前时间是否已到了闹钟时间,实际上是一个多路选择器加比较器。对具体数据的显示,采用的是动态扫描显示方式。
闹钟控制器的设计
图4 闹钟控制器的外部端口
闹钟控制器的外部端口如图4所示,各端口的作用如下:
(1) CLK为外部时钟信号,RESET为复位信号。
(2) 当KEY为高电平(KEY= ‘1’)时,表示用户按下数字键(“0”~“9”)。
(3) 当ALARM_BUTTON为高电平时,表示用户按下“ALARM”键。
(4) 当TIME_BUTTON为高电平时,表示用户按下“TIME”键。
(5) 当LOAD_NEW_A为高电平时,控制(闹钟时间寄存器)加载新的闹钟时间值。
(6) 当LOAD_NEW_C为高电平时,控制(时钟计数器)设置新的时间值。
(7) 当SHOW_NEW_TIME为高电平时,控制(七段数码显示电路)显示新的时间值,即用户输入的预置时间;否则,当SHOW_NEW_TIME为低电平时,根据SHOW_A信号的值控制显示当前时间或闹钟时间。此时,当SHOW_A为高电平时,控制显示闹钟时间,否则,显示当前时间。
控制器的功能可以通过有限状态自动机(FSM)的方式来实现。根据设计要求及端口设置,需要五个状态来实现:
S0:表示电路初态即正常时钟计数状态,完成计时功能。
S1:接收预置数字输入状态。在状态S0时用户按下“YES”键后进入此状态。在此状态下,显示屏上显示的是用户预置的数字。
S2:设置新的闹钟时间。在状态S1时用户按下ALARM键后进入此状态。
S3:设置新的计时器时间。在状态S1时用户按下TIME键后进入此状态。
S4:显示闹钟时间。在状态S0时用户直接按下ALARM键后进入此状态。在此状态下,显示屏上显示的是所设置的闹钟时间。注意:在此状态下,用户按下ALARM键后,显示屏上保持显示闹钟时间,经过一段时间以后,再返回状态S0显示计时器时间。
相应的状态转换及控制如表1所示。
表1 控制器状态转换及控制输出表
当前状态
控制输入(条件)
下一状态
控制输出(动作)
S0
YES = ‘1’
S1
SHOW_NEW_TIME <= ‘1’
ALARM_BUTTON = ‘1’
S4
SHOW_A <= ‘1’
否则
S0
--
S1
YES = ‘1’
S1
SHOW_NEW_TIME <= ‘1’
ALARM_BUTTON = ‘1’
S2
LOAD_NEW_A <= ‘1’
TIME_BUTTON = ‘1’
S3
LOAD_NEW_C <= ‘1’
否则(超时)
否
S1
SHOW_NEW_TIME <= ‘1’, “超时”判断处理
是
S0
--
S2
ALARM_BUTTON = ‘1’
S2
LOAD_NEW_A <= ‘1’
否则
S0
--
S3
TIME_BUTTON = ‘1’
S3
LOAD_NEW_C <= ‘1’
否则
S0
--
S4
ALARM_BUTTON = ‘1’
S4
SHOW_A <= ‘1’
否则(超时)
否
S4
SHOW_A <= ‘1’, “超时”判断处理
是
S0
--
表1中没有显式说明的控制信号赋值,表示信号的值为零。例如在状态S0,当信号YES =‘1’时,SHOW_NEW_TIME信号的赋值为‘1’,而其他信号LOAD_NEW_A、LOAD_NEW_C和SHOW_A的值此时都赋为‘0’。另外,表中关于“超时”判断处理的处理细节见VHDL源程序中的有关部分。
由于在整个系统中有多个模块需要用到自行设计的数据类型,并且这些数据类型大部分相同,因此我们为了使用上的方便,可设计一个程序包P_ALARM,该程序既可加在调用该程序包的程序前面,也可加在整个系统的顶层设计程序的前面。但是对于一个比较复杂系统的设计,一般是分模块进行设计和调试,所以加在各个调用该程序包的程序前面会比较方便写。程序包P_ALARM的具体设计如下:
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 (5 DOWNTO 0) OF T_DIGITAL;
TYPE T_DISPLAY IS ARRAY (5 DOWNTO 0) OF T_DIGITAL;
END PACKAGE P_ALARM;
根据上面的设计分析,我们可将闹钟控制器的VHDL源程序设计如下:
--控制器源程序CONTROL.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY CONTROL 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 CONTROL;
ARCHITECTURE ART OF CONTROL 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)
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='0') 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=>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_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;
END ARCHITECTURE ART;
预置寄存器的设计
这时一个预置数字产生器和移位寄存器的结合体。通过对YES进行操作,选择输入欲输入的数字,暂存用户输入的数字,并且用户每输入一个数字,暂存数字移位一次,实现用户输入数字在显示器上从右到左的依次显示。图5为预置寄存器示意图。
图5 预置寄存器示意图
--预置寄存器的VHDL源程序KEYBUFFER.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.P_ALARM.ALL;
ENTITY KEYBUFFER IS
PORT(KEY:IN STD_LOGIC;
CLK:IN STD_LOGIC;
RESET:IN STD_LOGIC;
KEYNUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
NEW_TIME:OUT T_CLOCK_TIME);
END ENTITY KEYBUFFER;
ARCHITECTURE ART OF KEYBUFFER IS
SIGNAL N_T:T_CLOCK_TIME;
SIGNAL CNT:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL TEMP:T_DIGITAL;
BEGIN
PROCESS(CLK) IS
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
IF CNT=9 THEN
CNT<="0000";
ELSE
CNT<=CNT+'1';
END IF;
END IF;
TEMP<=CONV_INTEGER(CNT);
KEYNUM<=CNT;
END PROCESS;
SHIFT:PROCESS(RESET,KEY) IS
BEGIN
IF (RESET='1') THEN
N_T(5)<=0;
N_T(4)<=0;
N_T(3)<=0;
N_T(2)<=0;
N_T(1)<=0;
N_T(0)<=0;
ELSIF (KEY'EVENT AND KEY='1') THEN
FOR I IN 5 DOWNTO 1 LOOP
N_T(I)<=N_T(I-1);
END LOOP;
N_T(0)<=TEMP;
END IF;
END PROCESS;
NEW_TIME<=N_T;
END ARCHITECTURE ART;
闹钟寄存器的设计
闹钟寄存器模块的功能是在时钟上升沿同步下,根据LOAD_NEW_A端口的输入信号控制ALARM_TIME端口的输出;当控制信号有效(高电平)时,把NEW_ALARM_TIME端口的输入信号值输出;RESET端口输入信号对ALARM_TIME端口的输出进行异步的清零复位。图18是闹钟寄存器的示意图。
图18 闹钟寄存器示意图
--闹钟寄存器的源程序REG.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY 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 ENTITY REG;
ARCHITECTURE ART OF REG IS
BEGIN
PROCESS(CLK,RESET) IS
BEGIN
IF RESET='1' THEN
ALARM_TIME(0)<=0;
ALARM_TIME(1)<=0;
ALARM_TIME(2)<=0;
ALARM_TIME(3)<=0;
ALARM_TIME(4)<=0;
ALARM_TIME(5)<=0;
ELSE
IF RISING_EDGE(CLK) THEN
IF LOAD_NEW_A='1' THEN
ALARM_TIME<=NEW_ALARM_TIME;
END IF;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
分频电路的设计
图6 分频器示意图
本模块的功能是将CLK_IN端口输入的时钟信号分频后送给CLK_OUT端口;当RESET端口输入信号有效(高电平)时,CLK_OUT端口输出信号清零。图6为分频电路示意图。
--分频电路的VHDL程序DIVIDER.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY DIVIDER IS
PORT(CLK_IN:STD_LOGIC;
RESET:IN STD_LOGIC;
CLK_OUT:OUT STD_LOGIC);
END ENTITY DIVIDER;
ARCHITECTURE ART OF DIVIDER IS
CONSTANT DIVIDE_PERIOD:T_SHORT:=6000;
BEGIN
PROCESS(CLK_IN,RESET) IS
VARIABLE CNT:T_SHORT;
BEGIN
IF (RESET='1') THEN
CNT:=0;
CLK_OUT<='0';
ELSIF RISING_EDGE(CLK_IN) THEN
IF (CNT<=(DIVIDE_PERIOD/2)) THEN
CLK_OUT<='1';
CNT:=CNT+1;
ELSIF (CNT<(DIVIDE_PERIOD-1)) THEN
CLK_OUT<='0';
CNT:=CNT+1;
ELSE
CNT:=0;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
时间计数器的设计
时间计数器模块的功能是当RESET端口输入信号为高电平时,对CURRENT_TIME端口输出信号清零复位;当LOAD_NEW_C端口输入信号为高电平时,将NEW_CURRENT_TIME端口的输入信号输出给CURRENT_TIME端口。RESET端口的控制优先于LOAD_NEW_C端口。当这两个控制信号都无效时,在时钟上升沿同步下,对CURRENT_TIME端口输出信号累加1,并根据小时、分钟、秒的规律处理进位。图7是时间计数器模块的示意图。
图7 时间计数器示意图
--时间计数器的源程序COUNTER.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY COUNTER IS
PORT(NEW_CURRENT_TIME:IN T_CLOCK_TIME;
LOAD_NEW_C,CLK,RESET:IN STD_LOGIC;
CURRENT_TIME:OUT T_CLOCK_TIME);
END ENTITY COUNTER;
ARCHITECTURE ART OF COUNTER IS
SIGNAL I_CURRENT_TIME:T_CLOCK_TIME;
BEGIN
PROCESS(CLK,RESET,LOAD_NEW_C) IS
VARIABLE C_T:T_CLOCK_TIME;
BEGIN
IF RISING_EDGE(CLK) THEN
IF RESET='1' THEN
I_CURRENT_TIME(5)<=0;
I_CURRENT_TIME(4)<=0;
I_CURRENT_TIME(3)<=0;
I_CURRENT_TIME(2)<=0;
I_CURRENT_TIME(1)<=0;
I_CURRENT_TIME(0)<=0;
ELSIF LOAD_NEW_C='1' THEN
I_CURRENT_TIME<=NEW_CURRENT_TIME;
ELSE
C_T:=I_CURRENT_TIME;
IF C_T(0)<9 THEN
C_T(0):=C_T(0)+1;
ELSE
C_T(0):=0;
IF C_T(1)<5 THEN
C_T(1):=C_T(1)+1;
ELSE
C_T(1):=0;
IF C_T(2)<9 THEN
C_T(2):=C_T(2)+1;
ELSE
C_T(2):=0;
IF C_T(3)<5 THEN
C_T(3):=C_T(3)+1;
ELSE
C_T(3):=0;
IF C_T(5)<2 THEN
IF C_T(4)<9 THEN
C_T(4):=C_T(4)+1;
ELSE
C_T(4):=0;
C_T(5):=C_T(5)+1;
END IF;
ELSE
IF C_T(4)<3 THEN
C_T(4):=C_T(4)+1;
ELSE
C_T(4):=0;
C_T(5):=0;
END IF;
END IF;
END IF;
END IF;
END IF;
I_CURRENT_TIME<=C_T;
END IF;
I_CURRENT_TIME<=C_T;
END IF;
END IF;
END PROCESS;
CURRENT_TIME<=I_CURRENT_TIME;
END ARCHITECTURE ART;
显示驱动器的设计
本模块的功能是:当SHOW_NEW_TIME端口输入信号有效(高电平)时,根据NEW_TIME端口输入信号(时间数据),产生相应的六个待显示的数据;当SHOW_NEW_TIME端口输入信号无效(低电平)时,判断SHOW_A端口的输入信号,为高电平时,根据ALARM_TIME端口的输入信号(时间数据)产生相应的六个待显示的数据;为低电平时,根据CURRENT_TIME端口的输入信号,产生相应的六个待显示的数据。对于各个待显示的数据,根据动态扫描显示方式在DRIVER端口输出相应的数据显示驱动信息和数码管选择信息。当ALARM_TIME 端口的输入信号值与CURRENT_TIME端口的输入信号值相同时,SOUND_ALARM端口的输出信号有效(高电平),反之无效。图8为显示驱动器示意图。
图8 显示驱动器示意图
--显示驱动器源程序DRIVER.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.P_ALARM.ALL;
ENTITY DRIVER IS
PORT(KEYNUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CLK:IN STD_LOGIC;
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;
LEDW:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
SEG7:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY DRIVER;
ARCHITECTURE ART OF DRIVER IS
SIGNAL DISPLAY_TIME:T_CLOCK_TIME;
SIGNAL TEMP:INTEGER RANGE 0 TO 9;
SIGNAL CNT:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS(ALARM_TIME,CURRENT_TIME,SHOW_A,SHOW_NEW_TIME) IS
BEGIN
SOUND_LP:FOR I IN ALARM_TIME'RANGE LOOP
IF NOT(ALARM_TIME(I)=CURRENT_TIME(I)) THEN
SOUND_ALARM<='0';
ELSE
SOUND_ALARM<='1';
END IF;
END LOOP SOUND_LP;
IF SHOW_NEW_TIME='1' THEN
DISPLAY_TIME<=NEW_TIME;
ELSIF SHOW_A='1' THEN
DISPLAY_TIME<=ALARM_TIME;
ELSIF SHOW_A='0' THEN
DISPLAY_TIME<=CURRENT_TIME;
END IF;
END PROCESS;
PROCESS(CLK) IS
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF CNT="111" THEN
CNT<="000";
ELSE
CNT<=CNT+'1';
END IF;
END IF;
END PROCESS;
LEDW<=CNT;
PROCESS(CNT)
BEGIN
CASE CNT IS
WHEN "000" => TEMP<=DISPLAY_TIME(0);
WHEN "001" => TEMP<=DISPLAY_TIME(1);
WHEN "010" => TEMP<=DISPLAY_TIME(2);
WHEN "011" => TEMP<=DISPLAY_TIME(3);
WHEN "100" => TEMP<=DISPLAY_TIME(4);
WHEN "101" => TEMP<=DISPLAY_TIME(5);
WHEN "111" => TEMP<=CONV_INTEGER(KEYNUM);
WHEN OTHERS=>TEMP<=0;
END CASE;
CASE TEMP IS
WHEN 0=> SEG7<="00111111";
WHEN 1=> SEG7<="00000110";
WHEN 2=> SEG7<="01011011";
展开阅读全文