数字电子时钟报告.docx

上传人:b****2 文档编号:24568945 上传时间:2023-05-28 格式:DOCX 页数:19 大小:200.48KB
下载 相关 举报
数字电子时钟报告.docx_第1页
第1页 / 共19页
数字电子时钟报告.docx_第2页
第2页 / 共19页
数字电子时钟报告.docx_第3页
第3页 / 共19页
数字电子时钟报告.docx_第4页
第4页 / 共19页
数字电子时钟报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数字电子时钟报告.docx

《数字电子时钟报告.docx》由会员分享,可在线阅读,更多相关《数字电子时钟报告.docx(19页珍藏版)》请在冰豆网上搜索。

数字电子时钟报告.docx

数字电子时钟报告

电子信息与电气工程学院

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页

 

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

当前位置:首页 > 高等教育 > 工学

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

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