简易数字钟课程设计报告Word下载.docx
《简易数字钟课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《简易数字钟课程设计报告Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
模式1正常计时模式at=0灯灭
模式2手动较时模式at=1灯亮
按建功能:
change控制数字钟在计时和手动调整两个状态之间转换
t_min分钟手动调整按键
t_hou小时手动调整按键
clock标准1HZ时钟信号
中间变量tun秒到分的进位信号
mod分到时的进位信号
mt分钟的控制信号上升沿触发
nt时钟的控制信号上升沿触发
输出sec1秒个位
sec2秒十位
min1分个位
min2分十位
hou1时个位
hou2时十位
at表示模式的变量0为正常计时模式,1表示手动调整模式
概述:
要求:
1设计一个能显示时、分、秒的简易数字钟。
具有时间调整功能。
2利用GW48-PK2系统上的数码管显示时间。
3调整时间用的按键也使用GW48-PK2系统上的按键。
目的:
本次课程设计的目的是为了掌握FPGA技术的层次化设计方法,掌握ModelSim和QuartusⅡ的使用方法。
步骤:
用verilog语言在记事本编写程序,然后在ModelSim中仿真,查看波形,再用QuartusⅡ仿真,定义针脚,在面板上模拟。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的寿命,因此得到广泛的应用。
设计原理及框图
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路,具有时、分、秒计数显示功能,以24小时为计数循环,由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要加上校时功能。
这次实验主要是要实现时钟的两种基本功能:
计时和较准,时间计数由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器,和控制按键构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器.,然后需要把8位二进制数转变为译码管需要的8421码。
设计方案:
这个实验总体分:
秒、分、时三个模块,计时和较准两个模式
标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲之一。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个时脉冲信号,该信号作为时计数器的时钟脉冲之一,时计数器采用24进制计时器,可实现对一天24小时的计时。
译码显示电路将“时”、“分”、“秒”计数器的输出状态通过译码管显示。
这们时钟的计时功能就实现了,
秒模块是一个以1HZ的clock信号控制的60进制计数器,并同时产生分进位信号tun。
always@(posedgeclock)
begin
if(sec==59)\\当秒等于59时,如果处于计时模式时产生
begin\\一个进位脉冲tun,否则tun信号暂停
sec<
=0;
if(at==0)
tun<
=1;
else
=tun;
end
else\\若秒不等于59,同样如果处于计时模式
begin\\就使tun信号清0,否则tun信号暂停
sec<
=sec+1;
end
end
分模块也是一个60进制计数器,并产生小时的进位信号mod,但要受到两个控制信号的控制一个是进位信号tun,另一个是t_min的按建信号。
当at=0时,赋值mt=tun
当at=1时,赋值mt=(!
tun&
t_min)|(tun&
!
t_min)
always@(posedgemt)
begin
if(min==59)\\当min=59时,如果处于计时模式,
begin\\则产生一进位信号mod,否则mod暂停
min<
mod<
else
mod<
=mod;
end
else\\当分不等于59,同样,
begin\\如果处于计时模式,则mod清0,否则mod暂停
min<
=min+1;
if(at==0)
else
end
时模块和分模块相似,是一个24进制计数器,受mod和t_hou信号控制,同理
当at=0时,nt=mod
当at=1时,nt=(!
mod&
t_hou)|(mod&
t_hou)
always@(posedgent)
if(hou==23)
hou<
=hou+1;
这样就实现了计时模式时控制信号为进位信号,手动模式时控制信号为按键信号计时模式和手动调整模式互不干扰,各司其职,至此已实现时钟的功能已实现,而显示时间的译码管是4位二进制数,须要两个译码管分别显示十位和个位,所以要求出秒、分、时的个位和十位,用以下程序就可实现。
always@(sec)
sec1<
=sec%10;
sec2<
=sec/10;
always@(min)
min1<
=min%10;
min2<
=min/10;
always@(hou)
hou1<
=hou%10;
hou2<
=hou/10;
设计难点:
本次实验的难点在于两个信号控制一个变量,由于在不同的always块中不能对同一个值赋值,所以如何综合进位信号和较准信号是重点。
校时功能的实现
当重新接通电源或走时出现误差时都需要对时间进行校正.通常,校正时间的方法是:
首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可.
首先我想的就是选择信号nt=(at&
mod)|(!
at&
当at=1时,nt取mod信号,即取进位信号
当at=0时,nt取t_hou按键信号,即取较准信号
在实验的时候才发现有个缺陷,就是当分钟为0时,即当mod信号为1的时候,按change键如果使at=0变到at=1,则会使nt信号从0变为1,出现上升沿,使小时加1,这样时钟不仅受到进位信号mod和较准按键t_hou的调节,还受到模式转换按键change键的影响,导致时钟不准确。
这里由于仿真时,难以实现at在min=0时翻转,所以把mod信号为1的时间延长了,
为了解决这个问题,我就把式子改为nt=(at==0)?
(!
mod):
这样当处于手动调整模式时,时钟还在继续计时,这会使较准时间不方便。
为了解决这新出来的问题,我又把tun和mod产生信号的条件加一个if(at==0),就是让tun和mod在手动调整模式时暂停,在正常计时模式时正常产生进位脉冲,这样就解决了上面的调时时还在继续计时的问题。
结果与分析:
测试程序
`include"
clock0.v"
moduletest;
regt_min,t_hou,change;
wire[3:
0]sec1,sec2,min1,min2,hou1,hou2;
regclock;
always#50clock=~clock;
always#20t_min=~t_min;
always#30t_hou=~t_hou;
initial
t_min<
t_hou<
change<
clock<
#10000change<
#300change<
clock0m(.t_min(t_min),.t_hou(t_hou),.clock(clock),.change(change),.sec1(sec1),.sec2(sec2),.min1(min1),.min2(min2),.hou1(hou1),.hou2(hou2),.at(at));
endmodule
正常计时:
秒走时
分走时
时走时
这张图是23:
59:
59时的时候,此时at=0正常计时,此时若秒加1则秒、分、时都清0,实现一天的计时。
当at=1,手动较准模式,按一下t_min键分钟加1,按一下t_hou键小时加1,手动较时成功。
结论与心得:
经过两个星期的设计与思考,最终实现了数字钟的模拟。
期间遇到了许多问题,但最后都一一得到解决。
现将心得体会总结如下:
1,设计初期要考虑周到,否则后期改进很困难。
应该在初期就多思考几个方案,进行比较认证,选择最合适的方案动手设计。
总体设计在整个设计过程中非常重要,应该花较多的时间在上面。
2,方案确定后,才开始设计。
设计时,多使用已学的方法,如列真值表,化简表达式,要整体考虑,不可看一步,做一步。
在整体设计都正确后,再寻求简化的方法。
3,模块之间关系清楚,既利于自己修改,也利于与别人交流,如果程序杂乱无章连自己都看不懂,那还如何改进和扩展。
4,很多难点的突破都来自于与同学的交流,交流使自己获得更多的信息,开拓了思路,因此要重视与别人的交流。
5,应该有较好的理论基础,整个实验都是在理论的指导下完成了,设计过程中使用了许多理论课上学的内容,本次设计把理论应用到了实践中、同时通过设计,也加深了自己对理论知识的理解和掌握。
这次实验虽然实现了要求的功能,但还有很多有待改进的方向:
1,功能扩展:
如万年历等;
2,小时和分钟的较准开关是分开的,这样如果加上年、月、日之后按键就太多了,需改成不同模式下,同一个键分别较准分,时,年,月,日。
附录:
数字钟源代码
moduleclock0(t_min,t_hou,clock,change,sec1,sec2,min1,min2,hou1,hou2,at);
inputt_min,t_hou,clock,change;
outputsec1,sec2,min1,min2,hou1,hou2,at;
wiret_min,t_hou;
reg[5:
0]sec,min,hou;
regtun,mod,at;
reg[3:
0]sec1,sec2,min1,min2,hou1,hou2;
wiremt,nt;
at=0;
tun=0;
mod=0;
min=0;
hou=0;
sec=0;
sec1=0;
sec2=0;
min1=0;
min2=0;
hou1=0;
hou2=0;
always@(posedgechange)\\change控制数字钟在计时和
begin\\手动调整两个状态之间转换
if(at==0)
at<
\\at是表示模式的变量0为正常计
else\\时模式,1表示手动调整模式
always@(posedgeclock)\\clock标准1HZ时钟信号
if(sec==59)
\\秒为60进制计数器
\\如果处于计时模式,每60秒产生
else\\一个分进位信号,否则tun信号暂停
else
assignmt=(at==0)?
tun):
t_min);
\\生成分的控制信号,
\\t_min为分钟手动调整按键
if(min==59)\\分钟为60进制计数器
\\如果处于计时模式,每60分产生一个
else\\时进位信号,否则mod信号暂停
assignnt=(at==0)?
t_hou);
\\生成时的控制信号,
\\t_hou为小时手动调整按键
always@(posedgent)
if(hou==23)\\小时为24进制计数器
\\sec1为秒个位
\\sec2为秒十位
\\min1为分个位
\\min2为分十位
\\hou1为时个位
\\hou2为时十位