6.12 闹钟系统的设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

6.12闹钟系统的设计6.12.11闹钟系统的设计要求及设计思路要求设计一个带闹钟功能的24小时计时器,计时器的外观如图6.14所示。图6.14计时器外观0123654789ALARMTIME该计时器设计要求完成如下功能:(1)计时功能:这是本计时器设计的基本功能,每隔一分钟计时一次,并在显示屏上显示当前时间。(2)闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声。(3)设置新的计时器时间:用户用数字键‘0’~‘9’输入新的时间,然后按TIME键确认。(4)设置新的闹钟时间:用户用数字键“0”~“9”输入新的时间,然后按“ALARM”键确认。过程与(3)类似。(5)显示所设置的闹钟时间:在正常计时显示状态下,用户直接按下“ALARM”键,则已设置的闹钟时间将显示在显示屏上。6.12.2闹钟系统的控制器的设计1.设计思路控制器命名为ALARM_CONTROLLER,其外部端口如图6.15所示。各端口的作用如下:图6.15控制器的外部端口ALARM_CONTROLLERKEYALARM_BUTTONTIME_BUTTONCLKRESETLOAD_NEW_ALOAD_NEW_CSHOW_NEW_TIMESHOW_A(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信号的值控制显示当前时间或闹钟时间。根据设计要求及端口设置,需要五个状态来实现:S0:表示电路初态即正常时钟计数状态,完成前面设计功能(1)的工作。S1:接收键盘输入状态。在状态S0时用户按下数字键后进入此状态。在此状态下,显示屏上显示的是用户键入的数字。S2:设置新的闹钟时间。在状态S1时用户按下ALARM键后进入此状态。S3:设置新的计时器时间。在状态S1时用户按下TIME键后进入此状态。S4:显示闹钟时间。在状态S0时用户直接按下ALARM键后进入此状态。在此状态下,显示屏上显示的是所设置的闹钟时间。注意:在此状态下,用户按下ALARM键后,显示屏上保持显示闹钟时间,经过一段时间以后,再返回状态S0显示计时器时间。相应的状态转换及控制如表6.1所示。表6.1控制器状态转换及控制输出表表6.1中没有显式说明的控制信号赋值,表示信号的值为零。例如在状态S0,当信号KEY=‘1’时,SHOW_NEW_TIME信号的赋值为‘1’,而其他信号LOAD_NEW_A、LOAD_NEW_C和SHOW_A的值此时都赋为‘0’。另外,表中关于“超时”判断处理的处理细节见VHDL源程序中的有关部分。2.VHDL源程序--整个设计中将要用到的程序包定义程序P_ALARM.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEP_ALARMISSUBTYPET_DIGITALISINTEGERRANGE0TO9;SUBTYPET_SHORTISINTEGERRANGE0TO65535;TYPET_CLOCK_TIMEISARRAY(3DOWNTO0)OFT_DIGITAL;TYPET_DISPLAYISARRAY(3DOWNTO0)OFSTD_LOGIC_VECTOR(6DOWNTO0);TYPESEG7ISARRAY(0TO9)OFSTD_LOGIC_VECTOR(6DOWNTO0);CONSTANTSEVEN_SEG:SEG7:=(“0111111”,“0000110”,“1011011”,1001111,1100110,1101101,1111101,0000111,1111111',1110011);TYPEKEYPAD9ISARRAY(0TO9)OFSTD_LOGIC_VECTOR(9DOWNTO0);CONSTANTKEYNUMBER:KEYPAD9:=(0000000001,--00000000010,--10000000100,--20000001000,--30000010000,--40000100000,--50001000000,--60010000000,--70100000000,--81000000000--9);ENDPACKAGEP_ALARM;--控制器源程序ALARM_CONTROLLER.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.P_ALARM.ALL;ENTITYALARM_CONTROLLERISPORT(KEY:INSTD_LOGIC;ALARM_BUTTON:INSTD_LOGIC;TIME_BUTTON:INSTD_LOGIC;CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;LOAD_NEW_A:OUTSTD_LOGIC;LOAD_NEW_C:OUTSTD_LOGIC;SHOW_NEW_TIME:OUTSTD_LOGIC;SHOW_A:OUTSTD_LOGIC);ENDENTITYALARM_CONTROLLER;ARCHITECTUREARTOFALARM_CONTROLLERISTYPET_STATEIS(S0,S1,S2,S3,S4);CONSTANTKEY_TIMEOUT:T_SHORT:=500;CONSTANTSHOW_ALARM_TIMEOUT:T_SHORT:=500;SIGNALCURR_STATE:T_STATE;SIGNALNEXT_STATE:T_STATE;SIGNALCOUNTER_K:T_SHORT;SIGNALENABLE_COUNT_K:STD_LOGIC;SIGNALCOUNT_K_END:STD_LOGIC;SIGNALCOUNTER_A:T_SHORT;SIGNALENABLE_COUNT_A:STD_LOGIC;SIGNALCOUNT_A_END:STD_LOGIC;BEGINPROCESS(CLK,RESET)ISBEGINIFRESET='1'THENCURR_STATE=S0;ELSIFRISING_EDGE(CLK)THENCURR_STATE=NEXT_STATE;ENDIF;ENDPROCESS;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';CASECURR_STATEISWHENS0=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;ENDIF;WHENS1=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;ENDIF;ENABLE_COUNT_K='1';ENDIF;SHOW_NEW_TIME='1';WHENS2=IF(ALARM_BUTTON='1')THENNEXT_STATE=S2;LOAD_NEW_A='1';ELSENEXT_STATE=S0;ENDIF;WHENS3=IF(TIME_BUTTON='1')THENNEXT_STATE=S3;LOAD_NEW_C='1';ELSENEXT_STATE=S0;ENDIF;WHENS4=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';ENDIF;ENABLE_COUNT_A='1';ENDIF;WHENOTHERS=NULL;ENDCASE;ENDPROCESS;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;ENDIF;ENDIF;ENDPROCESSCOUNT_KEY;COUNT_ALARM:PROCESS(ENABLE_COUNT_A,CLK)ISBEGINIF(ENABLE_COUNT_A='0')THENCOUNTER_A=0;COUNT_A_END='0';ELSIFRISING_EDGE(CLK)THENIF(COUNTER_A=SHOW_ALARM_TIMEOUT)THENCOUNT_A_END='1';ELSECOUNTER_A=COUNTER_A+1;ENDIF;ENDIF;ENDPROCESSCOUNT_ALARM;ENDARCHITECTUREART;6.12.3闹钟系统的译码器的设计1.设计思路本模块的功能是将每次按下闹钟系统的数字键盘后产生的一个数字所对应的10位二进制数据信号转换为1位十进制整数信号,以作为小时、分钟计数的四个数字之一,如图6.16所示。其中,KEYPAD为输入端口,接收10位二进制数据信号;VALUE为输出端口,输出相应的1位十进制整数信号。输入数据与输出数据的译码关系见表6.2。图6.16电路系统示意图KEYPADDECODERVALUE表6.2输入、输出数据的译码关系2.VHDL源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.P_ALARM.ALL;ENTITYDECODERISPORT(KEYPAD:INSTD_LOGIC_VECTOR(9DOWNTO0);VALUE:OUTT_DIGITAL);ENDENTITYDECODER;ARCHITECTUREARTOFDECODERISBEGINWITHKEYPADSELECTVALUE=0WHEN“0000000001”,1WHEN“0000000010”,2WHEN“0000000100”,3W

1 / 85
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功