eda课程设计数字电子钟课程设计Word下载.docx
- 文档编号:18495457
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:29
- 大小:179.89KB
eda课程设计数字电子钟课程设计Word下载.docx
《eda课程设计数字电子钟课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《eda课程设计数字电子钟课程设计Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计时、校时程序模块、闹钟控制器程序模块、预制寄存器模块、闹钟寄存器程序模块和显示驱动器程序设计。
且使用QUARTUSII软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词数字钟;
EDA;
vhdl语言
设计概述
数字钟是一种用数字电路技术实现时、分、秒计时的钟表。
与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。
数字钟的设计方法有许多种,例如可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用单片机来实现电子钟等等。
这些方法都各有其特点,其中利用单片机实现的电子钟具有编程灵活,以便于功能的扩展[1]。
数字钟无非就是分频计数,设计出60进制,24进制计数器,在这里,秒分计数是60进制,时计数是24进制,对1Hz信号进行60分频也就产生了分计数脉冲,对1Hz进行3600分频也就产生了时计数脉冲,为了方便校时,系统设计时未直接采用试验箱上的1Hz作为基准时钟源,而是对1kHz进行1000分频产生秒脉冲,1000分频作为校时与闹钟时间设置脉冲,为方便调闹钟,采用了数据选择器选择输出正常走时或闹钟时间。
利用位选信号进行动态扫描,点亮数码管,显示正常的计时时间。
设计方案
设计要求
在EDA实验箱上利用FPGA、LED彩灯及数码管实现数字钟设计,功能要求如下:
●由试验箱上的时钟信号经分频产生秒脉冲;
●用60进制和24进制实现计时;
●可手动校时,能分别进行时分的校正;
●可设置闹时功能,当计时到预定时间时,扬声器发出闹铃信号;
系统设计方案
经过参考和分析后[2][3],得到数字钟设计的总体设计方案,总体设计方案的组成模块及模块间的关系如下图所示:
图21数字钟设计原理图
数字时钟设计总体设计方案中各模块的主要功能如下:
●闹钟控制器模块:
通过有限状态机(FSM)的方式来实现。
估计设计要求及端口设置,需要五个状态来实现:
S0:
表示电路初态即正常时钟计数状态,完成计时功能;
S1:
接收预置数字输入状态。
在状态S0时用户按下“key”键后进入此状态。
在此状态下,显示屏上显示的是用户预置的数字。
S2:
设置新的闹钟时间。
在状态S1时用户按下“alarm”键后进入此状态。
S3:
设置新的计时器时间。
在状态S1时用户按下“time”键后进入此状态。
S4:
显示闹钟时间。
在状态S0时用户直接按下“alarm”键后进入此状态。
在此状态下,显示屏上显示的是所设置的闹钟时间。
注意:
在此状态下,用户按下“alarm”键后,显示屏上保持显示闹钟时间,经过一段时间以后,再返回状态S0显示计时器时间。
●预置寄存器模块:
这是一个预置数字产生器和移位寄存器的结合体。
●闹钟寄存器模块:
在闹钟上升沿同步下,根据load_new_a端口的输入信号控制alarm_time端口的输出。
●分频模块:
将clk_in端口输入的时钟信号分频后送给clk_out端口。
●时间计数模块:
由分频电路的clk_out输出提供1Hz的计数脉冲,实现秒分时的计时。
●显示驱动模块:
根据三个位选信号的动态扫描,让数码管点亮并显示时间和预置数。
●顶层模块:
调用以上所有模块,完成实验设计。
设计实现
闹钟控制器实现
Clk为时钟外部,rst为复位信号。
当key为高电平时,表示用户按下数字键(“0”~“9”)。
当alarm_button为高电平时,表示用户按下alarm键。
当time_button为高电平时,表示用户按下time键。
当load_new_a为高电平时,控制加载新的闹钟时间值。
当load_new_c为高电平时,控制设置新的时间。
图32control
当show_new_time为高电平时,控制数码管显示新的时间值;
当其为低电平,show_a为高电平时,控制显示闹钟时间,否则,显示当前时间。
图3.1为闹钟控制器示意图。
预置寄存器实现
图33keybuffer
通过对key进行操作,选择输入欲预置的数字,暂存用户输入的数字,且用户每输入一个数字,暂存数字移位一次,实现用户输入数字在显示屏上从右到左的依次显示。
图3.2为预置寄存器示意图。
图34reg
闹钟寄存器实现
闹钟寄存器模块的功能是在时钟上升沿同步下,根据load_new_a端口的输入信号控制alarm_time端口的输出;
当控制信号为高电平时,把new_alarm_time端口的输入信号值输出;
rst端口输入信号对alarm_time端口输出进行异步的清零复位。
图3.3为闹钟寄存器的示意图。
分频电路实现
本模块的功能是将clk_in端口输入的时钟信号分频后送给clk_out端口;
当rst端口输入信号为高电平时,clk_out端口输出信号清零。
图3.4为分频电路示意图。
图35divider
时钟计数器实现
图36counter
时间计数器模块的功能是当rst端口输入信号为高电平时,对current_time端口输出信号清零复位;
当load_new_c端口输入信号为高电平时,将new_current_time端口的输入信号输出给current_time端口。
Rst端口的控制优于load_new_c端口。
当这两个控制信号都无效时,在时钟上升沿同步下,对current_time端口输出信号累加1,并根据小时,分钟,秒的规律处理进位。
图3.5为时间计数器示意图。
显示驱动器实现
图37driver
本模块的功能是:
当show_new_time端口输入信号有效时,根据new_time端口输入信号,产生相应的6个待显示的数据;
当show_new_time端口输入信号无效时,判断show_a端口的输入信号,为高电平时,据alarm_time端口的输入信号产生相应的6个待显示的数据;
为低电平时,据current_time端口的输入信号,产生相应的6个待显示的数据。
对于各个待显示的数据,根据动态扫描显示方式在driver端口输出相应的数据显示驱动信息和数码管选择信息。
当alarm_time端口的输入信号值与current_time端口的输入信号值相同时,sound_alarm端口的输出信号有效,反之无效。
图3.6为显示驱动示意图。
顶层原件实现
根据原理图,定义端口的输入和输出信号。
内部就是对各个模块的原件例,实现
功能。
图38d_clock
设计验证
闹钟控制器验证
对闹钟控制模块进行仿真,得到仿真图如下:
图41闹钟控制器仿真图
当clk事件发生,key和alarm_button为高电平时,在下一个时钟上升沿到来时,show_new_time有值的改变。
当rst为高电平时,show_new_time清零。
预置寄存器验证
对预置寄存器模块进行仿真,得到仿真图如下:
图42预置寄存器仿真图
时钟事件发生时,keynum有0到9的顺环输出。
Rst的复位信号对keynum的输出没有影响,因为它们不是同一进程。
闹钟寄存器验证
对闹钟寄存器模块进行仿真,得到仿真图如下:
图43闹钟寄存器仿真图
让load_new_a置高电平时,new_alarm_time有值的改变。
波形中没有对alarm_time的设置,故此没有它的相关波形。
分频电路验证
图44分频电路仿真图
对分频模块进行仿真,得到仿真图如下:
对1Khz的时钟进行1000分频。
后经rst复位后,clk_out输出为低。
时钟计数器验证
对时钟计数器模块进行仿真,得到仿真图如下:
图45时钟计数仿真图
在1KHz的脉冲下计数器计时。
Rst为高电平时,时间复位。
显示驱动器验证
对显示驱动器模块进行仿真,得到仿真图如下:
图46显示驱动仿真图
伴随着时钟信号,位选有选择的选中某个数码管,并点亮它们。
由于各个模块仿真结果均达到了设计要求,因此可以将设计下载到试验箱上进行验证。
表1端口和引脚的对应关系
Nodename
direction
location
Alarm_button
input
Pin_41
clk
Pin_3
key
Pin_42
Ledw[2]
Output
Pin_126
Ledw[1]
Pin_127
Ledw[0]
Pin_128
Rst
Input
Pin_44
Seg7[7]
output
Pin_20
Seg7[6]
Pin_19
Seg7[5]
Pin_18
Seg7[4]
Pin_17
Seg7[3]
Pin_16
Seg7[2]
Pin_15
Seg7[1]
Pin_14
Seg7[0]
Pin_13
Sound_alarm
Pin_95
Time_button
Pin_45
总结
本实验我们实现了数字钟设计中的计时功能,还有两块设置时间和闹钟的时间没有在实验箱上实现。
通过这次课程设计,加深了我对EDA这门课程的了解,并且更加熟悉软件的操作。
在这次课程设计中,我的主要任务是查阅各种相关资料,并且整理选择其中需要的的确是很有难度。
但在组员和其他同学以及老师的帮助下,我们还是收集了一些重要的代码。
但尽管资料丰富,可惜自己平时的学习没有到位。
还是未能顺利相对有用的部分进行归纳。
虽然中间遇到了不少的难题,在众多的复杂资料中找出完成整个实验,在设置时间闹铃是遇到的难题,始终难以克服。
加上时间有限,只能留下这个遗憾。
但是在未来的学习生活中,我会更加严格要求自己,努力克服这些难题。
参考文献
[1]XX文库.数字钟设计[EB/OL].
[2]刘艳昌,王廷雨.基于FPGA的数字钟系统设计[J].河南科技学院学报.2013,41(4):
86-95
[3]孙维功.基于VHDL语言的数字钟设计[J].高科技产品研发.2012,50-51
[4]中华文本库.动态扫描数码管显示VHDL[EB/OL].
[5]谭会生.EDA技术及应用实践[M].第二版.湖南:
湖南大学出版社,2010.299-314
附录
附录1:
闹钟控制器模块
PACKAGEP_ALARMIS--定义一个P_ALARM包
subtypet_digitalisintegerrange0to9;
subtypet_shortisintegerrange0to65535;
typet_clock_timeisarray(5downto0)oft_digital;
typet_displayisarray(5downto0)oft_digital;
endPACKAGEP_ALARM;
libraryieee;
useieee.std_logic_1164.all;
usework.P_ALARM.all;
entitycontrolis
port(
key:
instd_logic;
--若key=‘1’,则预置数被选中
alarm_button:
--闹铃设置按钮
time_button:
--时间设置按钮
clk:
--时间输入
rst:
--复位信号
load_new_a:
outstd_logic;
--load_new_a=‘1’,控制加载新的闹钟时间值
load_new_c:
outstd_logic;
--load_new_c=‘1’,控制加载新的时间值
show_new_time:
--show_new_time=‘1’,控制数码管显示新的时间值
show_a:
outstd_logic);
--show_new_time=‘0’,且show_a=‘1’,控制显示闹--钟时间,否则,显示当前时间
endentitycontrol;
architectureartofcontrolis
typet_stateis(s0,s1,s2,s3,s4);
constantkey_timeout:
t_short:
=500;
constantshow_alarm_timeout:
signalcurr_state:
t_state;
signalnext_state:
signalcounter_k:
t_short;
signalenable_count_k:
std_logic;
signalcount_k_end:
signalcounter_a:
signalenable_count_a:
signalcount_a_end:
begin
p1:
process(clk,rst)--初始状态
ifrst='
1'
then
curr_state<
=S0;
elsifclk'
eventandclk='
=next_state;
endif;
endprocessp1;
p2:
process(key,alarm_button,time_button,curr_state,count_a_end,count_k_end)--状态转换
next_state<
=curr_state;
load_new_a<
='
0'
;
load_new_c<
show_a<
show_new_time<
enable_count_k<
enable_count_a<
casecurr_stateis
whenS0=>
if(key='
)then--正常计时
=S1;
elsif(alarm_button='
)then
=S4;
else
whenS1=>
)then--接收预置数字输入状态
=S2;
elsif(time_button='
=S3;
if(count_k_end='
whenS2=>
if(alarm_button='
)then--设置新的闹钟时间
whenS3=>
if(time_button='
)then--设置新的计时时间
whenS4=>
)then--显示闹钟时间
if(count_a_end='
whenothers=>
null;
endcase;
endprocessp2;
count_key:
process(enable_count_k,clk)--key进程
if(enable_count_k='
counter_k<
=0;
count_k_end<
if(counter_k>
=key_timeout)then
=counter_k+1;
endprocesscount_key;
count_alarm:
process(enable_count_a,clk)--闹钟进程
if(enable_count_a='
counter_a<
count_a_end<
if(counter_a>
=show_alarm_timeout)then
=counter_a+1;
endprocesscount_alarm;
endarchitectureart;
附录2:
预置寄存器模块
useieee.std_logic_unsigned.all;
entitykeybufferis
port(key:
--key输入
--经分频后的时钟脉冲信号
--复位
keynum:
outstd_logic_vector(3downto0);
--预置数产生
new_time:
outt_clock_time);
--新的闹钟时间或新的计时时间
endentitykeybuffer;
architectureartofkeybufferis
signaln_t:
t_clock_time;
signalcnt:
std_logic_vector(3downto0);
signaltemp:
t_digital;
process(clk)
ifclk'
then--内部0到9的计时
ifcnt=9then
cnt<
="
0000"
=cnt+1;
temp<
=conv_integer(cnt);
keynum<
=cnt;
endprocess;
shift:
process(rst,key)--复位和新的时间或闹钟时间的产生
n_t(5)<
n_t(4)<
n_t(3)<
n_t
(2)<
n_t
(1)<
n_t(0)<
elsifkey'
eventandkey='
foriin5downto1loop
n_t(i)<
=n_t(i-1);
endloop;
=temp;
endprocessshift;
new_time<
=n_t;
附录3:
闹钟寄存器模块
libraryieee;
entityregis
new_alarm_time:
int_clock_time;
--接收预置寄存器的new_time后,作为输入
instd_l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 课程设计 数字 电子钟