基于VerilogHDL的万年历.docx
《基于VerilogHDL的万年历.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL的万年历.docx(12页珍藏版)》请在冰豆网上搜索。
基于VerilogHDL的万年历
基于VerilogHDL的万年历
设计与总结报告
题目名称:
基于VerilogHDL的万年历研究设计
报告人:
________新_______________
院系/年级/专业:
_____________
指导教师:
_____________
制作日期:
____
基于VerilogHDL的万年历
摘要
基于VerilogHDL的万年历设计,主要完成的任务是使用Verilog语言,在Quartus2上完成电路设计,程序开发模拟,基于功能是能够显示/修改年月日时分秒。
电路设计模块:
分频、控制、时间显示调整、时分秒、年月日、显示控制、译码器。
各个模块完成不同的任务,合在一起就构成了万年历电路设计。
软件模拟直接在Quartus2上进行。
随着科学技术的发展,时间观念越来越重,但是老式的钟表以与日历等时间显示工具已不合时宜。
对此,数字钟表的设计有了用武之地。
基于Verilog的万年历设计,采用软件开发模拟,开发成本低,而且在功能设计上有了很大的灵活度。
同时,该设计的精度远远超过钟表,并且不需要维修。
综上所述,本设计具有设计方便、功能多样、电路简洁、成本低廉等优点。
符合社会发展趋势,前景广阔。
关键词:
万年历,VerilogHDL,Quartus2
摘要……………………………………………………………………..1
Abstract………………………………………………………………….2
第一章万年历发展介绍与VerilogHDL简介....................................3
1.1万年历的发展………………………………………………………………..3
1.2VerilogHDL简介……………………………………………………4
第二章设计原理……………………………………………………..5
2.1组成模块…………………………………………………………..6
2.2系统设计图………………………………………………………..7
第三章各功能模块介绍……………………………………………8
第四章模拟仿真……………………………………………………11
4.1年月日仿真………………………………………………………12
4.2时分秒仿真………………………………………………………13
总结结论………………………………………………………………14
参考文献………………………………………………………………15
第一章万年历的发展介绍与VerilogHDL简介
1.1万年历的发展
钟表、日历等的数字化大大方便了我们的日常生活,同时大大扩展了其功能,而这些功能的实现,均以钟表的数字化为基础的。
因此,研究数字化钟表以与扩大其应用,有现实意义。
此次设计与制作数字万年历就是为了了解数字钟的原理,从而学会制作。
通过它也可以进一步学习掌握各种逻辑电路与时序电路的原理与使用方法。
1.2VerilogHDL简介
VerilogHDL是一种硬件描述语言(HDL:
HardwareDiscriptionLanguage),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
VerilogHDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。
前者由GatewayDesignAutomation公司(该公司于1989年被Cadence公司收购)开发。
两种HDL均为IEEE标准。
2.1组成模块
根据一般EDA实验设备的输入/输出接口的容限,本设计采用8只七段数码管分时完成时、分、秒或年、月、日的显示。
设计电路的计时器模块用于完成一天中的24小时计时;年月日模块接受计时器模块送来的“天”脉冲进行计数,得到日、月、年的显示结果;控制模块产生控制信号k,控制数码显示器显示年、月、日,还有显示时、分、秒,或是自动轮流显示;校时选择模块在k信号的控制下,选择将j1、j2和j3这3个校时按钮产生的信号是送到计时器模块的校秒、校分和校时的输入端,还是送到年月日模块的校天、校月和校年输入端;显示选择模块在k信号的控制下,选择是将计时器模块的时、分、秒状态信号,还是将年月日模块的年、月、日信号送到数码显示器显示。
2.2系统设计图
系统流程图
功能设计图
第三章各功能模块介绍
1.年月日模块设计
基于VerilongHDL的年月日模块设计的源程序nyr2009.v如下:
modulenyr2009(clrn,clk,qn,qy,qr);
inputclrn,clk;
output[15:
0]qn;
output[7:
0]qy,qr;
reg[15:
0]qn;
reg[7:
0]qy,qr;
regclkn,clky;
reg[7:
0]date;
regclkn1,clkn2,clkn3;
//初始化年脉冲
//initialbeginclkn1=1;clkn2=1;clkn3=1;end
//初始化年.月.日时间
//initialbeginqn=`h2000;qy=1;qr=1;end
//日计数模块
always(posedgeclkornegedgeclrn)
begin
if(~clrn)qr=1;
else
begin
if(qr==date)qr=1;
elseqr=qr+1;
if(qr[3:
0]==`ha)
begin
qr[3:
0]=0;qr[7:
4]=qr[7:
4]+1;
end
if(qr==date)clky=1;
elseclky=0;
end
end
//月计算模块
always(posedgeclkyornegedgeclrn)
begin
if(~clrn)qy=1;
elsebegin
if(qy==’h12)qy=1;
elseqy=qy+1;
if(qy[3:
0]==’ha)begin
qy[3:
0]=0;qy[7:
4]=qy[7:
4]+1;end
if(qy==’h12)clkn=1;
elseclkn=1;end
end
//产生每月的天数
always
begin
case(qy)
’h01:
date=’h31;
’h01:
begin
if((qn/4==0)&(qn/100!
==0)|(qn/400==0))date=’h29;//整百的年份被400整除的,是闰年,其他如果不是整百的年份,直接被4整除的是闰年。
elsedate=’h28;end
’h03:
date=’h31;
’h04:
date=’h30;
’h05:
date=’h31;
’h06:
date=’h30;
’h07:
date=’h31;
’h08:
date=’h31;
’h09:
date=’h30;
’h10:
date=’h31;
’h011:
date=’h30;
’h12:
date=’h31;
default:
date=’h30;
endcase
end
//年计数模块
always(posedgeclknornegedgeclrn)
begin
if(~clrn)qn[3:
0]=0;
elsebeginif(qn[3:
0]==9)qn[3:
0]=0;
elseqn[3:
0]=qn[3:
0]+1;
if(qn[3:
0]==9)clkn1=0;
elseclkn1=1;end
end
always(posedgeclkn1ornegedgeclrn)
begin
if(~clrn)qn[7:
4]=0;
elsebeginif(qn[7:
4]==9)qn[7:
4]=0;
elseqn[7:
4]=qn[7:
4]+1;
if(qn[7:
4]==9)clkn2=0;
elseclkn2=1;end
end
always(posedgeclkn2ornegedgeclrn)
begin
if(~clrn)qn[11:
8]=0;
elsebeginif(qn[11:
8]==9)qn[11:
8]=0;
elseqn[11:
8]=qn[11:
8]+1;
if(qn[7:
4]==9)clkn3=0;
elseclkn3=1;end
end
always(posedgeclkn3ornegedgeclrn)
begin
if(~clrn)qn[15:
12]=2;
elseif(qn[15:
12]==9)qn[15:
12]=0;
elseqn[15:
12]=qn[15:
12]+1;
end
endmodule
其中clrn是异步清除端,低电平有效;clk是时钟输入端,上升沿有效;qn[15..0]、qy[7..0]和qr[7..0]分别是年、月和日的状态输出端。
2.控制模块的设计
基于VerilongHDL的控制模块(contr)设计的源程序contr.v如下:
modulecontr(clk,k1,k2,k);
inputclk,k1,k2;
outputk;
regk;
reg[3:
0]qc;
regrc;
always(posedgeclk)
beginqc=qc+1;
if(qc<8)rc=0;
elserc=1;
case({k1,k2})
0:
k=rc;
1:
k=0;
2:
k=1;
3:
k=rc;
endcase
end
endmodule
在控制模块中,使用了一个16分频电路,输出rc是周期为16秒得方波,即8秒高电平、8秒低电平,用于万年历的自动倒换的显示模式。
其中,clk是1秒时钟的输入端;k1和k2是控制输入端,当k1k2=00或11时自动显示模式,控制数码显示器用8秒钟时间显示年、月、日,另外8秒钟时间显示时、分、秒;当k1k2=01时,仅控制显示时、分、秒;当k1k2=10时,仅显示年、月、日;k是控制输入端。
3.校时选择模块的设计
基于VerilongHDL的校时选择模块设计的源程序mux_4.v如下:
modulemux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3);
inputk,j1,j2,j3;
outputjm,jf,js,jr,jy,jn;
regjm,jf,js,jr,jy,jn;
always(korj1orj2orj3)
begin
if(k==0){jm,jf,js}={j1,j2,j3};
else{jr,jy,jn}={j1,j2,j3};
end
endmodule
k是控制输入端,当k=0时,控制将校时按钮j1,j2和j3的信号分别送到计时器模块的jm,jf,js;当k=1时,将校时按钮j1,j2和j3的信号分别送到年月日模块的,jr,jy,jn。
4.显示选择模块的设计
基于VerilongHDL的显示选择模块设计源程序mux_16.v如下:
modulemux_16(k,qm,qf,qs,qr,qy,qn,q);
inputk;
input[7:
0]qm,qf,qs,qr,qy;
input[15:
0]qn;
output[31:
0]q;
reg[31:
0]q;
always
begin
if(k==0)begin
q[31:
24]=0;
q[23:
0]={qs,qf,qm};end
elseq={qn,qy,qr};
end
endmodule
其中,k是控制输入端,当k=0时,控制将计时器模块送来的qm[7:
0]、qf[7:
0]和qs[7:
0]状态信号送到数码显示器显示;当k=1时,将年月日模块送来的qr[7:
0]、qy[7:
0]和qn[15:
0]状态信号送到数码显示器显示。
第四章模拟仿真
4.1年月日仿真
4.2时分秒仿真
总结结论
通过此次设计研究,最终完成了万年历的设计与制作。
在设计过程中,我从各个模块的思路设计到实际程序编写,从点到面。
在出现与处理问题的过程中,不断提升自己处理细节问题的能力,最终达到了预期的效果。
而更重要的是通过系统设计这项项目,使我对于设计整体流程有了更加明晰的感受,对于今后的深入学习与应用奠定了基础。
在今后的学习中,我将继续加强EDA理论知识和Verilog语言的熟练掌握,争取更大的突破。
最后,感老师这学期的辛勤授课,您的敬业精神值得很多老师和学生学习,通过一学期的课程学习也是我进步很多。
您唐老师!