냠벶ꎺ뗧웸21톧뫅ꎺ2120401028탕쏻ꎺ헅쮶쪵퇩쳢쒿ꎺ쫽ퟖ훓짨볆摘要数字钟是人们日常生活中经常使用的计时工具,本次的课程设计是基于VerilogHDL的多功能数字钟,完成时、分、秒的显示功能。设计利用VerilogHDL语言自顶向下的设计理念,突出其作为硬件描述语言的良好的可读性、可移植性以及易于理解等优点。通过ISE13.1软件完成仿真、综合。程序下载到FPGA芯片后,可用于实际的数字钟显示。此次设计的逻辑结构主要由分频器、计数器和译码显示器三个模块构成。分频模块将50Mhz系统基准时钟分频产生两路时钟信号,一路是1HZ的数字钟计时工作频率,一路是数码管动态显示的扫描频率;计时模块对1HZ的时钟信号进行计时,分为时、分、小时三个部分(仅显示分和小时);译码显示模块采用动态扫描的方式完成数码管的显示。最后通过主模块调用三个子模块函数完成整个设计。튻ꆢ쪵퇩튪쟳벰쒿뗄1、设计一个完整的数字钟,小时和分钟用数码管显示,秒用发光二极管闪烁显示,每秒闪烁一次。如有可能,增加校时功能。2、在开发板上运行有关程序。3、熟悉并掌握Verilog程序开发及设计。뛾ꆢ쪵퇩쒣뿩춼1Hz复位小时调节分钟调节系统时钟죽ꆢ볆쪱웷릤ퟷ풭샭벰돌탲짨볆ꎺ计时模块分为三部分:时,分,秒。由主时钟分频得到秒信号,计秒到60时分加1,秒清零,计分到60时,分清零,小时加1,计小时到24时,全部清零。下图为工作原理框图:计时模块分频模块显示模块开始是否清零信号1Hz时钟信号秒是否满60分是否满60时是否满24分清零秒清零全部清零秒+1分+1小时+1程序编写:译码显⽰模块:···································································································moduleclocktjjs(inputclk,inputclr,input[1:0]FLAG,input[5:0]Stime,inputSetH,inputSetM,outputSflash,outputreg[6:0]a_to_g,outputreg[3:0]an);reg[3:0]cent60L;reg[3:0]cent60H;reg[3:0]cent24L;reg[3:0]cent24H;reg[3:0]LED1,LED2,LED3,LED4;reg[1:0]s;reg[3:0]digit;reg[16:0]clkdiv;reg[26:0]q1;regsec;integerss;integeri;initialbegincent60L=9;cent60H=5;cent24L=3;cent24H=2;ss=0;LED4=cent60L;LED3=cent60H;LED2=cent24L;LED1=cent24H;endalways@(*)beginan=4'b1111;s=clkdiv[16:15];an[s]=0;case(s)0:digit=LED1;1:digit=LED2;2:digit=LED3;3:digit=LED4;default:digit=LED4;endcasecase(digit)0:a_to_g=7'b0000001;1:a_to_g=7'b1001111;2:a_to_g=7'b0010010;3:a_to_g=7'b0000110;4:a_to_g=7'b1001100;5:a_to_g=7'b0100100;6:a_to_g=7'b0100000;7:a_to_g=7'b0001111;8:a_to_g=7'b0000000;9:a_to_g=7'b0001100;'hA:a_to_g=7'b0001000;'hB:a_to_g=7'b1100000;'hC:a_to_g=7'b0110001;'hD:a_to_g=7'b1000010;'hE:a_to_g=7'b0110000;'hF:a_to_g=7'b0111000;default:a_to_g=7'b0000001;endcaseendalways@(posedgeclk)beginclkdiv=clkdiv+1;end时钟程序,初始状态···································································································always@(posedgeclkorposedgeclr)beginif(clr==1)beginq1=0;LED1=0;LED2=0;LED3=0;LED4=0;cent60L=0;cent60H=0;cent24L=0;cent24H=0;ss=0;end分钟调节模块···································································································elseif(FLAG==2'b10)beginif(SetM)beginif(Stime=59)beginfor(i=0;i6;i=i+1)beginif(Stime[5:0]-i*1010)begincent60L=Stime[5:0]-i*10;cent60H=i;i=6;endendendelsebegincent60H=0;cent60L=0;endss=0;LED4[3:0]=cent60L[3:0];LED3[3:0]=cent60H[3:0];endend⼩时调节模块···································································································elseif(FLAG==2'b11)beginif(SetH)beginif(Stime=23)beginfor(i=0;i=3;i=i+1)beginif(Stime[5:0]-i*1010)begincent24L=Stime[5:0]-i*10;cent24H=i;i=6;endendendelsebegincent24L=0;cent24H=0;endss=0;LED2[3:0]=cent24L[3:0];LED1[3:0]=cent24H[3:0];endendelseif(FLAG==2'b00)计时模块:···································································································beginif(q1==50000000)beginq1=0;sec=~sec;LED4[3:0]=cent60L[3:0];LED3[3:0]=cent60H[3:0];LED2[3:0]=cent24L[3:0];LED1[3:0]=cent24H[3:0];ss=ss+1;if(ss==59)beginss=0;cent60L=cent60L+1;if(cent60L==9)begincent60L=0;cent60H=cent60H+1;endif(cent60H==5&¢60L==9)begincent60L=0;cent60H=0;cent24L=cent24L+1;if(cent24L==9)begincent24L=0;cent24H=cent24H+1;endif(cent24H==2&¢24L==3)begincent24L=0;cent24H=0;endendendendelseq1=q1+1;endendassignSflash=sec;endmodule约束⽂件部分:ucf⽂件如下:NETa_to_g[6]LOC=L14;NETa_to_g[5]LOC=H12;NETa_to_g[4]LOC=N14;NETa_to_g[3]LOC=N11;NETa_to_g[2]LOC=P12;NETa_to_g[1]LOC=L13;NETa_to_g[0]LOC=M12;NETan[3]LOC=F12;NETan[2]LOC=J12;NETan[1]LOC=M13;NETan[0]LOC=K14;NETclkLOC=B8;NETclrLOC=G12;NETSflashLOC=M5;NETFLAG[0]LOC=P11;NETFLAG[1]LOC=L3;NETStime[5]LOC=N3;NETStime[4]LOC=E2;NETStime[3]LOC=F3;NETStime[2]LOC=G3;NETStime[1]LOC=B4;NETStime[0]LOC=K3;NETSetHLOC=M4;NETSetMLOC=C11;쯄ꆢ뗷쫔폫컊쳢럖컶将程序下载到BASYS2板子上后,可以看到LED灯每秒闪一下,前两个数码管为数字钟小时小时显示,后两个为分钟的显示,数码管下按键为清零功能,另外通过开关控制可以将六位二进制数赋值给小时或分钟位,实现校表的功能,这样便实现了简易数字钟的功能。编写程序过程中出现的语法问题:1、要注意编写程序的过程中begin和end配对问题,类似于C语言中的括号匹配问题,在编写计数模块时编译不通过,最后检查出是缺少一个end结束符号,经修改后编译通过。2、在程序清零时,应在计数到59清零(小时为23清零),因为计数是从0开始,到59已经计满60个数,所以应该进行清零。数码管显示也为从59到00,而没有显示60。컥ꆢ쪵퇩탄뗃在这次的设计中我学会了很多东西。首先是对VerilogHDL语言的设计思想有了深入理解,将这种自顶向下的设计理念运用于实践中,设计多功能数字钟,突出了VerilogHDL作为硬件描述语言的良好可读性和可移植性,对所学的而理论知识也有了深刻的理解。其次是对VerilogHDL语言的语法熟悉,在这次的课程设计中,我学习到很多VerilogHDL语言的语法知识,比如在两个不同的语句块中不能对同一个变量进行操作,比如在用VerilogHDL语言中编写程序时要注意begin和end语句的匹配问题,在使用VerilogHDL语言时不可以使用中文注释等等。对于这种语言的学习也有了很大的帮助。最后是设计作品时的设计逻辑和设计思想,各个模块的实现要考虑综合情况而制定出最符合实际情况的实现方案,方案间要进行对比、实践,最终确定。在这次的课程设计中我不仅学习到有关程序编写以及设计方面的逻辑思维,对系统功能的实现也有了较为深入的了解,对各模块的调试等也学习到不少东西,总之,从这次设计中学到很多东西,也巩固了我的理论学习。