数字钟数字逻辑
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字钟的设计
一、数字钟的功能描述
(1)、计时和显示功能
采用24小时制,以十进制数字显示时、分、秒(时从00-23,分、秒从00-59)。(2)、校时功能。
当数字钟走时有偏差时,应能手动校时。
二、数字钟的设计思路
根据功能要求,整个数字钟分为计时和校时两个部分。
计时部分秒计时电路接收1Hz时基信号,进行60进制计数,计满后秒值归0,并产生1/60Hz时钟信号,分钟计时电路接收1/60Hz时钟信号,进行60进制计数,计满后秒值归0,并产生1/3600Hz时钟信号,,小时计时电路接收1/3600Hz 时钟信号,进行24小时计数,计满后小时、分、秒均归0,如此循环往复。
校时部分,采用两个瞬态按键配合实现,1号键产生单脉冲,控制数字在计时/校时/校分/校秒两种状态间转换,2号键通过控制计数使能端让时/分/秒计数器发生状态翻转发达到指定的数值。
总体原理电路如下图-1所示:
图-1数字钟的原理电路
三、采用原理图和HDL混合设计方式实现数字钟
(1)小时计时电路
小时计时电路需要24进制计数,其电路下图-2所示:
图-2 小时计时电路
该电路用两片74160(一位十进制加法计数器)采用同步连接构成24进制计数器,通过译码电路识别暂态“24”,输出低电平使计数器清零。整个计数循环为00→01→02→……→23→00→……,共有24个稳定状态。计数值采用BCD码形式,Q7-Q4表示小时的十位,Q3-Q0表示小时的个位。EN输入端当正常计数状态时接收分钟计时电路的进位输出,而在校时状态时接收校时脉冲用于控制小时值的翻转。小时计时模块的输入输出端口如下图-3所示:
图-3 小时计时电路的端口特征
(2)分钟、秒计时电路
分钟、秒计时需要60进制计数,其电路下图-4所示:
图-4 分钟计时电路
该电路用两片74160(一位十进制加法计数器)采用同步连接构成60进制计数器,通过译码电路识别暂态“59”,输出低电平使计数器清零。整个计数循环为00→01→02→……→58→59→00→……,共有60个稳定状态。计数值采用BCD 码形式,Q7-Q4表示分钟或秒的十位,Q3-Q0表示分钟或秒的个位。EN输入端当正常计数状态时接收分钟计时电路的进位输出,而在校时状态时接收校时脉冲用于控制小时值的翻转。计满进位输出端CO用于触发高一级计数器的计数动作(秒计满触发分钟的计数,分钟计满触发小时的计数)。分钟、秒计时模块的输入输出端口如下图-5所示:
图-5 分钟/秒计时电路的端口特征
(1)计时/校时的切换由模块Count_control实现,其端口特征如下图-6所示:
图-6 计时/校时切换(计数控制)端口特征
期中,Func_sel输入端接收功能脉冲输入,维护内部一个模4计数器,以此控制数字钟在计时/校时/校分/校秒四种状态间转换;Setn输入端接收校时脉冲,负脉冲有效,每收到1个校时脉冲,对应的计数单元(时单元或分单元或秒单元)计数加1;Sec_co输出由秒计数单元的进位提供,Min_co输入输出由秒计数单元的进位提供;Sec_sn、Min_en、Hour_en提供三个计数单元所需要的使能信号(由此模块的内部逻辑在前级进位输出和校时脉冲之间作二选一)。计数单元功能选择及相应信号的定义如下表-1 所示:
内部模4计数状
当前功能Sec_en取值Min_co取值Hour_en取值态Q1 Q0
00 计数高电平秒单元进位分单元进位
01 调时低电平低电平校时脉冲
10 调分低电平小时脉冲低电平
11 调秒小时脉冲低电平低电平Count_control模块的AHDL源码如下:
subdesign count_control
(
func_sel:input;
setn:input;
sec_co,min_co:input;
sec_en,min_en,hour_en:output;
)
variable
q[1..0]:dff;
begin
q[].clk=func_sel;
q[]=q[]+1;
if(q[]>3)then q[]=0;
end if;
case q[]is
when 0=>sec_en=vcc;
min_en=sec_co;
hour_en=min_co;
when 1=>sec_en=gnd;
min_en=gnd;
hour_en=!setn;
when 2=>sec_en=gnd;
min_en=!setn;
hour_en=gnd;
when 3=>sec_en=!setn;
min_en=gnd;
hour_en=gnd;
end case;
end;
以上述模块为基础,可以完成下图-1所示的顶层设计。下面采用扫描显示方式实现时分秒的小时,其扫描显示驱动电路如下图-7所示:
图-7 扫描显示驱动电路
期中,Select_disp根据模6计数器Counter6的输出将待显示的6位十进制结果分时送给七段译码器Deled以产生显示字形,Counter6的输出同时可以用来将显示结果在6个数码管上展开,只要时钟Clk_scan的频率合适,就可以看到完整的时分秒显示结果。
模块Counter6的AHDL源码如下(其中使用了状态机描述方法):subdesign counter6
(
clk:input;
q[2..0]:output;
)
variable
ss:machine of bits(q[2..0])
with states
(
s0=0,
s1=1,
s2=2,
s3=3,
s4=4,
s5=5
);
begin
ss.clk=clk;
table
ss=>ss;
s5=>s4;
s4=>s3;
s3=>s2;