《EDA技术与应用》实训报告指导教师:实训题目:数字日历1. 系统设计1.1 设计要求1.1.1 设计任务:设计一个数字日历电路1.1.2 技术要求:⑴用Verilog HDL 语言设计一个数字日历。
⑵数字日历能正确显示年、月、日、时、分和秒。
⑶通过开关分别控制对年、月、日或时、分、秒校对及自动切换、,并且运用按钮对年、月、日或时、分、秒校对。
⑷通过按钮对数码管全部清零。
⑸拓展功能:添加时钟闹钟功能,并通过LED管显示。
1.2 方案比较:由于这次实验用到的仪器是EDA实训仪,数码管个数只有八个,因此不能同时显示年、月、日、时、分、秒。
但是实训仪的LED管只有12个,因此在拓展功能时12 小时做一个周期的整点记时显示。
在多次的测试和修改后,得到此最好方案。
1.3 方案论证1.3.1 总体思路:通过EDA S程的学习,可知运用Verilog HDL语言设计一个数字日历括计时器模块(jsq60、j sq24 )、年月日模块(nyr2009)、控制模块(conr)、校时选择模块(mux_4、显示选择模块(mux_16和闹钟定时模块(LED1)、闹钟灯模块(nzd);然后将各个模块连接起来画成原理图再下载到实训仪上,调节开关及按钮来实现数字日历的功能。
1.3.2 设计方案:总原理图如下:2 •各个模块程序的设计(1)设计一个分频器进行20MHz分频得到实训所需的1Hz的频率分析:这是个20MHZ寸钟的分频器,将原来EDA实训仪提供的频率为20MHZ的时钟转换成频率1HZ的时钟,然后输出到有需要的端口,触发模块起作用。
⑵分别设计一个能显示年月日和时分秒的程序校准年月日和秒分时的原理图如下:分析:①当k=0时,开关j1,j2,j3校秒时分然后将信号分别送到jsq24模块的jm(校秒)、jf (校分)、js (校时)。
②当k=1时,开关j1,j2,j3校年月日然后将信号分别送到nyr2009模块的jr(校日)、jy(校月)、jn (校年)。
计算年月日的模块如下:FIHI Ilkm■!:!下町nrTUT TFT)H'j 31 ,mzitc'FIH iOSH<匚;rm c计七匚―H •-i-im LTJrn ?■ FIMCl |r-NLCs'M'l tFl处i/lFIW反jiBiietiiiam liar mill i wi i lirir-iiniiiirniliii rvii ii A■:15lrnq<15.Q| iwT ••町■ 1 ■F ' ■*-CIKJ ■ !jy-F 1 ■分析:clrn 是异步清除输入端,低电平有效; elk 是时钟输入端,上升沿有效;和jr 分别是校年、校月、校日输入端; qn[15..0]、qy[7..O]、qr[7..O]分别是年、月、输出端。
显示时分秒与年月历的模块如下:qPi 0]■—叩卩』]■a - qs|7..n]■—>qr[7.D]qn[15.J] 分析:①当k=0时,把jsq24送来的时分秒的状态信号送到数码管显示 ②当k=1时,把nyr2009送来的年月日的状态信号送到数码管显示。
计算时分秒的模块如下:dr qn[7. 0]elk QUO)jrm q47. 0] jf cout i 3clkcoutjn 、jy日的分析:elr 是异步清除输入端,低电平有效;js 分别是校秒、校分、校时输入端; 日的输出端;cout 是进位;elkeout 时钟闹钟模块如下:elk 是时钟输入端,上升沿有效;jm qm[7..0]、qf[7..0]、qs[7..0]分别是年、是由elk 控制的秒秒脉冲。
jf 和月、inst4数码管显示整点,LED灯亮相应灯。
当时间与闹钟所设时间相同LED管亮(3)设计三个转换器和一个自动切换器计时器24的模块如下:这个模块是产生计数秒时分的;其中clkcout是由elk脉冲经过16分频器gen产生秒脉冲;cout是经过计时器后产生的24时脉冲;自动转换器模块如下:自动切换主要是为了实现8秒就切换成秒分时或是年月日的,还有控制秒分时的校准和年月曰的校准。
(4)闹钟灯控制模块(nzd)如下:k是闹钟信号输入端;按键X,控制闹钟灯的熄灭;elk是时钟脉冲。
3. 制作与调试过程在这次的实训中我选择了EDA课程中讲解过的万年历的设计,在其基础上添加了整点报时的一个拓展功能,通过运用Verilog HDL语言对程序进行设计,然后运用Quartusll9.0 软件对各程序进行编译,看是否能通过,如有错误可以逐条对语句进行调试,当所有模块编译成功后就下载到EDA 工具实验箱进行验证。
4. 结论运用Verilog HDL语言在QuartusII9.0 软件上设计了一个数字日历,并通过实训仪正确地显示出来且实现各种功能。
5. 实训心得体会通过这两周的EDA实训,不仅更熟练的运用Verilog HDL 语言在QuartusII9.0软件上的设计方法与步骤,还在参考资料后添加了一个拓展功能完成了数字日历电路的设计。
在实训过程中,设计时钟闹钟模块时,想让闹钟灯亮的久点,结果闹钟灯一直亮,不会灭了,同时,闹钟灯功能也不能用了,最后在覃琴老师的提点下,我用一个按键来控制闹钟灯的熄灭,回去和同学讨论,把添加了nzd模块程序,不仅把灯的问题给解决了,时钟闹钟功能也能进行显示。
从一开始接受课程任务,和同学一起着手建立设计框图,再到网上查阅相关资料,确定电路图到最终制作成型,每一步都必须真诚付出。
刚开始我是做的并不成功,不能实现闹钟功能。
在多次检修之后,最终实现了课程设计作业的全部功能。
将各个部分组成起来设计成为万年历定时闹钟功能。
通过这次EDA实训我对数字逻辑电路也更加地了解,有了更直观的了解。
特别感谢指导老师覃琴老师的悉心指点!6. 参考文献(1)江国强,EDA技术与应用.北京:电子工业出版社.20107、附录:7.1仿真波形图(部分模块)7.11.C nt60模块仿真波形图I7.12.C ontr模块仿真波形图7.14.LED1模块波形仿真图:7.15.n yr2009模块仿真波形图7.2程序清单一、拓展部分:LED1模块程序:module mux6(m,f,s, nm, nf,n s,q,q2); input[7:0] nm,nf,ns,m,f,s; output reg [31:0] q2; output reg q; always beginif((m==nm)&&(f==nf)&&(s==n s)) begin q=1; q2[31:24]=0; q2[23:0]={ ns, nf,nm}; end else begi n q=0;q2[31:24]=0;q2[23:0]={ ns, nf,n m};; endj3 jm汗jy4 0it o克o 汛xH ¥X XM 0即0[^0谆18 参2T£ m z q u=q[+j a outrJOOCOMO X 00000100 \ 00000000) (00000100XooooooooX Qc ioo^booooo i^ooooo io^ooooai ix )ooboi (jo^boooiWiB mi 0171,1—16. ^1G nsdi clra」rJF j”Q vH H H Hi HiH 2tKC K(^mr_RjmmmnnnjmrmnnnrmrLrLm^1[ IIIjLrLrLrLrLrLrLrLruinjirLrLrLnrLrLrLruinrLrirLnrLrLrLrLrL rLrLnrLrLrLrLrLrLn2〔D]-Q F□Q0?am30C :OOOOMJOOOOO OODOOOOOOHJ Cend endmodule 拓展部分数码管现实模块:module mux2(k,q2,q,q1); inputk;input[31:0] q2; input[31:0] q;output reg [31:0] q1; alwaysbegin if(k==1)q1=q2; elseq1=q;endendmodule 二、基本部分:1、contr 模块程序modulecontr(clk,k1,k2,k); input clk,k1,k2;output reg k; reg [3:0] qc; reg rc;always @(posedge clk) beginqc=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; endcase end endmodule2、mux_4 模块程序modulemux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3); inputk,j1,j2,j3; output reg jm,jf,js,jr,jy,jn; alwaysbegin if (k==0) {jm,jf,js}={j1,j2,j3}; else{jr,jy,jn}={j1,j2,j3}; end endmodule3、gen 模块程序module gen(clk,cout);input clk; reg[24:0] q;output reg cout;always @(posedge clk)beginif(q<20000000-1) q=q+1;else q=0;if(q==20000000-1) cout=1;else cout=0;endendmodule4、cnt60 模块程序module cnt60(clk,clr,j,q,cout); input clk,clr,j; output r eg[7:0] q;output reg cout;reg en1;always @(posedge clk A j or n egedge clr)beginif(~clr) q[3:0]=0;else beginif(q[3:0]<9) q[3:0]=q[3:0]+1;else q[3:0]=0;if (q[3:0]==9) en1=1;else en1=0; endendalways @(posedge clkAj or negedge clr) begin if(~clr) q[7:4]=0;else if(en1) beginif(q[7:4]<5) q[7:4]=q[7:4]+1;else q[7:4]=0;if (q[7:4]==5) cout=1;else cout=0; endendendmodule5、jsq24 模块程序module jsq24(clk,clr,j,q,cout);input clk,clr,j;output reg[7:0] q;output reg cout;reg en1; always@(posedge clkAj or negedge clr)beginif(~clr) q[3:0]=0;else beginif (q[3:0]==9|q=='h23) q[3:0]=0;else q[3:0]=q[3:0]+1; if(q[3:0]==9|q=='h23)en1=1;else en1=0;endendalways@(posedge clk A j or n egedge clr) begin if(~clr) q[7:4]=0;else if(en1) beginif (q=='h23) q[7:4]=0;else q[7:4]=q[7:4]+1;if(q[7:4]==2) cout=1;else cout=0;endendendmodule6、nyr2009 模块程序module nyr2009(clrn,clk,jn,jy,jr,qn,qy,qr); inputclrn,clk,jn,jy,jr;output reg [15:0] qn;output reg[7:0] qy,qr;reg [7:0] regreg [4:0] reg qym,qrm;clkn,clky;date;clkn1,clkn2,clkn3;initial begin clkn1=1;clkn2=1;clkn3=1;end initial begin qn='h2000;qym=1;qrm=1;end always@(posedge (clkAjr) or negedge clrn) beginif (~clrn) qrm=1;else beginif (qrm==date) qrm=1;else qrm=qrm+1;if (qrm==date) clky = 1;else clky = 0;endqr[7:4]=qrm/10; qr[3:0]=qrm%10;endalways @(posedge clkyAjy or negedge clrn)beginif (~clrn) qym=1;else beginif (qym==12) qym=1; else qym=qym+1; if(qym==12) clkn = 1; else clkn = 0;endqy[7:4]=qym/10;qy[3:0]=qym%10; end always begin case (qy) 1: date=31;2: beginif ((qn%4==0)&(qn/100 != 0)|(qn/400==0)) date=29; else date=28; end3: date=31;4: date=30;5: date=31;6: date=30;7: date=31;8: date=31;9: date=30;10: date=31;11: date=30;12: date=31; default :date=30; endcase end always @(posedge (elk n%) or n egedge 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[7:4]==9) clkn3=0;else clkn3=1;endendalways @(posedge clkn3 or negedge clrn ) begin if (~clrn) qn[15:12]=2;else if(qn[15:12]==9) qn[15:12]=0;else qn[15:12]=qn[15:12]+1;endendmodule7、mux_16 模块程序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:28]=0;q[27:0]={qs,qf,qm};endelse q={qn,qy,qr};endendmodule8、nzd 模块程序module nzd(k,x,q,clk);input k,x,clk;output reg q;always @(posedge clk)beginif(k==1) q=1;if(x==0) q=0;endendmodule。