课程设计电子钟闹铃文档格式.docx
《课程设计电子钟闹铃文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计电子钟闹铃文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
1、顶层文件图:
(见下页)
2、各模块的解释:
(1)、7个输入量clk_1khz、clk_1hz、key_slt、key_alarm、sec_set、min_set、hour_set:
其中clk_1khz为闹铃模块提供时钟,处理后能产生“嘟”、“嘀”和变化的闹铃声音;
clk_1hz为计时模块提供时钟信号,每秒计数一次;
key_slt选择设置对象:
定时或正常时间;
key_alarm能够开启和关闭闹铃;
sec_set、min_set、hour_set用于设置时间或定时,与key_slt相关联。
各按键输出为脉冲信号。
(2)、CNT60_A_SEC模块:
这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示秒的状态。
通过alarm_clk可以选择设置对象为时间还是定时值。
在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。
在设置定时模式上,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。
同时该模块具有两个输出口out_do、out_di来触发整点报时的“嘟”、“嘀”声音。
(3)、CNT60_A_MIN模块:
这个模块式将CNT60_A_SEC的输出信号进行60进制计数,并产生一个时位的触发信号。
将该输出接到两位LED数码后能时时显示分的状态。
同时该模块具有三个输出口out_do、out_di、out_alarm来触发整点报时的“嘟”、“嘀”、闹铃声音。
(4)、CNT24_A_HOUR模块:
这个模块式将CNT60_A_MIN的输出信号做24进制计数。
将该输出接到两位LED数码后能时时显示时的状态。
同时该模块具有一个输出口out_alarm来触发整点报时的闹铃声音。
(5)、PWM_OUT模块:
该模块为PWM产生模块,通过EN可开启和关闭PWM输出。
模块根据CLK信号二分频产生的高低音,并组合,能输出三种声音状态——“嘟”、“嘀”、闹铃。
而该三种声音要被秒、分、时的输出触发才能输出PWM。
(二)系统各个模块的VHDL程序:
(1)、CNT60_A_SEC模块:
程序源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt60_a_secis
port(
clk,clr,enb:
instd_logic;
--clk:
时钟输入信号,clr:
清零端,enb:
使能端
key:
--输入按键脉冲,调整闹铃定时或时间
alarm_clk:
--1:
alarm0:
clk--设置模式选择:
闹铃调节模式、时间调节模式
qout_sl:
outstd_logic_vector(3downto0);
--显示输出秒的低位
qout_sh:
--显示输出秒的高位
co:
outstd_logic;
--进位输出,触发分计数模块
out_do:
--在整点报时中输出“嘟”触发信号
out_di:
outstd_logic--在整点报时中输出“嘀”触发信号
);
end;
architectureaofcnt60_a_secis
signalqout2_l:
std_logic_vector(3downto0);
signalqout2_h:
signalalarm_l:
signalalarm_h:
signalclk1,clk2,tclk,aclk,ac_slt:
std_logic;
begin
process(alarm_clk)--当该端口输入一个脉冲时,修改设置模式:
时间调整或闹铃模式切换
ifalarm_clk'
eventandalarm_clk='
1'
then
ifac_slt='
0'
then--如果为定时模式,将改为闹铃模式
ac_slt<
='
;
else
endif;
endif;
endprocess;
process(key,clk,ac_slt)--根据设置模式,处理key上的脉冲信号
ifac_slt='
then--时间调整模式
aclk<
ifclk='
andkey='
then--clk=1则tclk<
=0,通过挖洞方式添加一个脉冲
tclk<
elsifclk='
then--clk=0,则tclk<
=1,产生一个高电平,添加一脉冲
=clk;
elsifac_slt='
then--闹铃调整模式
tclk<
=key;
--key上的脉冲直接修改闹铃定时值
process(tclk,clr,enb)--60进制计数,个位、十位放在两个临时变量中,表示秒的状态
ifclr='
then--clearingworksatthestateofhighvoltage
qout2_l<
="
0000"
qout2_h<
elsiftclk'
eventandtclk='
ifenb='
then--enableworksathighvoltage
ifqout2_l="
1001"
andqout2_h="
0101"
qout2_l<
--afullmodeiscompletedandacarryoutisgenerated
qout2_h<
elsifqout2_l="
qout2_l<
qout2_h<
=qout2_h+1;
else
=qout2_l+1;
--inprocessofcounting
endif;
process(aclk,clr,enb)--修改闹铃的定时值
alarm_l<
alarm_h<
elsifaclk'
eventandaclk='
ifalarm_l="
andalarm_h="
alarm_l<
alarm_h<
elsifalarm_l="
alarm_l<
alarm_h<
=alarm_h+1;
=alarm_l+1;
process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)--产生进位,显示时间或闹铃定时值
begin
ifqout2_l="
co<
else
then--显示时间
qout_sl<
=qout2_l;
qout_sh<
=qout2_h;
else--显示定时值
=alarm_h;
=alarm_l;
process(qout2_l,qout2_h)--根据秒的状态输出“嘟”、“嘀”触发信号
ifqout2_h="
ifqout2_l="
out_do<
elsifqout2_l="
0010"
0100"
0110"
1000"
elsifqout2_h="
out_di<
else
else
out_do<
out_di<
e