南京理工大学EDA(Ⅱ)实验报告——多功能数字钟姓名:学号:学院:指导教师:时间:2014/11/3~2014/11/7摘要日益复杂的电子线路使得基于原理图的设计越来越复杂,甚至不切实际。硬件描述语言的诞生,对设计自动化起到了极大的促进和推动作用。VerilogHDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,实现了从算法级、门级到开关级的多种抽象设计层次的数字系统建模,具有仿真,验证,故障模拟与时序分析等功能。本文利用VerilogHDL语言,采用自顶向下的设计方法设计多功能数字钟,并通过QuartusⅡ分块进行了仿真。此程序通过下载到FPGA芯片后,可实现实际的数字钟显示,具有基本的计时显示和设置,时间校正,整点报时,12h/24h转换,闹钟设置和闹铃控制的功能。关键词:FPGA,VerilogHDL,QuartusⅡ,EP3C25F324C8,数字钟AbstractThedevelopmentofelectroniccircuithasgrowntobetoocomplicatedtobedesignedbaseonschematicdiagram.ThebirthofHDLacceleratedthedevelopmentofelectronicdesignautomationdrastically.VerilogHDLisoneoftheHDLwithmultipleandstrongfunctions.Inthisthesis,acomplexdigitalsystemisdesignedinthebottom-upwaywithVerilogHDLandissimulatedbyQuartusⅡ.ThefunctionofadigitalclockcanberealizedbydownloadingtheprogramtoFPGA,whichincludestiming,time-setting,hourlychiming,12/24transforming,bell-settingandbell-controlling.Keywords:FPGA,VerilogHDL,QuartusⅡ,EP3C25F324C8,Digitalclock目录摘要Abstract第一章数字钟设计要求说明第二章数字钟的设计思路和工作原理第三章模块的VerilogHDL设计与仿真3.1计数器模块3.2基本计时顶层模块3.3分频模块3.4整点报时模块3.5闹钟模块3.6LED数码管显示模块3.7数字钟顶层模块第四章FPGA实现第五章总结5.1遇到的问题与解决方案5.2尚存在的不足之处5.3收获与感悟参考文献第一章数字钟设计要求说明(一)数字钟可以正常进行基本的时,分,秒计时功能。(二)分别由六个数码管显示时分秒的计时。(三)可以对数字钟的小时和分钟进行校正。(四)具有整点报时功能,在时钟计时到59分53秒时开始报时,在59分53秒,55秒,57秒时报时频率为500Hz,59分59秒时报时频率为1kHz。(五)具有闹钟设定功能,具体到小时和分钟,默认模式下闹钟响一分钟。有按键可以控制闹钟是否发出声响。(六)可以进行12/24小时转换。(七)具有重置清零功能。第二章数字钟的设计思路和工作原理本文中的数字钟设计采用自底向上的设计方法,共分为三层。首先设计基础模块,包括模6,10,12,24,60计数器模块,系统频率48MHz到2kHz和1kHz分频模块,1kHz到500Hz,250Hz,1Hz的分频模块,整点报时模块,闹钟模块,LED显示模块。然后,用一个顶层模块控制模12,24,60计数器模块构成基本的计时模块;再用一个顶层模块控制两个分频模块,实现分频模块的统一。最后用一个总的顶层电路,统一之前的子模块,实现数字钟的VerilogHDL描述。如下图方框图所示。其工作原理是:由系统晶振产生48MHz的稳定的高频脉冲信号,作为数字钟的时间基准,再经过分频器输出标准秒脉冲。模60计数器作为分钟和秒计数器,秒计数器计满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器由模24计数器计数。计数器的输出送至LED译码显示电路,即可显示时间。计时出现误差时可以用校正电路对小时和分钟进行计数。整点报时电路和闹钟电路为基本计时电路的功能拓展,只有在基本计时模块正常运行的情况下才能运行。第三章模块的VerilogHDL设计3.1计数器模块3.1.1模24小时计数器小时计数器的计数规律为00-01-02-03……10-11-12……22-23-00……,这样就要求在设计时小时计数器的个位和十位均按照8421BCD码计数。程序如下://counter24.v(BCD计数0~23)modulecounter24(CounterH,CounterL,nCR,EN,CP);inputCP,nCR,EN;//timingimpulseCP,zeroclearingsingalnCR,enablesingalENoutput[3:0]CounterH,CounterL;reg[3:0]CounterH,CounterL;/*定义了两个四位Reg型矢量,等效于8个变量(CounterH[0]、CounterH[1]、CounterH[2]、CounterH[3]),(CounterL[0]、CounterL[1]、CounterL[2]、CounterL[3])*/always@(posedgeCPornegedgenCR)//时钟上升沿或清零信号跳变为低电平时,条件为真beginif(~nCR){CounterH,CounterL}=8'h00;//nCR=0,异步清零elseif(~EN){CounterH,CounterL}={CounterH,CounterL};//对使能信号无效的处理elseif((CounterH2)||(CounterL9)||(CounterH==2)&&(CounterL=3)){CounterH,CounterL}=8'h00;//对小时计时器出错的处理elseif((CounterH==2)&&(CounterL3))beginCounterH=CounterH;CounterL=CounterL+1'b1;end//进行20到23计数elseif(CounterL==9)beginCounterH=CounterH+1'b1;CounterL=4'b0000;end//小时十位进位计数elsebeginCounterH=CounterH;CounterL=CounterL+1'b1;end//小时个位计数endendmodule3.1.2模60分钟和秒计数器分和秒计数器的计数规律为00-01-……-09-10-11-……-58-59-00……,可见个位计数器从0~9计数,十位计数器从0~5计数。因此可以先分别设计一个十进制计数器和一个六进制计数器模块,然后组合成60进制模块。程序如下:modulecounter10(Q,nCR,EN,CP);inputCP,nCR,EN;output[3:0]Q;reg[3:0]Q;//定义了一个四位Reg型矢量,等效于4个变量(Q[0]、Q[1]、Q[2]、Q[3])always@(posedgeCPornegedgenCR)//时钟上升沿或清零信号跳变为低电平时,条件为真beginif(~nCR)Q=4'b0000;//nCR=0,计数器被异步清零elseif(~EN)Q=Q;//EN=0,使能无效,暂停计数elseif(Q==4'b1001)Q=4'b0000;elseQ=Q+1'b1;//计数器増1计数endendmodulemodulecounter6(Q,nCR,EN,CP);inputCP,nCR,EN;output[3:0]Q;reg[3:0]Q;always@(posedgeCPornegedgenCR)beginif(~nCR)Q=4'b0000;//nCR=0,计数器被异步清零elseif(~EN)Q=Q;//EN=0,暂停计数elseif(Q==4'b0101)Q=4'b0000;elseQ=Q+1'b1;//计数器増1计数endendmodulemodulecounter60(Counter,nCR,EN,CP);inputCP,nCR,EN;output[7:0]Counter;//模六十计数器的输出信号wire[7:0]Counter;//输出为8421BCD码wireENP;//计数器十位的使能信号(中间变量)counter10UC0(Counter[3:0],nCR,EN,CP);//计数器的个数counter6UC1(Counter[7:4],nCR,ENP,CP);//计数器的十位assignENP=(Counter[3:0]==4'h9);//产生计数器十位的使能信号endmodule3.1.3模12小时计数器在12/24小时转换后,小时将需要模12计数器进行计数。思想与模24计数器相同,具体程序如下://counter12.v(BCD0~11)modulecounter12(CntH,CntL,nCR,EN,CP);inputCP,nCR,EN;//timingimpulseCP,zeroclearingsingalnCR,enablesingalENoutput[3:0]CntH,CntL;reg[3:0]CntH,CntL;always@(posedgeCPornegedgenCR)beginif(~nCR){CntH,CntL}=8'h00;elseif(~EN){CntH,CntL}={CntH,CntL};elseif((CntH1)||(CntL9)||(CntH==1)&&(CntL=1)){CntH,CntL}=8'h00;elseif((CntH==1)&&(CntL1))beginCntH=CntH;CntL=CntL+1'b1;endelseif(CntL==9)beginCntH=CntH+1'b1;CntL=4'b0000;endelsebeginCntH=CntH;CntL=CntL+1'b1;endendendmodule3.2基本计时顶层模块数字钟基本计时模块包括正常计时和对事件进行校正两部分。由分秒时三个计数器模块组成一个顶层模块完成数字钟的主要功能。电路的工作过程是:由AdjHrkey和AdjMinkey对小时和分钟进行校正。进行时间调整时,将相应的调整控制端置为高电平,此时将1Hz信号直接输入小时或分计数器,每秒钟来一个时钟信号,计数器加1计数,调整到目标值后,将相应控制端置回低电平,恢复正常小时或者时间计数,实现对小时和分钟的校正。正常计时时,秒计数器接收分频器输出的标准秒脉冲信号作为时钟,当秒计数达到59秒时,产生的输出信号作为分计数器的时钟信号,当秒和分计数器同时达到59时,产生的输出信号作为小时计数器的时钟信号,时分秒计数器的使能端始终保持高电平,通过控制他们的时钟实现计时功能。计时和校正两种模式下的转换通过一个二选一数据选择器实现。为了实现12/24小时计时转换,设置控制键Mode2,当Mode2=1时,显示24小时制计时,当Mode2=0时,显示12小时制计时。具体程序如下://top_clock.vmoduletop_clock(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey,Mode2);input_1Hz,nCR,AdjMinkey,AdjHrkey;output[7:0]Hour,Minute,Second;wire[7:0]Hour,Hour_24,Hour_12,Minute,Second;supply1Vdd;//定义Vdd为高电平wireMinCP,HrCP;//分别为分钟,小时计数器时钟信号的中间变量inputMode2;/*控制