数字日历电路设计EDA实训.docx
《数字日历电路设计EDA实训.docx》由会员分享,可在线阅读,更多相关《数字日历电路设计EDA实训.docx(16页珍藏版)》请在冰点文库上搜索。
数字日历电路设计EDA实训
成绩
批阅教师
日期
桂林电子科技大学
实训报告
2016-2017学年第1学期
学院海洋信息工程学院
课程EDA综合实训
姓名钟朝林
学号1416030218
指导老师覃琴
日期2016/12/29
实训题目:
数字日历电路的设计
1概述
1.1设计要求
1.1.1设计任务
设计并制作一台数字日历。
1.1.2性能指标要求
①用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。
②数字日历能够显示年、月、日、时、分和秒。
③用EDA实训仪上的8只八段数码管分两屏分别显示年、月、日和时、分、秒,即在一定时间段内显示年、月、日(如20080101),然后在另一时间段内显示时、分、秒(如00123625),两个时间段能自动倒换。
④数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、分、秒时则用此按钮校时,依此类推。
1.2总体设计基本原理及框图
1.2.1基本原理
日历主要由年月日模块、时分秒模块、控制模块、显示模块、校时模块组成。
采用3个公用按钮j1、j2、和j3完成时分秒或年月日的校时,用8只七段数码管分时完成时分秒或年月日的显示。
设计电路的计时器模块(jsq24)用于完成一天的24小时计时;年月日模块接收计时器模块送来的“天”脉冲进行计数,得到日月年的显示结果,控制模块产生控制信号k,控制数码显示器显示年月日,还是时分秒,或者自动轮流显示;校时选择模块在k信号的控制下,选择将j1、j2和j3这3个校时按钮产生的信号是送到计时器模块的校秒、校分和校时输入端,还是送到年月日模块的校天、校月、校年输入端;显示选择模块在k信号的控制下,选择是将计时器模块的时、分、秒状态信号,还是将年月日模块的年、月、日状态信号送到数码管显示器显示。
1.2.2总体框图
2系统软件设计分析
2.1年月日模块
moduler(clrn,clk,jn,jy,jr,qn,qy,qr);//年月日模块
inputclrn,clk,jn,jy,jr;
outputreg[15:
0]qn;
reg[15:
0]qn1;
outputreg[7:
0]qy,qr;
regclkn,clky;
reg[7:
0]date;
regclkn1,clkn2,clkn3;
initialbeginclkn1=1;clkn2=1;clkn3=1;end
initialbeginqn='h2011;qn1=2011;qy=1;qr=1;end
always@(posedge(clk^jr)ornegedgeclrn)//日计时模块
begin
if(~clrn)qr=1;
elsebegin
if(qr==date)beginqr=1;clky=1;end
elsebeginqr=qr+1;clky=0;end
if(qr[3:
0]=='ha)begin
qr[3:
0]=0;qr[7:
4]=qr[7:
4]+1;end
end
end
always@(posedge(clky^jy)ornegedgeclrn)//月计时模块
begin
if(~clrn)qy=1;
elsebegin
if(qy=='h12)beginqy=1;clkn=1;end
elsebeginqy=qy+1;clkn=0;end
if(qy[3:
0]=='ha)begin
qy[3:
0]=0;qy[7:
4]=qy[7:
4]+1;end
end
end
always
begin
case(qy)
'h01:
date='h31;
'h02:
begin
if((qn1%4==0)&(qn1%100!
=0)|(qn1%400==0))date='h29;
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;
'h11:
date='h30;
'h12:
date='h31;
default:
date='h30;
endcase
end
always@(posedge(clkn^jn)ornegedgeclrn)//年计时模块
begin
if(~clrn)beginqn[3:
0]=1;qn1=2011;end
elsebeginif(qn[3:
0]==9)qn[3:
0]=0;
elsebeginqn[3:
0]=qn[3:
0]+1;qn1=qn1+1;end
if(qn[3:
0]==9)clkn1=0;
elseclkn1=1;end
end
always@(posedgeclkn1ornegedgeclrn)
begin
if(~clrn)qn[7:
4]=1;
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[7:
4]+1;
if(qn[11:
8]==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
2.2时分秒模块
modulecnt60(clk,clrn,j,q,cout);//分和秒计时
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h59)beginq=0;cout=1;end
elsebeginq=q+1;cout=0;end
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
end
end
endmodule
modulecnt24(clk,clrn,j,q,cout);//小时计时
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h23)beginq=0;cout=1;end
elsebeginq=q+1;cout=0;end
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
end
end
endmodule
2.3控制模块
modulecontr(clk,k1,k2,k);
inputclk,k1,k2;
outputregk;
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
2.4显示模块
modulemux_16(k,qm,qf,qs,qr,qy,qn,q);
inputk;
input[7:
0]qm,qf,qs,qr,qy;
input[15:
0]qn;
outputreg[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
2.5校时模块
modulemux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3);
inputk,j1,j2,j3;
outputregjm,jf,js,jr,jy,jn;
always
begin
if(k==0){jm,jf,js}={j1,j2,j3};
else{jr,jy,jn}={j1,j2,j3};
end
endmodule
2.6闹钟模块
modulenaozhong(qs,qf,led,zt);
inputzt;
input[7:
0]qs,qf;
outputled;
regled;
always
begin
if(qs=='h06&&qf=='h01)//6:
01闹钟开始闪烁
led=1;
else
led=0;
if(zt==1)led=0;//在任意时刻都可以关掉闹钟
end
endmodule
2.7分频器模块
moduleFENP(clk,newclk);
inputclk;
outputregnewclk;
reg[24:
0]cnter;
always@(posedgeclk)
begin
if(cnter<20000000)cnter=cnter+1;
elsecnter=0;
if(cnter<10000000)newclk=1;
else
newclk=0;
end
endmodule
3系统测试(调试)
3.1测试仪器与设备
计算机,EDA实训仪。
3.2性能指标测试
k1、k2控制分屏显示,当k1k2为00或11时是自动显示,控制数码显示用8秒时间显示年、月、日,另外8秒时间显示时、分、秒;当k1k2为01时,仅显示时、分、秒,同时j1、j2和j3校秒、校分和校时,当k1k2为10时,仅显示年、月、日,同时j1、j2和j3校年、月、日。
clkn清零功能。
3.3结果分析
各个功能的实现分开设计。
对于时分秒,则采用24进制和60进制,对于年月日的设计复杂点。
特别是日,因为每个月的日子都不一样。
闰年的更加特殊,测试的时候经常出现2月有30天,后来发现是程序出的问题,反复修改,最后总算行了。
4波形发生器的设计
4.1设计原理框图
4.2测试与仿真
5实训总结
通过这次EDA综合实训,我把课堂上学习的知识又巩固了一遍,也更加熟悉了对quartusII这款软件的使用,本次实训我们小组选择了数字日历电路设计这个题目,实验过程中出现了很多问题,比如不显示数字;小时到日期无法进位;闰年2月日期不对等等问题,这主要是我们对程序的不熟悉还有课堂的知识学得不够造成的,也明白了书本上的程序不一定是对的,错误真的一大堆,后来在同学的帮助下,明白了错误所在。
我们实验的创新点在于闹钟模块,可以实现闹钟的功能。
这次实验通过小组之间的分工合作,把大家的思路整合在一起,大家一起讨论问题所在,对程序的认识更深了。
EDA的功能真的很强大,去除了传统算法的复杂,而且程序简单化,几个语句就可以实现想要的功能。
在我们所做的日历中,分别用到计数,分频,选择器这些最基本的功能,然后加以改善和创新,实现了日历的功能。
这次实验,我收获了很多,懂得了团队合作一起做实验一起讨论问题,也发现了自己的不足,感觉自己所学的知识总算是有用处了。
感谢我的队友还有帮助我的同学和指导老师!
!
6参考文献
江国强.EDA技术与应用(第四版).北京:
电子工业出版社,2013
学号
姓名
工作量(%)
1416030216
田如然
34
1416030217
甘华日
33
1416030218
钟朝林
33
附录
波形仿真图
年月日模块仿真
时分秒模块仿真
结果截图