VHDL设计的12进制可调时钟带闹铃功能Word格式.docx
- 文档编号:20300332
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:17
- 大小:487.93KB
VHDL设计的12进制可调时钟带闹铃功能Word格式.docx
《VHDL设计的12进制可调时钟带闹铃功能Word格式.docx》由会员分享,可在线阅读,更多相关《VHDL设计的12进制可调时钟带闹铃功能Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
=0;
elsif(complete_1khz<
25000)then
flag_1khz<
='
0'
;
else
endif;
endprocess;
process(flag_1khz)--此进程是得到1hz信号
begin
if(flag_1khz'
eventandflag_1khz='
complete_1hz<
=complete_1hz+1;
if(complete_1hz=1000)then
flag_1hz<
test_out<
=flag_1hz;
endarchitectureone;
(2)、计时模块
--此模块是时分秒计时程序
entitycounteris
port(flag_1hz:
--1hz信号到来时开始计时
pause:
--计时与调整的选择,决定是自动计时还是按键调整时间
add_min:
--按键调整分的信号
add_hour:
--按键调整时的信号
cnt_60s:
outintegerrange0to59;
--秒计数值
cnt_60m:
--分计数值
cnt_12h:
outintegerrange0to11);
--时计数值
architectureoneofcounteris
signalsc_c:
--秒的进位信号
signalmin_c:
--分的进位信号
signalselector_min:
--存放秒的进位信号或者分调整的按键信号
signalselector_hour:
--存放分的进位信号或者时调整的按键信号
process(flag_1hz)--此进程是进行60秒计时
variablecnt_60s_v:
integerrange0to59;
--存放秒计时的中间变量,最后传到秒输出端cnt_60s
if(flag_1hz'
eventandflag_1hz='
if(cnt_60s_v=59)then
cnt_60s_v:
sc_c<
else
=cnt_60s_v+1;
endif;
cnt_60s<
=cnt_60s_v;
--将计数的中间变量传给秒的输出端
endprocess;
process(sc_c,add_min)--此进程是进行60分计时
variablecnt_60m_v:
integerrange0to59;
--存放分计时的中间变量,最后传到分输出端cnt_60m
if(pause='
selector_min<
=sc_c;
--当计时/调整信号为0时正常计时,否则按键调整时间
=add_min;
if(selector_min'
eventandselector_min='
if(cnt_60m_v=59)then
cnt_60m_v:
min_c<
=cnt_60m_v+1;
cnt_60m<
=cnt_60m_v;
--将计数的中间变量传给分输出端
process(min_c,selector_hour)--此进程是进行12小时计时
variablecnt_12h_v:
integerrange0to11;
--存放时的中间变量,最后传到分输出端cnt_60h
selector_hour<
=min_c;
=add_hour;
if(selector_hour'
eventandselector_hour='
)then
if(cnt_12h_v=11)then
cnt_12h_v:
=cnt_12h_v+1;
cnt_12h<
=cnt_12h_v;
(3)、设置闹铃时间模块
--设置闹铃时间,定时闹铃
entitysetalarmtimeis
port(set_alarm,set_sc,set_min,set_hour:
sc_data,min_data:
outintegerrange0to59;
hour_data:
endentity;
architectureoneofsetalarmtimeis
process(set_sc)
variableset_sc_data:
--定义局部变量
if(set_alarm='
if(set_sc'
eventandset_sc='
if(set_sc_data=59)then
set_sc_data:
else
=set_sc_data+1;
--设置秒
sc_data<
=set_sc_data;
--秒设置好赋值给输出端
process(set_min)
variableset_min_data:
if(set_min'
eventandset_min='
if(set_min_data=59)then
set_min_data:
=set_min_data+1;
--设置分
min_data<
=set_min_data;
--分设置好赋值给输出端
process(set_hour)
variableset_hour_data:
if(set_hour'
eventandset_hour='
if(set_hour_data=11)then
set_hour_data:
=set_hour_data+1;
--设置时
hour_data<
=set_hour_data;
--时设置好赋值给输出端
(4)、闹铃模块
--闹铃模块,时间相等则开始闹铃
entityalarmis
port(sc,min:
inintegerrange0to59;
hour:
inintegerrange0to11;
--正常计时的时分秒
set_sc,set_min:
set_hour:
--设置闹铃时间的时分秒
clear_alarm:
--停止闹铃信号
flag_1s:
--1hz信号
alarm_start:
outbit;
--开始闹铃信号
alarm_end:
--结束闹铃信号
flag_alarm:
outbit);
--闹铃标志信号
architectureoneofalarmis
signalflag_alarm_start:
bit;
--定义开始闹铃信号
signalflag_alarm_end:
--定义结束闹铃信号
process(sc,min,hour)
if(flag_1s'
eventandflag_1s='
if(sc=set_scandmin=set_minhour=set_hour)then
flag_alarm_start<
=notflag_alarm_start;
--如果正常计时的时间和设置的闹铃时间相等时开始闹铃
--如果时间不相等则不闹铃
alarm_start<
=flag_alarm_start;
将信号赋值给输出端
process(clear_alarm)
if(clear_alarm'
eventandclear_alarm='
flag_alarm_end<
=notflag_alarm_end;
--如果停止闹铃信号到来则停止闹铃
alarm_end<
=flag_alarm_end;
process(flag_alarm_start,flag_alarm_end)
flag_alarm<
=flag_alarm_startxorflag_alarm_end;
(5)、二选一模块
--选择正常计时时间或者设置闹铃时间
entitytwo_sel_oneis
port(selector:
--选择信号
sc,min:
inintegerrange0to11;
--正常计时时间输入端
--设置闹铃时间的输入端
sc_out,min_out:
hour_out:
--二选一选择后输出
architectureoneoftwo_sel_oneis
begin
process(sc,min,hour,set_sc,set_min,set_hour)
if(selector='
sc_out<
=sc;
min_out<
=min;
hour_out<
=hour;
--如果选择信号为0时,输出的是正常计时时间
=set_sc;
=set_min;
=set_hour;
--如果选择信号为1时,输出的是设置的闹铃时间
(6)、显示模块
--此程序是将时分秒的十位和个位数分开并且转换成段码,还有位选
entitydisplayis
port(sc_data:
min_data:
flag_1khz:
--1khz的位选信号
Q:
outstd_logic_vector(7downto0);
--接数码管的段码引脚
S:
outstd_logic_vector(7downto0));
--接数码管的位选引脚
endentitydisplay;
architectureoneofdisplayis
signalsc_l,sc_h,min_l,min_h,hour_l,hour_h:
integerrange0to9;
signalsc_l_q,sc_h_q,min_l_q,min_h_q,hour_l_q,hour_h_q:
std_logic_vector(7downto0);
process(sc_data,min_data,hour_data)--将时分秒的十位和各位分开
sc_l<
=sc_datamod10;
sc_h<
=integer(sc_data/10);
min_l<
=min_datamod10;
min_h<
=integer(min_data/10);
hour_l<
=hour_datamod10;
hour_h<
=integer(hour_data/10);
process(sc_l,sc_h,min_l,min_h,hour_l,hour_h)--将时分秒的个位和十位转换成数码管显示的段码
case(sc_l)is--秒各位
when0=>
sc_l_q<
="
00000011"
when1=>
10011111"
when2=>
00100101"
when3=>
00001101"
when4=>
10011001"
when5=>
01001001"
when6=>
01000001"
when7=>
00011111"
when8=>
00000001"
when9=>
00001001"
whenothers=>
null;
endcase;
case(sc_h)is--秒十位
sc_h_q<
case(min_l)is--分个位
min_l_q<
case(min_h)is--分十位
min_h_q<
case(hour_l)is--时个位
hour_l_q<
case(hour_h)is--时十位
hour_h_q<
process(flag_1khz)--此进程是实现数码管动态显示
variablecounter_10:
integerrange0to10;
if(flag_1khz'
if(counter_10=7)then
counter_10:
=counter_10+1;
case(counter_10)is
S<
01111111"
Q<
=sc_l_q;
10111111"
=sc_h_q;
11011111"
11111101"
--显示'
-'
11101111"
=min_l_q;
11110111"
=min_h_q;
11111011"
=hour_l_q;
11111110"
=hour_h_q;
4、硬件仿真如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 设计 12 可调 时钟 闹铃 功能