数字日历设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XXXXX学院
《EDA技术与应用》实训报告
数字日历设计
学号 XX
姓名 XX
指导教师:xx
题目:数字日历电路的设计
1概述
通过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 系统软件设计分析
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] qn;
reg [7:0] qy,qr;
reg clkn,clky;
reg [7:0] date;
reg 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;
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) c lky = 1;
else clky = 0;end
end
always @(posedge clky^jy or negedge clrn) //月计时模块begin
if (~clrn) qy=1;
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) clkn = 1;
else clkn = 0;end
end
always
begin
case (qy)
'h01: date='h31;
'h02: b egin
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