基于FPGA的VerilogHDL数字钟设计专业班级姓名学号一、实验目的1.掌握可编程逻辑器件的应用开发技术?——设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;?4.掌握分模块分层次的设计方法;?5.用Verilog完成一个多功能数字钟设计;?6.学会FPGA的仿真。二、实验要求功能要求:利用实验板设计实现一个能显示时分秒的多功能电子钟,基本功能:1)准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间范围模式;2)计时时间范围00:00:00-23:59:593)可实现校正时间功能;4)可通过实现时钟复位功能:00:00:00扩展功能:5)定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用板上LED或外接电路实现。6)仿广播电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)]---用板上LED或外接7)报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动---用板上LED或外接8)手动输入校时;9)手动输入定时闹钟;10)万年历;11)其他扩展功能;设计步骤与要求:1)计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。2)在XilinxISE13.1软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。3)对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快得出仿真结果)。4)输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit文件。5)在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。三、实验设计功能说明:实现时钟,时间校时,闹铃定时,秒表计时等功能1.时钟功能:完成分钟/小时的正确计数并显示;秒的显示用LED灯的闪烁做指示;时钟利用4位数码管显示时分;2.闹钟定时:实现定时提醒及定时报时,利用LED灯代替扬声器发出报时声音;3.时钟校时:当认为时钟不准确时,可以分别对分钟和小时位的值进行调整;4.秒表功能:利用4个数码管完成秒表显示:可以实现清零、暂停并记录时间等功能。秒表利用4位数码管计数;方案说明:本次设计由时钟模块和译码模块组成。时钟模块中50MHz的系统时钟clk分频产生一个1Hz的使能控制信号enable,并以此产生1s的脉冲second_en以实现每秒计时,控制各个模式下的计数显示。由模式控制信号选择当前数码管显示哪个状态:mode=00,时钟常规显示状态,mode=01,闹铃定时状态,mode=10,时钟校时状态,mode=11,秒表计时状态;时钟:利用count,smin0,smin1,shour0,shour1的计数来实现,具体情况见程序;校时:当turn=1时,调整分位smin1、smin0;当turn=0时,调整小时位shour1、shour0;闹铃:当turn=1时,调整分位amin1、amin0;当turn=0时,调整小时位ahour1、ahour0;秒表:当pause=0时,开始计时;当pause=1时,暂停。四、实验代码时钟模块moduleclock(clk,clr,pause,turn,mode,sec,min1,min0,hour1,hour0,alert,LD_alert);inputclk;//时钟信号(50MHz)inputclr;//清零键inputpause;//秒表暂停键inputturn;//调整分还是小时位的控制input[1:0]mode;//决定时钟显示功能状态outputsec;//接发光二极管output[3:0]min1;//用于输出接数码管4output[3:0]min0;//用于输出接数码管3output[3:0]hour1;//用于输出接数码管2output[3:0]hour0;//用于输出接数码管1outputalert;//接发光二极管,代替蜂鸣器outputLD_alert;//当闹铃设定后,发光二极管显示wiresec;//秒位显示wireLD_alert;//用于闹铃存在时的提醒显示//wireclk1;//时钟1s//wireclk2;//时钟100ms,用于秒表最小计时单位//wireclr1;reg[3:0]min1;//常规显示reg[3:0]min0;//常规显示reg[3:0]hour1;//常规显示reg[3:0]hour0;//常规显示reg[3:0]smin1;//校时reg[3:0]smin0;//校时reg[3:0]shour1;//校时reg[3:0]shour0;//校时reg[3:0]amin1;//闹铃reg[3:0]amin0;//闹铃reg[3:0]ahour1;//闹铃reg[3:0]ahour0;//闹铃reg[3:0]mmin1;//秒表reg[3:0]mmin0;//秒表reg[3:0]mhour1;//秒表reg[3:0]mhour0;//秒表regalert;//当闹铃到时高电平输出reg[7:0]count;reg[24:0]counter;regenable;regen1,en2;wiresecond_en;always@(posedgeclk)//generate1sbeginif(clr)begincounter=0;enable=0;endelsebegincounter=counter+1;if(counter==25'd249)//仿真时可将闸门信号设为0.00001s,加快仿真速度//beginenable=~enable;counter=25'd0;endendendalways@(posedgeclk)//?????beginif(clr)beginen1=1'b0;en2=1'b0;endelsebeginen1=enable;en2=en1;endendassignsecond_en=(!en1)&&(en2);always@(posedgeclk)beginif(clr)beginamin1=0;amin0=0;ahour1=0;ahour0=0;smin1=0;smin0=0;shour1=0;shour0=0;mmin1=0;mmin0=0;mhour1=0;mhour0=0;count=0;endelseif(second_en)begincount=count+1;///////////////////////////////////////////////////////////////////////////////////////////if(mode==2'b01)//闹铃调时状态if(turn==1)//当turn为高电平时调整分位if((amin1==5)&&(amin0==9))beginamin1=0;amin0=0;endelseif(amin0==9)beginamin1=amin1+1;amin0=0;endelseamin0=amin0+1;else//当turn为低电平时调整小时位if((ahour1==2)&&(ahour0==3))beginahour1=0;ahour0=0;endelseif(ahour0==9)beginahour1=ahour1+1;ahour0=0;endelseahour0=ahour0+1;////////////////////////////////////////////////////////////////////////////////////////if(mode==2'b10)//时钟调时状态if(turn==1)//当turn为高电平时调整分位if((smin1==5)&&(smin0==9))beginsmin1=0;smin0=0;endelseif(smin0==9)beginsmin1=smin1+1;smin0=0;endelsesmin0=smin0+1;else//当turn为低电平时调整小时位if((shour1==2)&&(shour0==3))beginshour1=0;shour0=0;endelseif(shour0==9)beginshour1=shour1+1;shour0=0;endelseshour0=shour0+1;else//以下是常规显示beginif(count==59)begincount=0;smin0=smin0+1;if(smin0==9)beginsmin0=0;smin1=smin1+1;if(smin1==5)beginsmin1=0;shour0=shour0+1;if(shour0==3)beginshour0=0;shour1=shour1+1;if(shour1==2)shour1=0;endendendendend////////////////////////////////////////////////////////////////////////////////if(mode==2'b11)begin//秒表计时状态if(pause==0)//当pause为低电平时开始计时beginmmin0=mmin0+1;if(mmin0==9)beginmmin0=0;mmin1=mmin1+1;if(mmin1==9)beginmmin1=0;mhour0=mhour0+1;if(mhour0==9)beginmhour0=0;mhour1=mhour1+1;if(mhour1==9)mhour1=0;endendendendendendendassignLD_alert=(amin1|amin0|ahour1|ahour0)?1:0;//当闹铃有定时后LD_alert发光以示闹铃已定assignsec=enable;//将秒针接到LED灯always@(posedgeclk)beginif(clr)alert=0;elseif((amin1==smin1)&&(amin0==smin0)&&(ahour1==shour1)&&(ahour0==shour0))alert=1;//对闹铃做检查,时间到时发光elsealert=0;end//以下为选择显示模块always@(posedgeclk)beginif(clr)beginmin1=0;min0=0;hour1=0;hour0=0;endelsebegincase(mode)2'b01:begin//mode=01时,显示闹铃模块min1=amin1;min0=amin0;hour1=ahour1;hour0=ahour0;end2'b10:begin//mode=10时,显示校时模块min1=smin1;min0=smin0;hour1=shour1;hour0=shour0;end2'b11:begin//mode=11时,显示秒表模块min1=mmin1;min0=mmin0;hour1=mhour1;hour0=mhour0;end2'b00:begin//其他状态,显示普通时钟模块min1=smin1;min0=smin0;hour1=shour1;hour0=shour0;endendcaseendendendmodule译码模块moduledisplay(q,ctr,h1,h0,m1,m0,clk,reset);output[6:0]q;output[3:0]ctr;input[3:0]h1,h0,m1,m0;inputclk,reset;reg[6:0]q;reg[25:0]count;reg[3:0]temp;reg[3:0]scan;//delayyanshi(clk,clk2);always@(posedgeclk)b