基于.-FPGA的VerilogHDL数字钟设计~_第1页
基于.-FPGA的VerilogHDL数字钟设计~_第2页
基于.-FPGA的VerilogHDL数字钟设计~_第3页
基于.-FPGA的VerilogHDL数字钟设计~_第4页
基于.-FPGA的VerilogHDL数字钟设计~_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...基于FPGA的VerilogHDL数字钟设计专业班级姓名学号一、实验目的1.掌握可编程逻辑器件的应用开发技术

——设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;4.掌握分模块分层次的设计方法;5.用Verilog完成一个多功能数字钟设计;6.学会FPGA的仿真。二、实验要求功能要求:利用实验板设计实现一个能显示时分秒的多功能电子钟,根本功能:准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间范围模式;计时时间范围00:00:00-23:59:59可实现校正时间功能;可通过实现时钟复位功能:00:00:00扩展功能:定时报:时间自定(不要求改变),闹1分钟(1kHz)---利用板上LED或外接电路实现。仿播送电台正点报时:XX:59:[51,53,55,57(500Hz);59(1kHz)]---用板上LED或外接报整点时数:XX:00:[00.5-XX.5](1kHz),自动、手动---用板上LED或外接手动输入校时;手动输入定时闹钟;万年历;其他扩展功能;设计步骤与要求:计算并说明采用Basys2实验板时钟50MHz实现系统功能的根本原理。在XilinxISE13.1软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。对源程序进展编译及仿真分析〔注意合理设置,以便能够在验证逻辑的根基上尽快得出仿真结果〕。输入管脚约束文件,对设计工程进展编译与逻辑综合,生成下载所需.bit文件。在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。实验设计功能说明:实现时钟,时间校时,闹铃定时,秒表计时等功能时钟功能:完成分钟/小时的正确计数并显示;秒的显示用LED灯的闪烁做指示;时钟利用4位数码管显示时分;闹钟定时:实现定时提醒及定时报时,利用LED灯代替扬声器发出报时声音;时钟校时:当认为时钟不准确时,可以分别对分钟和小时位的值进展调整;秒表功能:利用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) begin counter=0; enable=0; end else begincounter=counter+1; if(counter==25'd249)//仿真时可将闸门信号设为0.00001s,加快仿真速度// if(counter==25'd24999999)//执行设计时将闸门信号改回为1s begin enable=~enable; counter=25'd0; end endendalways@(posedgeclk)//?????

begin

if(clr)

begin

en1<=1'b0;

en2<=1'b0;

end

else

begin

en1<=enable;

en2<=en1;

end

end

assignsecond_en=(!en1)&&(en2);always@(posedgeclk)beginif(clr)begin amin1<=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) begin count<=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) begin smin0<=0; smin1<=smin1+1; if(smin1==5) begin smin1<=0; shour0<=shour0+1; if(shour0==3) begin shour0<=0; shour1<=shour1+1; if(shour1==2) shour1<=0; end end end end end ////////////////////////////////////////////////////////////////////////////////if(mode==2'b11)begin//秒表计时状态if(pause==0)//当pause为低电平时开场计时beginmmin0<=mmin0+1;if(mmin0==9)beginmmin0<=0;mmin1<=mmin1+1;if(mmin1==9) begin mmin1<=0; mhour0<=mhour0+1; if(mhour0==9) begin mhour0<=0; mhour1<=mhour1+1; if(mhour1==9) mhour1<=0; end end end end end end end assignLD_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)begin if(clr) begin min1<=0; min0<=0; hour1<=0;hour0<=0; end else begin case(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)beginif(reset) begin count=0; end else begincount=count+1; endendalways@(posedgeclk)//SegScanbeginif(reset) begin scan<=4'b0000; end elsecase(count[1:0])//仿真时将扫描信号频率加快1000倍// case(count[11:10])//执行设计时将扫描频率改回2'b00:scan<=4'b0111;2'b01:scan<=4'b1011;2'b10:scan<=4'b1101;2'b11:scan<=4'b1110; endcaseendassignctr=scan;always@(posedgeclk)//SegScanbeginif(reset) begin temp<=4'b0000; end elsecase(count[1:0])//仿真时将扫描信号频率加快1000倍// case(count[11:10])//执行设计时将扫描频率改回2'b00:temp<=h1;2'b01:temp<=h0;2'b10:temp<=m1;2'b11:temp<=m0; endcaseendalways@(posedgeclk)//数码管译码beginif(reset) begin q<=7'b0000000; end elsecase(temp)4'd0:q<=7'b0000001;//04'd1:q<=7'b1001111;//14'd2:q<=7'b0010010;//24'd3:q<=7'b0000110;//34'd4:q<=7'b1001100;//44'd5:q<=7'b0100100;//54'd6:q<=7'b0100000;//64'd7:q<=7'b0001111;//74'd8:q<=7'b0000000;//84'd9:q<=7'b0000100;//9default:q<=7'b0000001;endcaseendendmoduleUCF文件NET"clk"LOC="B8";#50M#PinassignmentforDispCtl#ConnectedtoBasys2onBoard7qdisplayNET"q<6>"LOC="L14";#Bank=1,Signalname=CANET"q<5>"LOC="H12";#Bank=1,Signalname=CBNET"q<4>"LOC="N14";#Bank=1,Signalname=CCNET"q<3>"LOC="N11";#Bank=2,Signalname=CDNET"q<2>"LOC="P12";#Bank=2,Signalname=CENET"q<1>"LOC="L13";#Bank=1,Signalname=CFNET"q<0>"LOC="M12";#Bank=1,Signalname=CG#NET"dp"LOC="N13";#Bank=1,Signalname=DPNET"ctr<3>"LOC="K14";#Bank=1,Signalname=AN3NET"ctr<2>"LOC="M13";#Bank=1,Signalname=AN2NET"ctr<1>"LOC="J12";#Bank=1,Signalname=AN1NET"ctr<0>"LOC="F12";#Bank=1,Signalname=AN0NET"reset"LOC="N3";#Bank=2,Signalname=SW7NET"mode<1>"LOC="E2";#Bank=3,Signalname=SW6NET"mode<0>"LOC="F3";#Bank=3,Signalname=SW5NET"turn"LOC="G3";#Bank=3,Signalname=SW4NET"pause"LOC="B4";#Bank=3,Signalname=SW3NET"LD_alert"LOC="P7";#Bank=3,Signalname=LD2NET"alert"LOC="M11";#Bank=2,Signalname=LD1NET"sec"LOC="M5";#Bank=2,Signalname=LD0testbenchmoduletb_test; //Inputs regclk; regreset; reg[1:0]mode; regturn; regpause; //Outputs wire[6:0]q; wire[3:0]ctr; wiresec; wirealert; wireLD_alert; //InstantiatetheUnitUnderTest(UUT) clkuut( .clk(clk), .reset(reset), .mode(mode), .turn(turn), .pause(pause), .q(q), .ctr(ctr), .sec(sec), .alert(alert), .LD_alert(LD_alert) );parameterPERIOD=10; alwaysbeginclk=1'b0;#(PERIOD/2)clk=1'b1;#(PERIOD/2);end initialbegin //InitializeInputs reset=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论