eda课程设计数字电子钟课程设计Word文件下载.docx

上传人:b****6 文档编号:8424006 上传时间:2023-05-11 格式:DOCX 页数:29 大小:179.89KB
下载 相关 举报
eda课程设计数字电子钟课程设计Word文件下载.docx_第1页
第1页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第2页
第2页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第3页
第3页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第4页
第4页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第5页
第5页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第6页
第6页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第7页
第7页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第8页
第8页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第9页
第9页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第10页
第10页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第11页
第11页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第12页
第12页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第13页
第13页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第14页
第14页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第15页
第15页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第16页
第16页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第17页
第17页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第18页
第18页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第19页
第19页 / 共29页
eda课程设计数字电子钟课程设计Word文件下载.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

eda课程设计数字电子钟课程设计Word文件下载.docx

《eda课程设计数字电子钟课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《eda课程设计数字电子钟课程设计Word文件下载.docx(29页珍藏版)》请在冰点文库上搜索。

eda课程设计数字电子钟课程设计Word文件下载.docx

总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计时、校时程序模块、闹钟控制器程序模块、预制寄存器模块、闹钟寄存器程序模块和显示驱动器程序设计。

且使用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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2