eda课程设计数字电子钟课程设计.docx

上传人:b****4 文档编号:5507966 上传时间:2022-12-17 格式:DOCX 页数:29 大小:179.89KB
下载 相关 举报
eda课程设计数字电子钟课程设计.docx_第1页
第1页 / 共29页
eda课程设计数字电子钟课程设计.docx_第2页
第2页 / 共29页
eda课程设计数字电子钟课程设计.docx_第3页
第3页 / 共29页
eda课程设计数字电子钟课程设计.docx_第4页
第4页 / 共29页
eda课程设计数字电子钟课程设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

eda课程设计数字电子钟课程设计.docx

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

eda课程设计数字电子钟课程设计.docx

eda课程设计数字电子钟课程设计

 

绍兴文理学院

数理信息学院

EDA技术

课程设计报告

 

课题数字时钟

 

姓名

学号

专业班级

指导教师

时间

课程设计任务书

班级

姓名

题目

数字电子钟设计

技术参数、设计要求、

检测数据等

使用VHDL设计数字电子钟,要求如下:

1.以二十四时制计时,显示小时、分。

2.可以进行时间设置,通过一个按键切换分、时的设置。

3.具有闹钟功能,可设定闹铃时间,闹铃可通过驱动LED代替实现

设计进度安排或工作计划

2014.1.4~2014.1.5:

熟悉课题,查询相关资料,完成方案选择。

2014.1.6~2014.1.7,2014.1.10~2014.1.13:

设计模块划分、实现及各模块调试、验证,整体实现、调试及验证。

2014.1.14~2014.1.15:

课程设计报告撰写、修改,定稿上交。

其它

认真阅读EDA技术课程设计报告撰写规范;课题小组经协商好要指定组长并明确分工,形成良好团队工作氛围;基于课题基本要求,各小组课再细化、增加要求;课题小组每成员均需各自撰写一份课程设计报告。

 

数字钟设计

 

摘要

人类社会已进入到高度发达的信息化社会。

信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。

实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化技术,EDA技术的发展和推广应用又极大的推动了电子信息产业的发展。

EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时为24小时小时制,显示满刻度为23时59分59秒,另外还具有校时功能和闹钟功能。

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

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

input

Pin_3

key

input

Pin_42

Ledw[2]

Output

Pin_126

Ledw[1]

Output

Pin_127

Ledw[0]

Output

Pin_128

Rst

Input

Pin_44

Seg7[7]

output

Pin_20

Seg7[6]

output

Pin_19

Seg7[5]

output

Pin_18

Seg7[4]

output

Pin_17

Seg7[3]

output

Pin_16

Seg7[2]

output

Pin_15

Seg7[1]

output

Pin_14

Seg7[0]

output

Pin_13

Sound_alarm

Output

Pin_95

Time_button

Input

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:

instd_logic;--闹铃设置按钮

time_button:

instd_logic;--时间设置按钮

clk:

instd_logic;--时间输入

rst:

instd_logic;--复位信号

load_new_a:

outstd_logic;--load_new_a=‘1’,控制加载新的闹钟时间值

load_new_c:

outstd_logic;--load_new_c=‘1’,控制加载新的时间值

show_new_time:

outstd_logic;--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:

t_short:

=500;

signalcurr_state:

t_state;

signalnext_state:

t_state;

signalcounter_k:

t_short;

signalenable_count_k:

std_logic;

signalcount_k_end:

std_logic;

signalcounter_a:

t_short;

signalenable_count_a:

std_logic;

signalcount_a_end:

std_logic;

begin

p1:

process(clk,rst)--初始状态

begin

ifrst='1'then

curr_state<=S0;

elsifclk'eventandclk='1'then

curr_state<=next_state;

endif;

endprocessp1;

p2:

process(key,alarm_button,time_button,curr_state,count_a_end,count_k_end)--状态转换

begin

next_state<=curr_state;

load_new_a<='0';

load_new_c<='0';

show_a<='0';

show_new_time<='0';

enable_count_k<='0';

enable_count_a<='0';

casecurr_stateis

whenS0=>if(key='0')then--正常计时

next_state<=S1;

show_new_time<='1';

elsif(alarm_button='1')then

next_state<=S4;

show_a<='1';

else

next_state<=S0;

endif;

whenS1=>if(key='1')then--接收预置数字输入状态

next_state<=S1;

show_new_time<='1';

elsif(alarm_button='1')then

next_state<=S2;

load_new_a<='1';

elsif(time_button='1')then

next_state<=S3;

load_new_c<='1';

else

if(count_k_end='1')then

next_state<=S0;

else

next_state<=S1;

endif;

enable_count_k<='1';

endif;

show_new_time<='1';

whenS2=>if(alarm_button='1')then--设置新的闹钟时间

next_state<=S2;

load_new_a<='1';

else

next_state<=S0;

endif;

whenS3=>if(time_button='1')then--设置新的计时时间

next_state<=S3;

load_new_c<='1';

else

next_state<=S0;

endif;

whenS4=>if(key='1')then--显示闹钟时间

next_state<=S1;

else

next_state<=S4;

if(count_a_end='1')then

next_state<=S0;

else

next_state<=S4;

show_a<='1';

endif;

enable_count_a<='1';

endif;

whenothers=>null;

endcase;

endprocessp2;

count_key:

process(enable_count_k,clk)--key进程

begin

if(enable_count_k='0')then

counter_k<=0;

count_k_end<='0';

elsifclk'eventandclk='1'then

if(counter_k>=key_timeout)then

count_k_end<='1';

else

counter_k<=counter_k+1;

endif;

endif;

endprocesscount_key;

count_alarm:

process(enable_count_a,clk)--闹钟进程

begin

if(enable_count_a='0')then

counter_a<=0;

count_a_end<='0';

elsifclk'eventandclk='1'then

if(counter_a>=show_alarm_timeout)then

count_a_end<='1';

else

counter_a<=counter_a+1;

endif;

endif;

endprocesscount_alarm;

endarchitectureart;

附录2:

预置寄存器模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

usework.P_ALARM.all;

entitykeybufferis

port(key:

instd_logic;--key输入

clk:

instd_logic;--经分频后的时钟脉冲信号

rst:

instd_logic;--复位

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;

begin

process(clk)

begin

ifclk'eventandclk='1'then--内部0到9的计时

ifcnt=9then

cnt<="0000";

else

cnt<=cnt+1;

endif;

endif;

temp<=conv_integer(cnt);

keynum<=cnt;

endprocess;

shift:

process(rst,key)--复位和新的时间或闹钟时间的产生

begin

ifrst='1'then

n_t(5)<=0;

n_t(4)<=0;

n_t(3)<=0;

n_t

(2)<=0;

n_t

(1)<=0;

n_t(0)<=0;

elsifkey'eventandkey='1'then

foriin5downto1loop

n_t(i)<=n_t(i-1);

endloop;

n_t(0)<=temp;

endif;

endprocessshift;

new_time<=n_t;

endarchitectureart;

附录3:

闹钟寄存器模块

libraryieee;

useieee.std_logic_1164.all;

usework.P_ALARM.all;

entityregis

port(

new_alarm_time:

int_clock_time;--接收预置寄存器的new_time后,作为输入

load_new_a:

instd_l

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

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1