闹钟代码Word文档格式.docx
- 文档编号:19406644
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:17
- 大小:120.20KB
闹钟代码Word文档格式.docx
《闹钟代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《闹钟代码Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
0101"
0000100000"
0110"
0001000000"
0111"
0010000000"
1000"
0100000000"
1001"
1000000000"
WHENOTHERS;
endBehavioral;
--分频器将较高速的外部时钟频率分频成每分钟一次的时钟频率,以便进行时钟计数。
entityfq_divideris
Port(clk_in:
inSTD_LOGIC;
reset:
clk_out:
outSTD_LOGIC);
endfq_divider;
architectureBehavioraloffq_divideris
signaltemp:
std_logic_vector(5downto0);
process(reset,clk_in)
ifreset='
1'
then
temp<
="
000000"
;
clk_out<
='
0'
elsifrising_edge(clk_in)then
if(temp="
111011"
)then
temp<
clk_out<
else
=temp+1;
endif;
endif;
endprocess;
--键盘缓冲器是一个移位寄存器,暂存用户键入的数字,
-------------并且实现用户键入数字在显示器上从右到左的依次显示。
-------------这里需要注意的是,由图6.23可以看出,KEY_BUFFER的时钟端连接的是外部KEY_DOWN信号。
-------------这表示用户每输入一个数字,KEY_BUFFER移位一次。
entitykey_bufferis
Port(clk:
key:
inSTD_LOGIC_VECTOR(3downto0);
new_time1:
outSTD_LOGIC_VECTOR(3downto0);
new_time2:
new_time3:
new_time4:
endkey_buffer;
architectureBehavioralofkey_bufferis
signalreg:
STD_LOGIC_VECTOR(15downto0):
0000000000000000"
PROCESS(clk,reset)
BEGIN
reg<
elsIFrising_edge(clk)THEN
reg<
=reg(11downto0)&
key;
ENDIF;
ENDPROCESS;
new_time1<
=reg(15downto12);
new_time2<
=reg(11downto8);
new_time3<
=reg(7downto4);
new_time4<
=reg(3downto0);
--计数器实际上是一个异步复位、异步置数的累加器,
---------通常情况下进行时钟累加计数,必要时可置入新的时钟值,然后从该值开始新的计数。
----------------------------------------------------------------------------------
entityalarm_counteris
Port(load_new_c:
clk:
new_current_time1:
new_current_time2:
new_current_time3:
new_current_time4:
endalarm_counter;
architectureBehavioralofalarm_counteris
signaltemp1,temp2,temp3,temp4:
std_logic_vector(3downto0):
process(reset,clk,load_new_c)
temp1<
temp2<
temp3<
temp4<
--new_time1<
--new_time2<
--new_time3<
--new_time4<
elsifload_new_c='
=new_current_time1;
=new_current_time2;
=new_current_time3;
=new_current_time4;
elsifrising_edge(clk)then
iftemp4="
temp4<
iftemp3="
temp3<
if(temp1="
)and(temp2="
)then
temp1<
temp2<
elsif(temp1<
=temp1+1;
=temp2+1;
endif;
else
temp3<
=temp3+1;
endif;
=temp4+1;
new_time1<
=temp1;
new_time2<
=temp2;
new_time3<
=temp3;
new_time4<
=temp4;
--寄存器用于保存用户设置的闹钟时间,是一个异步复位寄存器。
entityalarm_regis
load_new_a:
new_alarm_time1:
new_alarm_time2:
new_alarm_time3:
new_alarm_time4:
alarm_time1:
alarm_time2:
alarm_time3:
alarm_time4:
endalarm_reg;
architectureBehavioralofalarm_regis
process(reset,clk)
ifreset='
alarm_time1<
alarm_time2<
alarm_time3<
alarm_time4<
elsifrising_edge(clk)then
ifload_new_a='
=new_alarm_time1;
=new_alarm_time2;
=new_alarm_time3;
=new_alarm_time4;
--显示器根据需要显示当前时间、用户设置的闹钟时间或用户通过键盘输入的新的时间,
---------同时判断当前时间是否已到了闹钟时间,实际上是一个多路选择器加比较器。
entitydisplay_driveris
Port(show_new_time:
show_a:
current_time1:
current_time2:
current_time3:
current_time4:
alarm_time1:
inSTD_LOGIC_VECTOR(3downto0);
alarm_time2:
alarm_time3:
alarm_time4:
display1:
outSTD_LOGIC_VECTOR(3downto0);
display2:
display3:
display4:
sound_alarm:
outstd_logic);
enddisplay_driver;
architectureBehavioralofdisplay_driveris
process(show_new_time,show_a,current_time1,current_time2,current_time3,current_time4)
if(current_time1=alarm_time1)and(current_time2=alarm_time2)and(current_time3=alarm_time3)and(current_time4=alarm_time4)then
sound_alarm<
else
process(show_new_time,show_a,current_time1,current_time2,current_time3,current_time4,new_time1,new_time2,new_time3,new_time4,alarm_time1,alarm_time2,alarm_time3,alarm_time4)
if(show_new_time='
display1<
=new_time1;
display2<
=new_time2;
display3<
=new_time3;
display4<
=new_time4;
elsif(show_a='
=alarm_time1;
=alarm_time2;
=alarm_time3;
=alarm_time4;
else
=current_time1;
=current_time2;
=current_time3;
=current_time4;
--控制器是设计的核心部分,按设计要求产生相应的控制逻辑,以控制其他各部分的工作。
entityalarm_controlleris
Port(key:
time_button:
alarm_button:
load_new_c:
outSTD_LOGIC;
show_new_time:
endalarm_controller;
ARCHITECTUREARTOFALARM_CONTROLLERISTYPEt_stateIS(S0,S1,S2,S3,S4);
CONSTANTKEY_TIMEOUT:
std_logic_vector:
11101"
SIGNALCURR_STATE:
t_state;
SIGNALNEXT_STATE:
SIGNALCOUNTER:
std_logic_vector(4downto0);
SIGNALENABLE_COUNT:
STD_LOGIC;
SIGNALCOUNT_END:
STD_LOGIC;
PROCESS(CLK,RESET)BEGINIFRESET='
THENCURR_STATE<
=S0;
ELSE
IFrising_edge(clk)THENCURR_STATE<
=NEXT_STATE;
ENDIF;
ENDPROCESS;
PROCESS(KEY,ALARM_BUTTON,TIME_BUTTON,CURR_STATE,COUNT_END)BEGINNEXT_STATE<
=CURR_STATE;
LOAD_NEW_A<
='
LOAD_NEW_C<
SHOW_A<
SHOW_NEW_TIME<
ENABLE_COUNT<
CASECURR_STATEISWHENS0=>
IF(KEY='
)THENNEXT_STATE<
=S1;
ELSIF(ALARM_BUTTON='
=S4;
ELSENEXT_STATE<
WHENS1=>
ELSIF(ALARM_BUTTON='
=S2;
ELSIF(TIME_BUTTON='
=S3;
ELSEIF(COUNT_END='
)THENNEXT_STATE<
ELSENEXT_STATE<
WHENS2=>
IF(ALARM_BUTTON='
WHENS3=>
IF(TIME_BUTTON='
ENDIF;
WHENS4=>
IF(COUNT_END='
ENDIF;
WHENOTHERS=>
NULL;
ENDCASE;
ENDPROCESS;
PROCESS(ENABLE_COUNT,CLK)BEGINIF(ENABLE_COUNT='
)THENCOUNTER<
00000"
COUNT_END<
ELSIF(RISING_EDGE(CLK))THENIF(COUNTER>
=KEY_TIMEOUT)THENCOUNT_END<
ELSECOUNTER<
=COUNTER+1;
ENDART;
--测试文件
--------------------------------------------------------------------------------
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.all;
USEieee.n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 闹钟 代码