数字时钟设计及实现资料Word格式文档下载.docx
《数字时钟设计及实现资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数字时钟设计及实现资料Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
LED码控制信号线分别和LED的7个数码控制端a-g相连,用来控制LED上显示的字符,通过合理的控制扫描时钟,就可以得到稳定的时、分、秒的显示。
图1数字时钟结构图
三系统以及模块硬件电路设计
1、数字时钟控制信号
改数字时钟的控制部分由芯片完成。
该芯片的输入和输出接口由下面信号组成。
(1)输入信号
复位信号(reset)
时钟输入信号(clk)
小时递增信号(hour_inc)
小时递减信号(hour_dec)
分钟递增信号(min_inc)
分钟递减信号(min_dec)。
(2)输出信号
LED选择信号(sel)
LED码显示控制信号(segment)。
2、控制模块结构
该设计分为下面4个模块:
定时时钟模块、扫描时钟模块、按键处理模块、定时计数模块和显示控制模块。
图2给出了这几个模块之间的信号连接关系。
(1)按键处理模块
由于VHDL语言的规则,将按键的处理和定时模块设计在一起。
为了描述清楚,将对按键的处理进行说明。
在该设计中,采用异步复位电路方式。
当复位信号低有效时,计时器停止计时,时、分、秒清0。
图2电子钟控制模块的内部连接图
对于小时的递增、递减按键操作,通过一个1HZ的计数时钟采样。
图3给出了递增、递减的操作时序。
图3预置操作和定时时钟的关系
当1HZ的div_clk信号的上升沿到来时,检测hour_inc和hour_dec按键,图中的虚线表示在时钟的上升沿对按键信号进行采样。
当hour_inc或hour_dec按键低有效时,对小时进行递加或递减操作。
对于分针的递加、递减按键操作,也是通过一个1HZ的计数时钟采样。
原理如图4所示。
图4定时器时、分、秒之间的连接关系
(2)定时时钟模块
定时时钟模块作用就是,将外部提供的1MHZ的时钟通过分频器后向模块内的定时计数模块提供1HZ的定时计数时钟。
在设计定时时钟模块时,采用同步计数电路。
(3)扫描时钟模块
扫描时钟模块的作用就是通过对1MHZ的分频处理后,向显示控制模块提供合适的显示扫描时钟,该始终必须经过合理的设计,才能保证7段数码显示的稳定。
在设计扫描时钟模块时,采用同步计数电路。
(4)定时计数模块
定时计数模块是该设计中最重要的一部分,在设计该模块时,为了便于后续显示控制模块的设计,将时、分、秒进行分离,即小时分成了小时的十位和个位分别处理,分钟分成了分钟的十位和个位分别处理。
秒分成了秒的十位和个位分别处理。
在该设计中,采用24小时计数模式。
例如13:
28:
57。
13为小时的表示,1为小时的十位,3为小时的个位;
28为分钟的表示,2为分钟的十位,8为分钟的个位;
57为秒的表示,5为秒的十位,7为秒的个位。
由于对小时、分钟和秒的十位及个位分别处理,在设计该模块就稍微复杂些。
下面逐一进行说明。
秒的个位计数从0到9,即十进制计数。
当秒的个位计数到9后,准备向秒的十位进位。
秒的十位计数从0到5,即六进制计数。
当秒的十位计数到5后,准备向分的个位进位。
分钟的个位计数从0到9,即十进制计数。
当分钟的个位计数到9后,准备向分钟的十位进位。
分钟的十位计数从0到5,即六进制计数。
当分钟的十位计数到5后,准备向小时的个位进位。
对于小时的处理比较复杂,小时的十位和个位之间存在下面的关系:
●当小时的十位为0或1时,小时的个位可以计数范围为0-9,即十进制计数。
●当小时的十位为2时,小时的个位可以计数范围为0-3,即四进制计数。
图4给出了定时器时、分、秒之间的关系。
(5)显示控制模块
显示控制模块主要作用是在7段数码管上正确地显示0-9的数字。
Sel三位LED选择线和3-8译码器相连。
表1开发系统工作模式:
接口
名称
类型
(输入/输出)
结构图上
的信号名
引脚号
说明
复位信号
in
Reset
Pin_g26
进行复位,显示屏清0
时钟输入信号
In
clk
Pin_n2
输入时钟
小时递增信号
Hour_inc
Pin_n23
用于小时位调节
小时递减信号
Hour_dec
Pin_p23
分钟递增符号
Min_inc
Pin_w26
用于分钟位调节
分钟递减符号
Min_dec
none
LED选择信号
Out
sel
用于选择LED信号
LED码显示控制信号
segment
用于控制LED显示屏
四系统的VHDL设计
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityclockis--实体定义部分
port(
clk:
instd_logic;
rst:
inc_min:
instd_logic;
sub_min:
inc_hour:
sub_hour:
sel:
outstd_logic_vector(2downto0);
q:
outstd_logic_vector(7downto0);
endclock;
architecturebehavioralofclockis--信号定义部分
signalsec_counter1:
std_logic_vector(3downto0);
signalsec_counter2:
signalmin_counter1:
signalmin_counter2:
signalhour_counter1:
signalhour_counter2:
signaldivcounter:
std_logic_vector(19downto0);
signaldiv_clk:
std_logic;
signalscancounter:
std_logic_vector(1downto0);
signalscan_clk:
signalscan_out:
std_logic_vector(2downto0);
signalsecseg1,secseg2,minseg1,minseg2,hourseg1,hourseg2:
std_logic_vector(7downto0);
begin
process(rst,clk)--计数时钟代码设计
begin
if(rst='
0'
)then
divcounter<
=x"
00000"
;
div_clk<
='
elsif(rising_edge(clk))then
if(divcounter=x"
7a11f"
=notdiv_clk;
else
=divcounter+1;
endif;
endprocess;
process(rst,clk)--数码管扫描时钟
scancounter<
="
00"
scan_clk<
if(scancounter="
11"
=notscan_clk;
=scancounter+1;
process(div_clk,rst)--时钟计数部分主进程
if(rst='
)then--复位部分
sec_counter1<
0"
sec_counter2<
min_counter1<
min_counter2<
hour_counter1<
hour_counter2<
elsif(rising_edge(div_clk))then--手动调分,递增
if(inc_min='
if(min_counter1=x"
9"
if(min_counter2>
5"
=min_counter2+1;
=min_counter1+1;
elsif(sub_min='
)then--手动调分,递减
if(min_counter2=x"
=mincounter2-1;
else
=min_counter1-1;
endif;
elsif(inc_hour='
)then--手动调时,增时
if(hour_counter2=x"
2"
if(hour_counter1=x"
3"
=hour_counter1+1;
=hour_counter2+1;
elsif(sub_hour='
)then--手动调时,减时
=hour_counter2-1;
else
=hour_counter1-1;
else--时分秒正常计时
if(sec_counter1>
if(sec_counter2>
if(min_counter1>
hour_couner2<
=sec_counter2+1;
=sec_counter1+1;
endprocess;
process(rst,scan_clk)--生成扫描时钟
scan_out<
000"
elsif(rising_edge(scan_clk))then
if(scan_out="
101"
=scan_out+1;
process(scan_out)--扫描输出进程
casescan_outis
when"
=>
q<
=secseg1;
sel<
001"
=secseg2;
010"
=minseg1;
011"
=minseg2;
100"
=hourseg1;
=hourseg2;
whenothers=>
11111111"
111"
endcase;
process(sec_counter1)--秒低位显示
casesec_counter1is
when"
0000"
secseg1<
10111111"
0001"
10000110"
0010"
11011011"
0011"
11001111"
0100"
11100110"
0101"
11101101"
0110"
11111101"
0111"
10000111"
1000"
1001"
11101111"
process(sec_counter2)--秒高位显示
casesec_counter2is
secseg2<
00111111"
00000110"
01011011"
01001111"
01100110"
01101101"
01111111"
process(min_counter1)--分低位显示
casemin_counter1is
minseg1<
process(min_counter2)--分高位显示
casemin_counter2is
minseg2<
process(hour_counter1)--小时低位显示
casehour_counter1is
hourseg1<
process(hour_counter2)--小时高位显示
casehour_counter2is
hourseg2<
endbehavioral;
--程序结束
五结论以及结果说明
1.系统运行环境
(1)PC机一台
(2)QuartusII6.0软件一套
(3)主芯片为ALTERA公司DE2board(CYCLONEⅡ2C55FPGA)
2.运行结果
程序运行正常,实验板仿真由于管脚问题没能得以实现。
参考文献
[1]何宾.EDA原理及应用[M].出版地:
清华大学出版社,2009.237-247.
[2]何宾.EDA原理及应用实验教程[M].出版地:
清华大学出版社,2009.70-75.