数字日历设计_数字电子日历设计
数字日历设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数字电子日历设计”。
XXXXX学院
《EDA技术与应用》实训报告
数字日历设计
学 号 XX
姓 名 XX
指导教师: xx
题目:数字日历电路的设计概述
通过EDA项目设计,使用Quartus软件进行数字日历电路的设计,能够实现最基本的日期,时间显示功能,并在此基础上进行相应的功能创新,使设计项目拥有更丰富的功能。1.1设计要求 1.1.1设计任务
用EDA的方法设计一个数字日历 1.1.2性能指标
① 用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。② 数字日历能够显示年、月、日、时、分和秒。
③ 用EDA实训仪上的8只八段数码管分两屏分别显示年、月、日和时、分、秒,即在一定时间段内显示年、月、日(如20080101),然后在另一时间段内显示时、分、秒(如00123625),两个时间段能自动倒换。
④ 数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、分、秒时则用此按钮校时,依此类推。1.2总体设计基本原理及框图 1.2.1基本原理
首先设计要实现年月日和时分秒的显示,再设计定时和整点报时模块,以及校准模块。此外,还要使其具备星期显示功能,则要设计星期模块。最后,就是将这些底层模块连接起来实现整体功能。那么,就需要控制模块,校准模块,显示控制模块等等。1.2.2总体框图系统软件设计分析
2.1时分秒计时器模块:
分秒模块程序:
module cnt60(clk,clrn,j,q,cout);input clk,clrn,j;output reg[7:0] q;output reg cout;always @(posedge clk^j or negedge clrn)begin if(~clrn)q=0;else begin if(q=='h59)q=0;else q=q+1;if(q[3:0]=='ha)begin q[3:0]=0;q[7:4]=q[7:4]+1;end if(q=='h59)cout=1;else cout=0;end end endmodule
小时模块程序:
module cnt24(clk,clrn,j,q,cout);input clk,clrn,j;output reg [7:0] q;output reg cout;always@(posedge clk^j or negedge clrn)begin if(~clrn)q=0;else begin if(q=='h23)q=0;else q=q+1;if(q[3:0]=='ha)begin q[3:0]=0;q[7:4]=q[7:4]+1;end if(q=='h23)cout=1;else cout=0;end end endmodule 2.2年月日模块
module nyr2016(clrn,clk,jn,jy,jr,qn,qy,qr);
input clrn,clk,jn,jy,jr;
output [15:0] qn;
//年月日模块
output [7:0] qy,qr;
reg [15:0]
reg [7:0]
reg
reg [7:0]
reg
qn;qy,qr;clkn,clky;date;clkn1,clkn2,clkn3;initial begin clkn1=1;clkn2=1;clkn3=1;end initial begin qn='h2000;qy=1;qr=1;end
always @(posedge(clk^jr)or negedge clrn)
// 日计时模块
begin
if(~clrn)qr=1;
end else begin
if(qr==date)qr=1;
else qr=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;else clky = 0;end always @(posedge clky^jy or negedge clrn)
//月计时模块
begin
if(~clrn)qy=1;
end else begin
if(qy=='h12)qy=1;
else qy=qy+1;
if(qy[3:0]=='ha)begin
qy[3:0]=0;qy[7:4]=qy[7:4]+1;end if(qy=='h12)else clkn = 0;end
clkn = 1;always
begin case(qy)'h01: date='h31;
'h02: begin
if((qn%4==0)&(qn%100!= 0)|(qn%400==0))date='h29;else date='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)or negedge clrn)begin
if(~clrn)qn[3:0]=0;
else begin if(qn[3:0]==9)qn[3:0]=0;
else qn[3:0]=qn[3:0]+1;
if(qn[3:0]==9)clkn1=0;
else clkn1=1;end
end always @(posedge clkn1 or negedge clrn)begin
if(~clrn)qn[7:4]=0;
else begin if(qn[7:4]==9)qn[7:4]=0;
else qn[7:4]=qn[7:4]+1;
if(qn[7:4]==9)clkn2=0;
else clkn2=1;end
end always @(posedge clkn2 or negedge clrn)begin
//年计时模块
if(~clrn)qn[11:8]=0;
else begin if(qn[11:8]==9)qn[11:8]=0;
else qn[11:8]=qn[11:8]+1;
if(qn[11:8]==9)clkn3=0;
else clkn3=1;end end
always @(posedge clkn3 or negedge clrn)
begin
if(~clrn)qn[15:12]=2;
else if(qn[15:12]==9)qn[15:12]=0;end
else qn[15:12]=qn[15:12]+1;
endmodule 2.3控制模块
module contr(clk,k1,k2,k);input clk,k1,k2;output reg k;reg [3:0] qc;reg
rc;always @(posedge clk)
begin qc=qc+1;
if(qc
else rc=1;
case({k1,k2})
0:k=rc;
1:k=0;
2:k=1;
3:k=rc;
endcase
end endmodule 2.4校准模块
module mux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3);input k,j1,j2,j3;output reg jm,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.5星期模块
module xinqishumaguan(clk,qn,qy,qr,z);input clk;input [15:0] qn;input [7:0] qy,qr;output reg [3:0] z;reg [3:0] y;always
begin
if((qn%4==0)&(qn%100!= 0)|(qn%400==0))begin
case(qy)
'h01:y=0;
//该月对应数
'h02:y=3;
'h03:y=4;
'h04:y=0;
'h05:y=2;
'h06:y=5;
'h07:y=0;
'h08:y=3;
'h09:y=6;
'h10:y=1;
'h11:y=4;
'h12:y=6;
endcase;end
else begin
case(qy)
'h01:y=0;
'h02:y=3;
'h03:y=3;
'h04:y=6;
'h05:y=1;
'h06:y=4;
'h07:y=6;
'h08:y=2;
'h09:y=5;
'h10:y=0;
'h11:y=3;
'h12:y=5;
endcase;end
end
always
if((qn%4==0)&(qn%100!= 0)|(qn%400==0))
z=((qn-1+(qn/4)+(qn/400)-(qn/100))%7-1+qr+y)%7;//闰年计算公式
else
z=((qn+(qn/4)+(qn/400)-(qn/100))%7-1+qr+y)%7;//平年计算公式 endmodule
2.6报时模块
module baoshi(qs,qf,fLED,qm,off);input off;input[7:0] qm, qs,qf;output fLED;reg fLED;always begin if((qs=='h07&&qf=='h01)||(qm==0&&qf==0))
//7:01和整点时彩灯亮起,蜂鸣器响
fLED=1;
else
fLED=0;
if(off==1)fLED=0;
// 在任意时刻都可以关掉彩灯亮,蜂鸣器 end endmodule 2.7数码管显示模块
module mux_xianshi_2(k,qm,qf,qs,qr,qy,qn,q,z);input
k;input [7:0] qm,qf,qs,qr,qy;input [15:0] qn;input [3:0] z;output reg [31:0] q;always
begin
if(k==0)begin
q[31:28]=z;
q[27:24]=0;
q[23:0]={qs,qf,qm};end
else q={qn,qy,qr};
end endmodule
2.8分频模块
module fenping(clk,newclk);input clk;output reg newclk;reg[24:0] cnter;always @(posedge clk)
begin
if(cnter
else cnter=0;
if(cnter
end endmodule 3 系统测试(调试)
3.1 测试仪器与设备
装有quartus软件的计算机,EDA实验箱一台。
3.2 性能指标测试
系统能够完成基础功能即日期时间的计时显示功能,并能实现报时,星期的显示功能。3.2.1软件测试 时分秒仿真:
如仿真所示:可以进行自动时分秒计数,并且在校准时,可以有效的进数。准确的实现时分秒计数功能。
年月日仿真:
仿真出程序可以进行正常的年月日自动计数功能,并且在校准有效时可以进行正确的进数,实现校准功能。
控制模块仿真:
如图所示:当{k1,k2}=0或3时,k会出现前8秒为0,后8秒为1的自动切换;当{k1,k2}=2时,k显示为1;当{k1,k2}=1时,k会显示为0。校准模块仿真:
如图所示:当k=0时,显示时分秒状态,此时可以对时分秒进行校准;当k=1时,显示年月日状态,此时可以对年月日进行校准。
报时模块仿真:
如图:整点0时0分0秒和7时0分0秒时LED会亮起(注:电路设计时是将蜂鸣器和LED并联的,所以是一起工作的,这里只进行一个输出设计),起到整点报时的功能;在设定的闹钟7时1分时,LED工作(设计是进行1Hz的闪烁),起到闹钟功能,给off高电平时,关掉闹钟。
星期模块仿真:
如图为显示年月日后对应的星期,在2015年7月2日输出Z显示星期三;在2016年7月2日输出Z显示星期六。
显示模块仿真:
如图:仿真同时给定年月日和时分秒(包括输入星期)输入,在k=1时只显示年月日;在k=0时只显示星期和时分秒。
整个日历仿真测试:
在k1=0,k2=0和k1=1,k2=1两种状态时显示每隔8秒进行年月日和时分秒的自动切换;在k1=1,k2=0时,只显示年月日,并可以进行有效的校准;在k1=0,k2=1时,只显示年月日,并可以进行有效的校准;当到达整点时蜂鸣器尖端性响起和LED会亮,当到达定时间7时1分时会进行闹铃(蜂鸣器尖端性响起和LED会闪烁);off=1时,会关掉闹铃。
3.2.2硬件测试
软件仿真后,查看试验箱手册进行引脚锁定:
将仿真测试好的程序通过计算机下载到试验箱,进行硬件测试:
3.3 结果分析
经过程序设计,软件测试和硬件测试日历能够完全实现预定设计的功能,因此设计成功完成。波形发生器的设计
设计函数发生器,可以通过两个按钮进行选择输出4个波形(锯齿波、三角波、方波和正弦波)中的一个。4.1 设计原理框图
如下设计原理图,ipm rom0为锯齿波,ipm rom1为正弦波,ipm rom2为三角波,ipm rom3为方波;inst7为四选一选择模块,s1、s2为选择输入端。
4.2 测试与仿真 4.2.1 ModelSim仿真:
如图为四选一波形选择,仿真在同一截面上:s1、s2为00时,显示锯齿波;s1、s2为01时显示三角波;s1、s2为10时,显示为方波;s1、s2为11时,显示为正弦波。
4.2.2 SignalTap仿真:
SignalTap仿真时,需要结合硬件进行仿真,将原理图程序下载到实验箱上,通过锁定好的选择开关s1和s2按键进行波形选择。
s1、s2为00时,显示锯齿波;s1、s2为01时显示三角波;s1、s2为10时,显示为方波;s1、s2为11时,显示为正弦波。实训总结
通过EDA实训,进一步掌握EDA设计方法和经验,特别是仿真测试方面,体验到Quartus软件的电路设计上的强大和方便快捷。对于工程项目设计上有非常大的帮助。
对于波形发生器的设计,在设计中会遇到软件操作不熟悉,仿真文件加载会出问题,在思考四选一波形,和软件仿真给选择输入端S1、S2高低电平时遇到困难,在老师的帮助下以上问题得到解决。
在日历设计,基本日期和时间显示时,在上升沿触发向高位进位时,会遇到进位上的错位,日月初始为1,以及分屏显示时间问题等;在功能创新上,由日期换算到对应的星期时,计算公式较为复杂,而且在考虑到数码管利用上,将显示时分秒时没有利用到的数码管用来显示星期,充分利用资源;在设计整点报时和闹铃的时候为了简化程序和电路将两个功能模块放到一起。
在实训过程中遇到问题、解决问题,学会寻找解决问题的方法和途径,以及在创新上不断追求更好的态度等等,都让我从中获益匪浅。当然还有团队合作是完成设计的关键,使我获得大量的实验经验,产生了浓厚的兴趣。参考文献
[1] 江国强.EDA技术与应用(第4版).电子工业出版社,2013