欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    基于FPGA的VerilogHDL数字钟设计 .doc

    • 资源ID:97585281       资源大小:369KB        全文页数:26页
    • 资源格式: DOC        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于FPGA的VerilogHDL数字钟设计 .doc

    基于FPGA的Verilog HDL数字钟设计专业班级 姓 名 学 号 一、实验目的1.掌握可编程逻辑器件的应用开发技术 设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法; 4.掌握分模块分层次的设计方法; 5.用Verilog完成一个多功能数字钟设计; 6.学会FPGA的仿真。二、实验要求² 功能要求:利用实验板设计实现一个能显示时分秒的多功能电子钟,基本功能:1) 准确计时,以数字形式显示时、分、秒,可通过按键选择当前显示时间范围模式;2) 计时时间范围 00:00:0023: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) 在Xilinx ISE13.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时,暂停。四、 实验代码时钟模块module clock(clk, clr, pause, turn, mode, sec, min1, min0, hour1, hour0, alert, LD_alert );input clk; /时钟信号(50MHz)input clr; /清零键input pause; /秒表暂停键input turn; /调整分还是小时位的控制input 1:0mode; /决定时钟显示功能状态output sec; /接发光二极管output 3:0min1; /用于输出接数码管4output 3:0min0; /用于输出接数码管3output 3:0hour1; /用于输出接数码管2output 3:0hour0; /用于输出接数码管1output alert; /接发光二极管,代替蜂鸣器output LD_alert; /当闹铃设定后,发光二极管显示wire sec; /秒位显示wire LD_alert; /用于闹铃存在时的提醒显示/wire clk1; /时钟1s/wire clk2; /时钟100ms,用于秒表最小计时单位/wire clr1;reg 3:0min1; /常规显示reg 3:0min0; /常规显示reg 3:0hour1; /常规显示reg 3:0hour0; /常规显示reg 3:0smin1; /校时reg 3:0smin0; /校时reg 3:0shour1; /校时reg 3:0shour0; /校时reg 3:0amin1; /闹铃reg 3:0amin0; /闹铃reg 3:0ahour1; /闹铃reg 3:0ahour0; /闹铃reg 3:0mmin1; /秒表reg 3:0mmin0; /秒表reg 3:0mhour1; /秒表reg 3:0mhour0; /秒表reg alert; /当闹铃到时高电平输出reg 7:0count;reg 24:0counter;reg enable;reg en1,en2;wire second_en;always (posedge clk) /generate 1sbegin if (clr) begin counter = 0; enable = 0; end else begin counter = counter +1; if (counter = 25'd249) / 仿真时可将闸门信号设为0.00001s,加快仿真速度/ if (counter = 25'd) / 执行设计时将闸门信号改回为1s begin enable = enable; counter = 25'd0; end endendalways (posedge clk) /?begin if (clr) begin en1 <= 1'b0; en2 <= 1'b0; end else begin en1 <= enable; en2 <= en1; end endassign second_en = (!en1) && (en2);always (posedge clk) begin if(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; end else if (second_en) begin count<=count+1; / if(mode=2'b01) /闹铃调时状态 if(turn=1) /当turn为高电平时调整分位 if(amin1=5)&&(amin0=9) begin amin1<=0; amin0<=0; end else if(amin0=9) begin amin1<=amin1+1; amin0<=0; end else amin0<= amin0+1; else /当turn为低电平时调整小时位 if(ahour1=2)&&(ahour0=3) begin ahour1<=0; ahour0<=0; end else if(ahour0=9) begin ahour1<=ahour1+1; ahour0<=0; end else ahour0<=ahour0+1; / if(mode=2'b10) /时钟调时状态 if(turn=1) /当turn为高电平时调整分位 if(smin1=5)&&(smin0=9) begin smin1<=0; smin0<=0; end else if(smin0=9) begin smin1<=smin1+1; smin0<=0; end else smin0<=smin0+1; else /当turn为低电平时调整小时位 if(shour1=2)&&(shour0=3) begin shour1<=0; shour0<=0; end else if(shour0=9) begin shour1<=shour1+1; shour0<=0; end else shour0<=shour0+1; else /以下是常规显示begin if(count=59) begin count<=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 endendendend / if(mode=2'b11) begin /秒表计时状态 if(pause=0) /当pause为低电平时开始计时 begin mmin0<=mmin0+1; if(mmin0=9) begin mmin0<=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 endend endend end end assign LD_alert=(amin1|amin0|ahour1|ahour0)?1:0; /当闹铃有定时后LD_alert发光以示闹铃已定assign sec=enable; /将秒针接到LED灯always(posedge clk) begin if(clr) alert<=0; else if(amin1=smin1)&&(amin0=smin0)&&(ahour1=shour1)&&(ahour0=shour0) alert<=1; /对闹铃做检查,时间到时发光 else alert<=0; end/以下为选择显示模块always (posedge clk)begin if(clr) begin min1<=0; min0<=0; hour1<=0; hour0<=0; endelse begin case(mode) 2'b01: begin /mode=01时,显示闹铃模块 min1<=amin1; min0<=amin0; hour1<=ahour1; hour0<=ahour0; end 2'b10: begin /mode=10时,显示校时模块 min1<=smin1; min0<=smin0; hour1<=shour1; hour0<=shour0; end 2'b11: begin /mode=11时,显示秒表模块 min1<=mmin1; min0<=mmin0; hour1<=mhour1; hour0<=mhour0; end 2'b00: begin /其他状态,显示普通时钟模块 min1<=smin1; min0<=smin0; hour1<=shour1; hour0<=shour0; end endcase end end endmodule译码模块module display(q,ctr,h1,h0,m1,m0,clk,reset);output6:0q;output3:0 ctr;input3:0 h1,h0,m1,m0;input clk,reset;reg6:0 q;reg25:0 count;reg3:0 temp;reg3:0 scan;/delay yanshi(clk,clk2);always (posedge clk) begin if (reset) begin count = 0; end else begin count = count +1; endendalways (posedge clk ) /Seg Scan begin if(reset)begin scan<=4'b0000;endelse case(count1:0) / 仿真时将扫描信号频率加快1000倍/ case(count11:10) / 执行设计时将扫描频率改回 2'b00: scan<=4'b0111; 2'b01: scan<=4'b1011; 2'b10: scan<=4'b1101; 2'b11: scan<=4'b1110; endcaseendassign ctr = scan;always (posedge clk) /Seg Scanbegin if(reset)begin temp<=4'b0000;endelse case(count1:0) / 仿真时将扫描信号频率加快1000倍/ case(count11:10) / 执行设计时将扫描频率改回 2'b00: temp<=h1; 2'b01: temp<=h0; 2'b10: temp<=m1; 2'b11: temp<=m0; endcaseendalways (posedge clk) /数码管译码begin if(reset)begin q<=7'b;endelse case(temp)4'd0:q<=7'b; /04'd1:q<=7'b; /14'd2:q<=7'b; /24'd3:q<=7'b; /34'd4:q<=7'b; /44'd5:q<=7'b; /54'd6:q<=7'b; /64'd7:q<=7'b; /74'd8:q<=7'b; /84'd9:q<=7'b; /9default:q<=7'b; endcaseendendmoduleUCF文件NET "clk" LOC = "B8" # 50M# Pin assignment for DispCtl# Connected to Basys2 onBoard 7q displayNET "q<6>" LOC = "L14" # Bank = 1, Signal name = CANET "q<5>" LOC = "H12" # Bank = 1, Signal name = CBNET "q<4>" LOC = "N14" # Bank = 1, Signal name = CCNET "q<3>" LOC = "N11" # Bank = 2, Signal name = CDNET "q<2>" LOC = "P12" # Bank = 2, Signal name = CENET "q<1>" LOC = "L13" # Bank = 1, Signal name = CFNET "q<0>" LOC = "M12" # Bank = 1, Signal name = CG#NET "dp" LOC = "N13" # Bank = 1, Signal name = DPNET "ctr<3>" LOC = "K14" # Bank = 1, Signal name = AN3NET "ctr<2>" LOC = "M13" # Bank = 1, Signal name = AN2NET "ctr<1>" LOC = "J12" # Bank = 1, Signal name = AN1NET "ctr<0>" LOC = "F12" # Bank = 1, Signal name = AN0NET "reset" LOC = "N3" # Bank = 2, Signal name = SW7NET "mode<1>" LOC = "E2" # Bank = 3, Signal name = SW6NET "mode<0>" LOC = "F3" # Bank = 3, Signal name = SW5NET "turn" LOC = "G3" # Bank = 3, Signal name = SW4NET "pause" LOC = "B4" # Bank = 3, Signal name = SW3NET "LD_alert" LOC = "P7" ; # Bank = 3, Signal name = LD2NET "alert" LOC = "M11" ; # Bank = 2, Signal name = LD1NET "sec" LOC = "M5" ; # Bank = 2, Signal name = LD0testbenchmodule tb_test;/ Inputsreg clk;reg reset;reg 1:0 mode;reg turn;reg pause;/ Outputswire 6:0 q;wire 3:0 ctr;wire sec;wire alert;wire LD_alert;/ Instantiate the Unit Under Test (UUT)clk uut (.clk(clk), .reset(reset), .mode(mode), .turn(turn), .pause(pause), .q(q), .ctr(ctr), .sec(sec), .alert(alert), .LD_alert(LD_alert); parameter PERIOD = 10; always begin clk = 1'b0; #(PERIOD/2) clk= 1'b1; #(PERIOD/2); endinitial begin/ Initialize Inputsreset = 1;mode = 2'b00;turn = 0;pause = 0;/ Wait 100 ns for global reset to finish#500;reset = 0;mode = 2'b00;turn = 0;#600000;mode = 2'b01;turn = 0;#60000;mode = 2'b01;turn = 1;#60000;mode = 2'b10;turn = 0;#60000;mode = 2'b10;turn = 1;#60000;mode = 2'b11;#60000;pause = 1;#60000;reset = 1; / Add stimulus hereend endmodule五、 仿真进入ISim仿真波形界面(1)仿真,运行1ms,将波形结果调整为适合的大小。(2)这时我们可以分别点开clock模块和display模块查看具体的信号变化是否正确。我们先看clock模块。(3)当mode = 00时,实现正常时钟显示功能。在脉冲second_en到来时,count做计数加1,此时小时位是shour1,shour0,分钟位是smin1,smin0,将这几个相关信号在波形窗口中位置做个调整放到一起来查看。当count计数到59时,分钟位smin0实现加1变化,由0变为1;此时结果是正确的。(4)当mode =2b01时,实现闹铃模块。当turn=1时,调整分位amin1、amin0;当turn=0时,调整小时位ahour1、ahour0。将相关信号放在一起查看,由图可知,当turn为低时,调整小时位,ahour0计数加1,计数到9后清零且ahour1加1;当turn为高时,调整分钟位,amin0计数加1,计数到9后清零且ahouu1加1。结果显然是正确的。(5)当mode = 2b10时,实现校时功能。当turn=1时,调整分位smin1、smin0;当turn=0时,调整小时位shour1、shour0。将相关信号放在一起查看,由图可知,当turn为低时,调整小时位,shour0计数加1,计数到9后清零且shour1加1;当turn为高时,调整分钟位,smin0计数加1,计数到9后清零且shouu1加1。结果显然是正确的。(6)当mode = 2b11时,实现秒表计时功能。当pause=0时,开始计时;当pause=1时,暂停。由图可知,当pause=0时,mmin0计数加1,计数到9后清零且mmin1加1;当pause=1时,此时暂停秒表,mmin0的值保持为2。结果也是正确的。(7)查看display模块。此时是对之前得到的4位数码管的值进行译码并显示。我们可以随机抓取发生变化的几个结果来看,比如看到ns处的时间点。如下图所示:当扫描选择信号ctr为“1011”时,此时是显示数码管的第二位即h0,它的值为5,temp为“0101”,所对应的译码值为q=“”,结果是正确的。

    注意事项

    本文(基于FPGA的VerilogHDL数字钟设计 .doc)为本站会员(yy****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开