桂林电子科技大学信息科技学院《EDA技术与应用》实训报告学号姓名指导教师:2012 年 6 月22 日题目:数字日历电路的设计1.系统设计1.1设计要求1.1.1设计任务用EDA的方法设计一个数字日历1.1.2性能指标①用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。
②数字日历能够显示年、月、日、时、分、秒。
③数字日历有复位的功能,有校年、月、日和校时、分、秒的功能,通过一个开关来转换时校年、月、日还是校时、分、秒。
④此数字日历具有闹钟的功能,在6:01将开启闹钟,用一个LED灯表示,可以在任意时刻关闭闹钟。
1.2设计思路及框图1.2.1设计思路日历主要由年月日模块和时分秒模块组成,由分频器提供脉冲,再加上一个控制模块实现控制选择校准时分秒还是校准年月日。
也可以实现时分秒和年月日的八秒自由转换。
再加上一个闹钟,在6:01的时候闹钟开启,并由一个开关控制,在任意时间都可以关掉闹钟。
1.2.2总体设计框图2各模块程序设计2.1时分秒计时器模块:module cnt60(clrn,clk,q,j,cont); //秒和分计时input clrn,clk,j;output reg [7:0] q;output reg cont;always @(posedge clk^j or negedge clrn)beginif(~clrn) q=0;else beginif(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) cont=1;else cont=0;endendendmodulemodule cnt24(clrn,clk,q,j,cont); //小时计时input clrn,clk,j;output reg [7:0] q;output reg cont;always @(posedge clk^j or negedge clrn)beginif(~clrn) q=0;else beginif(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;endif(q=='h23) cont=1;else cont=0;endendendmodule2.2年月日模块module nyr2009(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;endinitial begin qn='h2000;qy=1;qr=1;endalways @(posedge (clk^jr) or negedge clrn) // 日计时模块beginif (~clrn) qr=1;else beginif (qr==date) qr=1;else qr=qr+1;if (qr[3:0]=='ha) beginqr[3:0]=0; qr[7:4]=qr[7:4]+1;endif (qr==date) c lky = 1;else clky = 0;endendalways @(posedge clky^jy or negedge clrn) //月计时模块beginif (~clrn) qy=1;else beginif (qy=='h12) qy=1;else qy=qy+1;if (qy[3:0]=='ha) beginqy[3:0]=0;qy[7:4]=qy[7:4]+1;endif (qy=='h12) clkn = 1;else clkn = 0;endendalwaysbegincase (qy)'h01: date='h31;'h02: b eginif ((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;endcaseendalways @(posedge (clkn^jn) or negedge clrn ) //年计时模块beginif (~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;endendalways @(posedge clkn1 or negedge clrn )beginif (~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;endendalways @(posedge clkn2 or negedge clrn )beginif (~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;endendalways @(posedge clkn3 or negedge clrn )beginif (~clrn) qn[15:12]=2;else if(qn[15:12]==9) qn[15:12]=0;else qn[15:12]=qn[15:12]+1;endendmodule2.3校时模块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;alwaysbeginif (k==0) {jm,jf,js}={j1,j2,j3};else {jr,jy,jn}={j1,j2,j3};endendmodule2.4分频器模块同时给时分秒和闹钟送入脉冲module FENP(clk,newclk);input clk;output reg newclk;reg[24:0] cnter;always @(posedge clk)beginif(cnter<20000000) cnter=cnter+1;else cnter=0;if (cnter<10000000) newclk=1;elsenewclk=0;endendmodule2.5控制器模块显示年月日和显示时分秒直接的转换控制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<8) rc=0;else rc=1;case ({k1,k2})0:k=rc; //八秒显示年月日八秒显示时分秒的自由转换1:k=0; //显示并且校准时分秒2:k=1; //显示并且校准年月日3:k=rc;endcaseendendmodule2.6闹钟模块module naozhong(qs,qf,led,zt);input zt;input[7:0] qs,qf;output led;reg led;alwaysbeginif (qs=='h06&&qf=='h01) //6:01闹钟开始闪烁led=1;elseled=0;if(zt==1) led=0; // 在任意时刻都可以关掉闹钟endendmodule2.7数码管显示模块module mux_16(k,qm,qf,qs,qr,qy,qn,q);input k;input[7:0] qm,qf,qs,qr,qy;input[15:0] qn;output reg [31:0] q;alwaysbeginif (k==0) beginq[31:24]=0;q[23:0]={qs,qf,qm};endelse q={qn,qy,qr};endendmodule3.调试过程在调试过程中出现很多问题,在时分秒里加入分频器可以实现计时,但是闹钟就不能实现1秒钟闪烁一次的功能,当给闹钟加上一个分频器的时候,时分秒模块也不能自动计时。
首先认识到必须只能有一个分频器,而且还能同时给两个提供脉冲。
所以就删除了时分秒里的分频器,在总的图中加入一个分频器,同时给两个提供脉冲,这样两个功能都可以同时实现。
4.功能测试4.1 测试仪器与设备电脑,EDA实训仪。
4.2 性能指标测试S0、S1控制手动切换和自动切换,当S0、S1都往上拨或都往下拨都是自动切换,SO 上拨S1下拨是显示并可以校准时分秒的,反之是显示和校准年月日的。
K8、K7、K6分别是校准年月日或时分秒的。
K0是复位功能5 实训心得体会通过这次EDA实训,把课堂上学习的知识又巩固了一遍,也更加熟悉了对quartusII 软件的使用。
这次我们小组选作数字日历这个题目,创新点在于闹钟模块,可以实现闹钟的功能。
通过小组的分工合作,把大家的思路整合在一起,在一起分析程序的使用,互相学习,更加理解了程序的用法。
EDA的功能很强大,去除了传统算法的复杂,是程序简单化,几个语句就可以实现想要的功能。
在我们所做的日历中,分别用到计数,分频,选择器这些最基本的功能,然后加以改善和创新,实现了日历的功能。