课程设计报告
设计题目:数字时钟设计
学生姓名:
专业: 电子科学与技术
年级:
指导老师:
南通大学电子信息学院
2015年7月8日
摘要:数字时钟我们听到这几个字,第一反应就是我们所说的数字,不错数字时钟就是以数字显示取代模拟表盘的钟表,在显示上它用数字反应出此时的时间,相比模拟钟能给人一种一目了然的感觉,不仅如此它还能同时显示时、分、秒。而且能对时、分、秒准确校时,这是普通钟所不及的。数字时钟广泛应用于各个公共场所,成为人们日常生活中不可少的必需品。数字时钟是一种显示时、分、秒的计时装置且具有校时、暂停功能,其计时周期为24小时,显示满刻度为23时59分59秒,秒计数器电路计满60 后触发分计数器电路,分计数器电路计满60 后触发时计数器电路,当计满24 小时后又开始下一轮的循环计数。
关键字:时、分、秒、校时、暂停
目录
摘要及关键字…………………………………………1
一.前言………………………………………………3
1.实验目的…………………………………………3
2.实验思想…………………………………………3
二.设计方案…………………………………………4
1.设计原理…………………………………………4
2.设计过程…………………………………………4
3.仿真实验及下载…………………………………12
三.总结体会…………………………………………14
四.参考文献…………………………………………14
五.附录………………………………………………15
1.管脚绑定…………………………………………15
一.
前言
1.实验目的
在QuartusⅡ软件平台下,运用verilog硬件描述语言和DE2来实现数字时钟功能。数字时钟包括组合逻辑电路和时序电路,能够正确显示时、分、秒,并有校时、暂停功能,要求在数码管上正确显示。
在完成基本要求的基础上,可进一步增加功能、提高性能,如增加闹铃功能。
2.实验思想
本实验的难点主要在于如何使时钟正确显示,并在数码管上显示,在实验过程中,在输出波形时出现了问题,50MHz太大,波形输出所需时间太长,最后新建了一个文件,将输入时钟脉冲改为1Hz,这样波形输出所需时间就大大减少,顺利完成本实验。
二.设计方案
1.设计原理
数字时钟是一个对标准频率(1Hz)进行计数的计数电路。数字时钟分为分频器、时计数器、分计数器、秒计数器,当秒计数器计满60后触发分计数器,分计数器计满60后触发时计数器,当计满24小时后又开始下一轮循环。通过校时电路可对分和时进行校正,通过暂停键实现暂停功能。数字时钟要完成显示需要6个数码管,数码管显示要用到7段数码显示译码器程序来正确显示时间。
2.设计过程
(1)分频
利用分频器将clk_50MHz变为频率为1Hz,这样使得数字时钟正常计数。
(2)计时
当秒后一位小于9时,秒后一位一直加1,当秒后一位大于等于9,即为9时,下一个脉冲秒后一位为0,此时看秒前一位。当秒前一位小于5时,秒前一位一直加1,当秒前一位大于等于5,即为5时,下一个脉冲秒前一位为0,此时看分后一位。当分后一位小于9时,分后一位一直加1,当分后一位大于等于9,即为9时,下一个脉冲分后一位为0,此时看分前一位。当分前一位小于5时,分前一位一直加1,当分前一位大于等于5,即为5时,下一个脉冲分前一位为0,此时看小时。当小时前一位为2,此时当小时后一位小于3时,小时后一位一直加1,当小时后一位大于等于3,即为3时,下一个时钟脉冲小时前一位后一位均为0。当小时前一位不为2,此时当小时后一位小于9时,小时后一位一直加1,当小时后一位大于等于9时,即为9时,下一个时钟脉冲小时后一位为0,小时前一位加1。
(3)校时,秒分时加1
秒、分、时分开校时,秒与分均从0计到59,时从0计到23。其中ss1与pause相当于一个,即ss1可写可不写。
(4)数码管显示(6个)
DE2上的数码管为共阳极,即为低电平有效电路。数码管如图所示。
以下为源程序:
module clock(_50MHZ,pause,ss1,sm1,sh1,s0,s1,m0,m1,h0,h1);
input _50MHZ,pause,ss1,sm1,sh1;
reg [3:0] second0,second1,minute0,minute1,hour0,hour1;
output reg [6:0] s0,s1,m0,m1,h0,h1;
reg[32:0] Q1;
reg _1HZ;
always@(posedge _50MHZ )//分频
begin
if (Q1==24999999) //24999999//499
begin Q1=0;
_1HZ=~_1HZ;
end
else if(pause==0) Q1=Q1+1'd1;
end
always@(posedge _1HZ)//计时
begin
if(second0<4'b1001) second0<=second0+4'b1;
else
begin
second0<=0;
if(second1<4'b0101) second1<=second1+4'b1;
else
begin
second1<=4'b0;
if(minute0<4'b1001)minute0<=minute0+4'b1;
else
begin
minute0<=4'b0;
if(minute1<4'b0101)minute1<=minute1+4'b1;
else
begin
minute1<=4'b0;
if(hour1==4'b0010)begin
if(hour0<4'b0011) hour0<=hour0+4'b1;
else begin hour0<=0;hour1<=0;end
end
else
begin if(hour0<4'b1001)hour0<=hour0+4'b1;
else begin
hour0<=4'b0;
hour1<=hour1+4'b1;
end
end
end
end
end
end
if(ss1==1)//秒+1
begin if (second0<4'b1001)
second0<=second0+4'b1;
else begin second0<=4'b0;
if(second1<4'b0101)
second1<=second1+4'b1;
else second1<=4'b0;
end
end
if(sm1==1)//分钟+1
begin if (minute0<4'b1001)
minute0<=minute0+4'b1;
else begin minute0<=4'b0;
if(minute1<4'b0101)
minute1<=minute1+4'b1;
else minute1<=4'b0;
end
end
if(sh1==1)//小时+1
if(hour1==4'b0010)
begin
if(hour0<4'b0011) hour0<=hour0+4'b1;
else begin hour0<=0;hour1<=0;end
end
else begin if(hour0<4'b1001)
hour0<=hour0+4'b1;
else begin
hour0<=4'b0;
hour1<=hour1+4'b1;end
end
case(second0)//数码管显示
4'b0000:s0=7'b1000000;
4'b0001:s0=7'b1111001;
4'b0010:s0=7'b0100100;
4'b0011:s0=7'b0110000;
4'b0100:s0=7'b0011001;
4'b0101:s0=7'b0010010;
4'b0110:s0=7'b0000010;
4'b0111:s0=7'b1111000;
4'b1000:s0=7'b0000000;
4'b1001:s0=7'b0010000;
default:s0=7'b0000000;
endcase
case(second1)
4'b0000:s1=7'b1000000;
4'b0001:s1=7'b1111001;
4'b0010:s1=7'b0100100;
4'b0011:s1=7'b0110000;
4'b0100:s1=7'b0011001;
4'b0101:s1=7'b0010010;
4'b0110:s1=7'b0000010;
4'b0111:s1=7'b1111000;
4'b1000:s1=7'b0000000;
4'b1001:s1=7'b0010000;
default:s1=7'b0000000;
endcase
case(minute0)
4'b0000:m0=7'b1000000;
4'b0001:m0=7'b1111001;
4'b0010:m0=7'b0100100;
4'b0011:m0=7'b0110000;
4'b0100:m0=7'b0011001;
4'b0101:m0=7'b0010010;
4'b0110:m0=7'b0000010;
4'b0111:m0=7'b1111000;
4'b1000:m0=7'b0000000;
4'b1001:m0=7'b0010000;
default:m0=7'b0000000;
endcase
case(minute1)
4'b0000:m1=7'b1000000;
4'b0001:m1=7'b1111001;
4'b0010:m1=7'b0100100;
4'b0011:m1=7'b0110000;
4'b0100:m1=7'b0011001;
4'b0101:m1=7'b0010010;
4'b0110:m1=7'b0000010;
4'b0111:m1=7'b1111000;
4'b1000:m1=7'b0000000;
4'b1001:m1=7'b0010000;
default:m1=7'b0000000;
endcase
case(hour0)
4'b0000:h0=7'b1000000;
4'b0001:h0=7'b1111001;
4'b0010:h0=7'b0100100;
4'b0011:h0=7'b0110000;
4'b0100:h0=7'b0011001;
4'b0101:h0=7'b0010010;
4'b0110:h0=7'b0000010;
4'b0111:h0=7'b1111000;
4'b1000:h0=7'b0000000;
4'b1001:h0=7'b0010000;
default:h0=7'b0000000;
endcase
case(hour1)
4'b0000:h1=7'b1000000;
4'b0001:h1=7'b1111001;
4'b0010:h1=7'b0100100;
4'b0011:h1=7'b0110000;
4'b0100:h1=7'b0011001;
4'b0101:h1=7'b0010010;
4'b0110:h1=7'b0000010;
4'b0111:h1=7'b1111000;
4'b1000:h1=7'b0000000;
4'b1001:h1=7'b0010000;
default:h1=7'b0000000;
endcase
end
endmodule
3.仿真实验及下载
(1) 利用QuartusⅡ软件输入程序,进行编译。
(2) 指定芯片CycloneⅡ: EP2C35F672C6
(3)新建波形文件,置入输入输出,脉冲Time period设为20ns,进行仿真,此时仿真时间过长,无法输出波形。
这是因为clk_50MHz频率太大,因此要将关于50MHz的相关程序删除,即分频,以及相应的对50MHz的说明,并将1Hz作为输入脉冲。将End time设为1ms,脉冲Time period设为20ns,进行仿真,此时波形如下图所示。
显示0时,数码管有6个低电平,一个高电平,显示1时,数码管有2个低电平,5个高电平,与程序中数码管相对应。由于只设置了1ms,仅有秒在跳变,即从0开始一直加1,直到59,与题目要求数字时钟正确显示相符。
(4) 管脚绑定(见附录)
打开Assignments:Pins进行管脚绑定。
(5) 运用DE2开发板进行下载验证
此时用的程序仍为原来有50MHz的程序,再编译一次,连接DE2开发板,点击Programmer,在出现的窗口中点击Hardware Setup,选择USB-Blaster,然后点击start,即下载到DE2板子上,下载完成。
SW[0]为pause键,SW[1],SW[2],SW[3]分别对应时、分、秒的校时键,这四个键均为高有效。
三.总结体会
转眼间,两周的课程设计就要结束了。通过这次对数字钟的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字钟的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才开始下载在开发板上的。但是最后的成品却不一定与仿真时完全一样,因为,在仿真中有着各种各样的条件制约着,例如我们遇到的频率太大,输出波形所需时间太长的问题。而且,在仿真中无法成功的程序,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过课程设计,我更加明白了一个真理,“实践是检验真理的唯一标准”。课程设计达到了专业学习的预期目的。课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是通过对设计过程的了解,进一步激发了我们对专业知识的兴趣,并能结合实际存在的问题在专业领域内进行更深入的学习。
四.参考文献
[1]康华光,电子技术基础 数字部分 第六版[M].北京:高等教育出版社,2014.1
[2]夏宇闻,Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2013.7
[3]数电实验指导书
五.附录
1.管脚绑定
| _50MHZ | PIN_N2 | m0[5] | PIN_AB25 | s0[4] | PIN_AE11 |
| h0[6] | PIN_T3 | m0[4] | PIN_AB26 | s0[3] | PIN_AD11 |
| h0[5] | PIN_R6 | m0[3] | PIN_AC26 | s0[2] | PIN_AC12 |
| h0[4] | PIN_R7 | m0[2] | PIN_AC25 | s0[1] | PIN_AB12 |
| h0[3] | PIN_T4 | m0[1] | PIN_V22 | s0[0] | PIN_AF10 |
| h0[2] | PIN_U2 | m0[0] | PIN_AB23 | s1[6] | PIN_AB24 |
| h0[1] | PIN_U1 | m1[6] | PIN_W24 | s1[5] | PIN_AA23 |
| h0[0] | PIN_U9 | m1[5] | PIN_U22 | s1[4] | PIN_AA24 |
| h1[6] | PIN_R3 | m1[4] | PIN_Y25 | s1[3] | PIN_Y22 |
| h1[5] | PIN_R4 | m1[3] | PIN_Y26 | s1[2] | PIN_W21 |
| h1[4] | PIN_R5 | m1[2] | PIN_AA26 | s1[1] | PIN_V21 |
| h1[3] | PIN_T9 | m1[1] | PIN_AA25 | s1[0] | PIN_V20 |
| h1[2] | PIN_P7 | m1[0] | PIN_Y23 | sh1 | PIN_N26 |
| h1[1] | PIN_P6 | pause | PIN_N25 | sm1 | PIN_P25 |
| h1[0] | PIN_T2 | s0[6] | PIN_V13 | ss1 | PIN_AE14 |
| m0[6] | PIN_Y24 | s0[5] | PIN_V14 |