数字电子时钟报告.docx
- 文档编号:24568945
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:19
- 大小:200.48KB
数字电子时钟报告.docx
《数字电子时钟报告.docx》由会员分享,可在线阅读,更多相关《数字电子时钟报告.docx(19页珍藏版)》请在冰豆网上搜索。
数字电子时钟报告
电子信息与电气工程学院
EDA课程设计
设计题目:
<<数字电子时钟>>
专业:
电子信息工程
班级:
姓名:
学号:
数字电子时钟简介
数字电子时钟是一利用数字电路来显示秒分时的计时装置,与传统的机械钟相比,具有走时准确,显示直观,无机械传动装置等优点;因而得到广泛应用。
随着人们生活水平的不断改善和美化,很多场合都可以看到数字电子时钟,并且已成为人们生活中必不可少的一部分,最常见比如电子手表,电子闹钟,万年历,手机时钟……
数字电子时钟设计任务
本设计以KX-DN系列综合实验开发板系统开发实验,通过verilog语言编写各个功能模块,并且经过精确仿真修改达到理想状态,最后连接各个功能模块组成一个完整的数字电子时钟电路。
本设计不仅能够精确显示时分秒(为了起到直观、简洁、美化的作用,我们用“—”区分),而且能通过开发板上的按键来控制改变时、分、秒的功能,大大方便了用户的校时、校分、校秒,大大增加数字电子时钟实用性。
该时钟还有一键清零(复位清零)的功能,可以防止因外界、内因而导致的时钟计数错误,然后再通过校时、校分、校秒的功能来进行调整时间。
最后还能通过开发板上的蜂鸣器来进行整点报时,这一点对这个设计来说是最具人性化的。
我们可以按照自己的意愿来进行调整时间报时,已达到个性化设计。
一、总体设计方案
设计原理及思路
原理图如下:
数码管显示模块
分频模块
↑↑
四选一多路选择器
↑↑
计数器模块
24进制计数器
60进制计数器
60进制计数器
整点报时模块
→
↑
四选三多路选择器
↑
计数器模块
↑
去抖动模块
数字钟实际上就是对1Hz的频率进行计数的计数电路。
振荡器产生32768Hz的时钟信号,经过分频器后产生512Hz、64Hz、2Hz的脉冲信号,秒计数器计满60后,触发分计数器,分计数器计满60后,触发计时电路,当计满24小时后开始下一轮计数。
如果计数的起始时间与设想的有误差,可以通过调时、调分按键或复位键进行手动调时。
计数器的输出经过4选1多路选择器后以动态扫描方式送到LED数码管输出。
由框图可知程序模块可分为消抖模块、2分频、60进制计数器、24进制计数器、4选3多路选择器、七段译码器、位选端控制器组成。
整体原理图:
二各模块说明
2.1消抖模块
2.1.1消抖模块原理
按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
为了消除机械开关的抖动,可在开关与输出端点之间接人一个RS触发器,就能使输出端产生很清晰的阶跃信号。
2.1.2消抖模块程序代码
moduleXiaodou(CLK,KIN,KOUT);
inputCLK,KIN;//工作时钟和输入信号
outputKOUT;regKOUT;
reg[3:
0]KH,KL;//定义对高电平和低电平脉宽计数之寄存器。
always@(posedgeCLK)begin
if(!
KIN)KL<=KL+1;//对键输入的低电平脉宽计数
elseKL<=4'b0000;end//若出现高电平,则计数器清0
always@(posedgeCLK)begin
if(KIN)KH<=KH+1;//同时对键输入的高电平脉宽计数
elseKH<=4'b0000;end//若出现高电平,则计数器清0
always@(posedgeCLK)begin
if(KH>4'b1100)KOUT<=1'B1;//对高电平脉宽计数一旦大于12,则输出1
elseif(KL>4'b0111)
KOUT<=1'B0;//对低电平脉宽计数若大于7,则输出0
endendmodule
仿真波形:
2.2四选一多路选择器
2.2.1四选一多路选择器原理
该四选一多路选择器没有进位端,用于四选一多路选择器的输入,控制其输出计时器的计时信号。
同时它也作为位选端控制器的输入,决定哪个数码管亮。
四选一多路计数器采用时序逻辑电路,从0开始计时到3后归零,重新进行开始计时。
2.2.2四选一多路选择器程序代码
moduleZonghe(k,Q_miinutes,Q_second,Q_hour,Q);
inputk;
input[7:
0]Q_second,Q_miinutes,Q_hour;
outputreg[31:
0]Q;
always
begin
Q[31:
24]=Q_hour;
Q[23:
20]=4'ha;
Q[19:
12]=Q_miinutes;
Q[11:
8]=4'ha;
Q[7:
0]=Q_second;
end
endmodule
仿真波形
2.32分频
2.3.12分频原理
该模块用于产生秒计数脉冲。
2分频即在每一个输入脉冲的上升沿(或下降沿)取反即可得到。
2.3.22分频程序代码
moduleFenpin(clk,newclk);
inputclk;
outputregnewclk;
reg[24:
0]cnter;
always@(posedgeclk)
begin
if(cnter<20000000)cnter=cnter+1;
elsecnter=0;
if(cnter<10000000)newclk=1;
elsenewclk=0;
end
endmodule
仿真波形:
2.4六十进制计数器
2.4.1六十进制计数器原理
六十进制计数器作为秒计数器和分计数器的低位,具有进位输出端和异步复位端,复位信号为高电平有效。
它要求从0到59计数,到五十九清零重新计数。
采用时序逻辑电路。
设计时应考虑计数器能够进行级联。
2.4.2六十进制计数器程序代码
moduleCount60(clrn,clk,q,j,cont);
inputclrn,clk,j;
outputreg[7:
0]q;
outputregcont;
always@(posedgeclk^jornegedgeclrn)
beginif(~clrn)q=1'b0;
elsebeginif(q==8'b0101_1001)q=1'b0;
elseq=q+1'b1;
if(q[3:
0]==4'b1010)
beginq[3:
0]=4'b0;q[7:
4]=q[7:
4]+1'b1;
endif(q==8'b0101_1001)cont=1;
elsecont=0;
end
end
endmodule
仿真波形:
2.5二十四进制计数器(含进位端)
2.5.1二十四进制计数器(含进位端)原理
该二十四进制计数器作为秒计数器和分计数器的高位,具有进位输出端和异步复位端,复位信号为高电平有效。
它要求从0到23计数,到23清零重新计数。
采用时序逻辑电路。
设计时应考虑计数器能够进行级联。
2.5.2二十四进制计数器(含进位端)程序代码
modulecount24(clrn,clk,q,j,cont);
inputclrn,clk,j;
outputreg[7:
0]q;
outputregcont;
always@(posedgeclk^jornegedgeclrn)
beginif(~clrn)q=0;
elsebeginif(q=='h23)q=0;
elseq=q+1;
if(q[3:
0]=='ha)
beginq[3:
0]=0;q[7:
4]=q[7:
4]+1;
endif(q=='h23)cont=1;
elsecont=0;
end
end
endmodule
仿真波形:
2.6四选一多路选择器
2.6.1四选一多路选择器原理
四选一多路选择器通过四进制计数器的输出信号控制实现了对计数器产生的脉冲信号的选择性输出。
加入此模块是为了实现数码管的动态扫描输出。
四选一多路选择器的输入是一个二位二进制数,输出是计时器、计分器、计秒器的高位或低位。
2.6.2四选一多路选择器程序代码
moduleSixuanyi(k,jm,jf,js,j1,j2,j3);
inputk,j1,j2,j3;
outputregjm,jf,js;
alwaysbegin
if(k==0)
{jm,jf,js}={j1,j2,j3};
else
;
end
endmodule
仿真波形:
2.7三选一多路选择器
2.7.1三选一多路选择器原理
三选一多路选择器通过三进制计数器的输出信号控制实现了对计数器产生的脉冲信号的选择性输出。
加入此模块是为了实现数码管的动态扫描输出。
三选一多路选择器的输入是一个三进制数,输出是计时器、计分器、计秒器的高位或低位。
2.7.2三选一多路选择器程序代码
moduleSanxuanyi(clk,A1,A2,N,J1,J2,J3);
inputclk,A1,A2,N;
outputregJ1,J2,J3;
alwaysbegin
case({A1,A2})
0:
J1=N;
1:
J2=N;
2:
J3=N;
default:
J1=N;
endcase
end
endmodule
仿真波形:
2.8七段译码器
2.8.1七段译码器原理
七段译码器是对输入的信号对应的位置进行编码,使其能显示出输入的数的值。
本文所介绍的译码器将小数点dp通过位拼接符将其与计数器的计数值组合,然后一同给到译码管,便于输出。
计时器低位的小数点要求常亮,即dp=1;计分器的低位小数点要求以1Hz的频率闪烁,可以让它以2分频的输出为值。
2.8.2七段译码器程序代码
moduleDisplay(clk,rst_n,d,dig,seg);
inputclk;//20MHz
inputrst_n;//复位信号,低电平有效
input[31:
0]d;//要显示的32位数据
output[7:
0]dig;//位选信号
output[7:
0]seg;//段码dp到a由高到低排列
parameterN=20000;//分频系数
regclkout;//扫描时钟
reg[13:
0]cnt;//分频计数器
reg[2:
0]scan_cnt;//扫描计数器
reg[3:
0]disp_dat;//每一位数码管待译码数据
reg[7:
0]dig;
reg[7:
0]seg_r;
always@(posedgeclkornegedgerst_n)//分频到1KHz
begin
if(!
rst_n)
cnt<=0;
else
begin
if(cnt==N/2-1)
begin
clkout<=~clkout;
cnt<=0;
end
else
cnt<=cnt+1'b1;
end
end
always@(posedgeclkoutornegedgerst_n)//产生扫描计数值
begin
if(!
rst_n)
scan_cnt<=0;
else
scan_cnt<=scan_cnt+1'b1;
end
always@(scan_cnt,d)//8位数码管位选择,同时送相应要显示数据
begin
case(scan_cnt)
3'b000:
begin
dig<=8'b0000_0001;
disp_dat<=d[3:
0];
end
3'b001:
begin
dig<=8'b0000_0010;
disp_dat<=d[7:
4];
end
3'b010:
begin
dig<=8'b0000_0100;
disp_dat<=d[11:
8];
end
3'b011:
begin
dig<=8'b0000_1000;
disp_dat<=d[15:
12];
end
3'b100:
begin
dig<=8'b0001_0000;
disp_dat<=d[19:
16];
end
3'b101:
begin
dig<=8'b0010_0000;
disp_dat<=d[23:
20];
end
3'b110:
begin
dig<=8'b0100_0000;
disp_dat<=d[27:
24];
end
3'b111:
begin
dig<=8'b1000_0000;
disp_dat<=d[31:
28];
end
default:
begin
dig<=8'b0000_0001;
disp_dat<=d[3:
0];
end
endcase
end
always@(disp_dat)//共阳极数码管译码
begin
case(disp_dat)
4'h0:
seg_r=8'hc0;//显示"0"
4'h1:
seg_r=8'hf9;//显示"1"
4'h2:
seg_r=8'ha4;//显示"2"
4'h3:
seg_r=8'hb0;//显示"3"
4'h4:
seg_r=8'h99;//显示"4"
4'h5:
seg_r=8'h92;//显示"5"
4'h6:
seg_r=8'h82;//显示"6"
4'h7:
seg_r=8'hf8;//显示"7"
4'h8:
seg_r=8'h80;//显示"8"
4'h9:
seg_r=8'h90;//显示"9"
4'ha:
seg_r=8'hbf;//显示"a"
/*4'hb:
seg_r=8'h83;//显示"b"
4'hc:
seg_r=8'hc6;//显示"c"
4'hd:
seg_r=8'ha1;//显示"d"
4'he:
seg_r=8'h86;//显示"e"
4'hf:
seg_r=8'h8e;//显示"f"*/
default:
seg_r=8'hff;//灭
endcase
end
assignseg=~seg_r;//取反变成共阴极段码
endmodule
2.9整点报时模块
2.9.1整点报时模块程序代码
moduleBaoshi(H,M,S,qy,ling);
input[7:
0]H,M,S;
inputqy;
outputling;
regbshi;
regling;
parametera=4'b0000,b=4'b0001,c=4'b0000,d=4'b0000,e=4'b0001,f=4'b0000;
always@(HorMorSorqy)
begin
if({H,M,S}==24'b000000010000000000010000)
ling<=qy;
else
ling<=0;
end
endmodule
2.10综合模块
2.10.1综合模块原理
综合模块采用模块例化的方法实现。
2.10.2综合模块程序代码
moduleZonghe(k,Q_miinutes,Q_second,Q_hour,Q);
inputk;
input[7:
0]Q_second,Q_miinutes,Q_hour;
outputreg[31:
0]Q;
always
begin
Q[31:
24]=Q_hour;
Q[23:
20]=4'ha;
Q[19:
12]=Q_miinutes;
Q[11:
8]=4'ha;
Q[7:
0]=Q_second;
end
endmodule
2.11计数器模块
2.11.1计数器模块程序代码
moduleJISHU(clk,m,rst_n,v);
inputclk,m,rst_n;
outputv;
regp;
always@(posedgeclk)
begin
if(!
rst_n)
p<=1'b0;
elseif(!
m)
p<=p+1'b1;
elseif(p==1'h9)p<=1'h0;
end
assignv=p;
endmodule
三总结
3.1程序过大
程序方面,由于EPM3064ALC44-10芯片只有64个宏单元,编写程序时有可能导致所需的宏单元数超过提供的数量,经过分析在处理小数点的时候,直接把其作为与其它段显示一起定义成八位变量,这样就会增加芯片内存消耗,但实际要求中只用到两个小数点,所以把这个小数点单独进行操作处理,大大减少了宏单元的利用,这样才能编译成功。
3.2赋值问题
初次实验,第一次按键不起作用。
原因是出在阻塞与非阻塞赋值上。
非阻塞赋值在过程块执行完后才赋值,由于变量初始值为0,所以第一次按键变量的值并未随之改变。
此时我们可以适当调整赋值顺序,将其改变为阻塞赋值。
即可解决这一问题。
后来我们采用了拨码开关,这个问题也顺利解决。
参考文献
[978-7030-3878-20]潘松黄继业潘明.EDA技术实用教程----VerilogHDL版(第五版)科学出版社,2010年6月,1—386页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 电子 时钟 报告