基于XilinxFPGA的数字钟设计

上传人:仙*** 文档编号:28697350 上传时间:2021-09-07 格式:DOC 页数:15 大小:525.50KB
收藏 版权申诉 举报 下载
基于XilinxFPGA的数字钟设计_第1页
第1页 / 共15页
基于XilinxFPGA的数字钟设计_第2页
第2页 / 共15页
基于XilinxFPGA的数字钟设计_第3页
第3页 / 共15页
资源描述:

《基于XilinxFPGA的数字钟设计》由会员分享,可在线阅读,更多相关《基于XilinxFPGA的数字钟设计(15页珍藏版)》请在装配图网上搜索。

1、各专业全套优秀毕业设计图纸基于FPGA的多功能数字钟一、设计题目基于Xilinx FPGA的多功能数字钟设计二、设计目的1.掌握可编程逻辑器件的应用开发技术设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;4.掌握分模块分层次的设计方法;5.用Verilog完成一个多功能数字钟设计;6.学会FPGA的仿真。三、设计内容设计实验项目九多功能电子钟 功能要求:利用实验板设计实现一个能显示时分秒的多功能电子钟,具体要求为:基本功能:1) 准确计时,以数字形式显示时、分、秒,可通过按键选择指示当前显示时间范围模式;2) 计时时间范围 00:00:0023:59

2、:593) 可实现校正时间功能;4) 可通过实现时钟复位功能:00:00:00扩展功能:1) 定时报:时间自定(不要求改变),闹1分钟(1kHz)-利用实验板LED或外接电路实现。2) 仿广播电台正点报时:XX:59:51,53,55,57(500Hz);59(1kHz) -利用实验板LED或外接电路实现。3) 报整点时数:XX:00:00.5-XX.5(1kHz),自动、手动-利用实验板LED或外接电路实现。4) 手动输入校时;5) 手动输入定时闹钟;6) 万年历;7) 其他扩展功能; 设计步骤与要求:1) 计算并说明采用Basys2实验板时钟50MHz实现系统功能的基本原理。2) 在Xil

3、inx ISE13.1软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。3) 对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快得出仿真结果)。4) 输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit类型文件。5) 在Basys2实验板上下载所生成的.bit文件,观察验证所设计的电路功能。四、总体设计思路主体分为分频模块,正常时间模块(包含两个模60计数器和一个模24计数器子模块),闹钟模块(分为一个模60计数器模块,一个模24计数器模块,四个比较器模块),电台报时模块,数码管显示模块(分

4、为模式选择模块,片选信号及扫描程序模块,和译码模块)。将各模块连接好各接线口即得到数字钟顶层模块complete.sch。五、各模块设计及源代码1.分频模块分频模块要将50MHz的时钟信号分成三个分别为1Hz,500Hz,1kHz的三个脉冲信号,设置三个计数器,在三个频率信号分别对应的延时时间进行翻转,就可以得到三个不同的脉冲信号。源代码如下:/freq.vmodule freq(clk,_1Hz,_500Hz,_1kHz);input clk;output _1Hz,_500Hz,_1kHz;reg _1Hz=0,_500Hz=0,_1kHz=0;reg 24:0 cnt1=0,cnt2=0

5、,cnt3=0;always (posedge clk)beginif (cnt125d24999999)/if (cnt125d249)/做test仿真时让变化更快cnt1=cnt1+1;/未达到计数时间计数器加一elsebegin _1Hz=_1Hz;/达到计时时间,信号翻转且计数器归零cnt1=0;endendalways (posedge clk)beginif (cnt225d49999)/if(cnt225d49)cnt2=cnt2+1;elsebegin _500Hz=_500Hz;cnt2=0;endendalways (posedge clk)beginif (cnt325d

6、24999)/if (cnt325d25)cnt3=cnt3+1;elsebegin _1kHz=_1kHz;cnt3=0;endendendmodule2.时钟正常显示模块正常显示模块分为时分秒三个子模块,分别对应一个模24计数器和两个模60计数器。模24计数器和模60计数器设计都BCD码来表示时分秒的值,每个分为高位和低位,均对应一个十进制的数。对模24计数器,每个脉冲信号来临时当低位小于9时加一;等于9时高位加一且低位置零;且高位小于3,低位小于9,超过时高低位均置零;当高位等于2时,低位只能到3,同时复位nCR低电平时高低位均置零。同理可得模60计数器的设计。根据这个思路,得到模24计

7、数器源代码如下:/counter24.vmodule counter24(CntH,CntL,nCR,EN,CP);input nCR,EN,CP;output 3:0 CntH,CntL;/分别为高位和低位reg 3:0 CntH,CntL;always (posedge CP or negedge nCR)beginif (nCR) CntH,CntL=8h00;/复位键清零else if(EN) CntH,CntL2)|(CntL9)|(CntH=2)&(CntL=3)CntH,CntL=8b00;/出现计数错误全部清零else if(CntH=2)&(CntL3)CntL=CntL+1

8、;/超过20时计数方式else if(CntL=9)begin CntH=CntH+1b1; CntL=4b0 ;/一般情况下计数方式endelseCntL=CntL+1b1;end模60计数器代码如下:/counterM60.vmodule counterM60(CntMH,CntML,nCR,EN,CP);input CP,EN,nCR;output 3:0 CntMH,CntML;reg 3:0 CntMH=0,CntML=0; always (posedge CP or negedge nCR) begin if(nCR)CntMH,CntML=8b00;else if (EN)Cnt

9、MH,CntML9|CntMH5|(CntMH=5&CntML=9)beginCntMH,CntML=8h00;endelse if(CntMH5&CntML=9)beginCntMH=CntMH+1b1;CntML=4b0;endelseCntML=CntML+1b1;endendmodule而时钟计时就是调用两个模60计数器和一个模24计数器,但相应的CP信号是需要修改的使得秒的60计数一周期可以使分加一,同时分钟跑一个周期能使得时针加一。同时按照设计要求需要加入按键调时功能,将两个按键AdjHr和AdjMin分别作为调时针和分针的按键,按下时时针和分钟的脉冲信号变为1Hz脉冲,由此时针分

10、钟会以1Hz的频率改变而达到调时间的目的。设置分钟和时钟的驱动信号分别为MinCP,HrCP,则可以设置MinCP=AdjMin?_1Hz:(Second=8h59); HrCP=AdjHr?_1Hz:(Minute,Second=16h5959);源代码如下:/Top_clock.vmodule top_clock(Hour,Minute,Second,_1Hz,nCR,AdjMin,AdjHr);input _1Hz,nCR,AdjMin,AdjHr;output 7:0 Hour,Minute,Second;/分别为时分秒输出wire 7:0 Hour,Minute,Second;sup

11、ply1 Vdd;/设置使能wire MinCP,HrCP;/定义激励信号counterM60 UT1(Second7:4,Second3:0,nCR,Vdd,_1Hz);counterM60 UT2(Minute7:4,Minute3:0,nCR,Vdd,MinCP);counter24 UT3(Hour7:4,Hour3:0,nCR,Vdd,HrCP);assign MinCP=AdjMin?_1Hz:(Second=8h59);/分钟激励assign HrCP=AdjHr?_1Hz:(Minute,Second=16h5959);/时钟激励endmodule3.仿电台报时模块设置ALAR

12、M为报时输出,Minute和Second分别为分钟信号和秒钟信号,先用if-else语句来进行Minute是否为59的判断,之后再用case语句在Second为51,53,55,57时输出500Hz的信号,在59时输出为1kHz的信号,在板子上没有输出声音的设备,就接入LED来验证是否正常报时。/radio.vmodule radio(ALARM,Minute,Second,_1kHz,_500Hz);input _1kHz,_500Hz;input 7:0 Minute,Second;output ALARM;reg ALARM;always (Minute or Second)if(Min

13、ute=8h59)case(Second)8h51,8h53,8h55,8h57:ALARM=_500Hz;/500Hz方式输出,报时8h59:ALARM=_1kHz;/59s以1kHz输出default:ALARM=1b0;/一般不输出endcaseelse ALARM=1b0;endmodule4.闹钟模块闹钟模块分为设定闹钟(包含两个按键),闹钟正常响铃,一个关闭闹钟的按键CtrRing。设定闹钟同样可以以1Hz脉冲为激励信号,其主体电路为一个以1Hz为激励信号的受SetMinkey控制的模60计数器和一个受SetHrkey控制的模24计数器,调用之前已经写好的模块即可。同时响铃设置为A

14、LARM_clock,受按键CtrRing控制。设置四个比较器,分别为小时高位比较,小时低位比较,分钟高位比较和分钟低位比较。当四个比较信号都为1时才会闹钟响铃。比较器的设计很简单直接给出源代码:/comparator.vmodule comparator(EQU,A,B);input 3:0 A,B;output EQU;assign EQU=(A=B);endmodule而闹钟主体源代码如下:/ring.vmodule ring(ALARM_clock,Set_Hr,Set_Min,Hour,Minute,Second,SetHrkey,SetMinkey,_1kHz,_500Hz,_1H

15、z,CtrRing );output ALARM_clock;output 7:0 Set_Hr,Set_Min;/输出的闹钟设定时间wire ALARM_clock;wire 7:0 Set_Hr,Set_Min;input _1kHz,_500Hz,_1Hz;input 7:0 Hour,Minute,Second;input SetHrkey,SetMinkey,CtrRing;/闹钟设定按键和关闭闹钟按键supply1 Vdd;/设置高电平wire HrH_Cop,MinH_Cop,HrL_Cop,MinL_Cop;/中间变量,为设定闹钟时间和正常时间比较wire time_EQU;c

16、ounterM60 SU1(Set_Min7:4,Set_Min3:0,Vdd,SetMinkey,_1Hz);/调用模60计数器模块counter24 SU2(Set_Hr7:4,Set_Hr3:0,Vdd,SetHrkey,_1Hz);comparator SU4(HrH_Cop,Set_Hr7:4,Hour7:4);/调用比较器模块comparator SU5(HrL_Cop,Set_Hr3:0,Hour3:0);comparator SU6(MinH_Cop,Set_Min7:4,Minute7:4);comparator SU7(MinL_Cop,Set_Min3:0,Minute3

17、:0);assign time_EQU=(HrH_Cop&HrL_Cop&MinH_Cop&MinL_Cop);/时间比较信号assign ALARM_clock=CtrRing?(time_EQU&(Second0=1b1)&_500Hz)|(Second0=1b0)&_1kHz):1b0;/设置闹铃输出endmodule5.数码管显示模块之前的模块设置了两个音频信号输出ALARM和ALARM_clock,这里可以统一起来。数码管既要显示闹钟设定时间,也要显示时钟正常显示时间。设置一个按键mode来切换显示模式,为0时显示正常时间,为1时显示闹钟定时时间。设置LED_Hr和LED_Min为得

18、到的当前显示的时和分。还有由LED_Hr和LED_Min到数码管的显示需要设计扫描程序,分为片选和译码模块。分别贴出源代码如下:模式选择模块:/mode.vmodule mode(mode,Hour,Minute,Second,Set_Hr,Set_Min,LED_Hr,LED_Min,ALARM,ALARM_clock,ALARMout);input mode,ALARM,ALARM_clock;input 7:0 Hour,Minute,Second,Set_Hr,Set_Min;output 7:0 LED_Hr,LED_Min;output ALARMout;wire ALARM,AL

19、ARM_clock;wire 7:0 Set_Hr,Set_Min;assign ALARMout=ALARM|ALARM_clock;/时钟响铃,闹钟和电台报时均有效assign LED_Hr=mode?Set_Hr:Hour;/选择当前显示的小时assign LED_Min=mode?Set_Min:Minute;/选择当前显示的分endmodule之后是译码模块在配置引脚时将小数点DP配置为最高位,其余G,F,E,D,C,B,A按从高到低的顺序配置,低电平段码管亮,由此可以写出对应段码,源代码如下:/translate.vmodule translate(Seg_in,Seg_outH,

20、Seg_outL);input7:0 Seg_in;/输入的数码output 7:0 Seg_outH;/翻译后的高位段码output 7:0 Seg_outL;/翻译后的低位段码wire 7:0 Seg_outH,Seg_outL;reg 7:0 Seg_outH1,Seg_outL1; always (Seg_in7:4)/高位译码case (Seg_in7:4)4b0000 : Seg_outH1=8b11000000;/0的段码4b0001 : Seg_outH1=8b11111001;/14b0010 : Seg_outH1=8b10100100;/24b0011 : Seg_out

21、H1=8b10110000;/34b0100 : Seg_outH1=8b10011001;/44b0101 : Seg_outH1=8b10010010;/54b0110 : Seg_outH1=8b10000010;/64b0111 : Seg_outH1=8b11111000;/74b1000 : Seg_outH1=8b10000000;/84b1001 : Seg_outH1=8b10010000;/9default: Seg_outH1=8b10100011;/出错显示endcasealways (Seg_in3:0)/低位译码case (Seg_in3:0)4b0000 : Se

22、g_outL1=8b11000000;4b0001 : Seg_outL1=8b11111001;4b0010 : Seg_outL1=8b10100100;4b0011 : Seg_outL1=8b10110000;4b0100 : Seg_outL1=8b10011001;4b0101 : Seg_outL1=8b10010010;4b0110 : Seg_outL1=8b10000010;4b0111 : Seg_outL1=8b11111000;4b1000 : Seg_outL1=8b10000000;4b1001 : Seg_outL1=8b10010000;default: Se

23、g_outL1=8b10100011;endcaseassign Seg_outH=Seg_outH1;assign Seg_outL=Seg_outL1;endmodule之后是数码管片选信号的设置和扫描程序,以500Hz为扫描频率。代码如下:/trans.vmodule trans(_500Hz,LED_Hr,LED_Min,SGG,SELE);input 7:0 LED_Hr,LED_Min;input _500Hz;output 7:0 SGG;output 3:0 SELE;wire 7:0 SGML,SGMH,SGHL,SGHH;/经过翻译的段码reg 1:0 count=2b00

24、;/扫描的计数控制wire 3:0 SELE;/片选信号wire 7:0 SGG;/输入数码管的输出信号reg 7:0 SG;/数码管段码中间变量reg 3:0 SEL=1110;/片选中间变量translate ST1(LED_Hr,SGHH,SGHL);translate ST2(LED_Min,SGMH,SGML);always (posedge _500Hz)case(count)2b00:begin SG=SGML;/选中第一个数码管 SEL=4b1110; count=count+1b1;/扫描信号不断加一,从而实现扫描end2b01:begin SG=SGMH;/选中第二个管 S

25、EL=4b1101; count=count+1b1;end2b10:begin SG=SGHL;/选中第三个管 SEL=4b1011;count=count+1b1;end2b11:begin SG=SGHH;/选中第四个管 SEL=4b0111; count=count+1b1;endendcaseassign SELE=SEL;/设置片选信号assign SGG=SG;/设置数码管显示信号endmodule6、多功能数字钟顶层模块设计采用图形设计方法,将以上已经写好的各模块都选择create schematic symbol封装成各个器件。名字设置为complete.sch,在这个文件里

26、将各个器件拖出来进行各引脚连线和标记输入输出端口。由于图太小截图看不清楚,只能先给个大概如下:其生成的vf文件如下:/complete.vfmodule complete(XLXN_10, XLXN_15, XLXN_16, XLXN_17, XLXN_19, XLXN_20, XLXN_21, XLXN_33, XLXN_32, XLXN_39, XLXN_40); input XLXN_10; input XLXN_15; input XLXN_16; input XLXN_17; input XLXN_19; input XLXN_20; input XLXN_21; input XLX

27、N_33; output XLXN_32; output 7:0 XLXN_39; output 3:0 XLXN_40; wire XLXN_4; wire XLXN_5; wire 7:0 XLXN_6; wire 7:0 XLXN_7; wire 7:0 XLXN_8; wire XLXN_11; wire 7:0 XLXN_13; wire 7:0 XLXN_14; wire XLXN_22; wire XLXN_24; wire 7:0 XLXN_37; wire 7:0 XLXN_38; freq XLXI_1 (.clk(XLXN_10), ._1Hz(XLXN_24), ._1

28、kHz(XLXN_4), ._500Hz(XLXN_5); radio XLXI_5 (.Minute(XLXN_77:0), .Second(XLXN_87:0), ._1kHz(XLXN_4), ._500Hz(XLXN_5), .ALARM(XLXN_11); ring XLXI_6 (.CtrRing(XLXN_21), .Hour(XLXN_67:0), .Minute(XLXN_77:0), .Second(XLXN_87:0), .SetHrkey(XLXN_19), .SetMinkey(XLXN_20), ._1Hz(XLXN_24), ._1kHz(XLXN_4), ._5

29、00Hz(XLXN_5), .ALARM_clock(XLXN_22), .Set_Hr(XLXN_137:0), .Set_Min(XLXN_147:0); top_clock XLXI_7 (.AdjHr(XLXN_16), .AdjMin(XLXN_15), .nCR(XLXN_17), ._1Hz(XLXN_24), .Hour(XLXN_67:0), .Minute(XLXN_77:0), .Second(XLXN_87:0); mode XLXI_8 (.ALARM(XLXN_11), .ALARM_clock(XLXN_22), .Hour(XLXN_67:0), .Minute

30、(XLXN_77:0), .mode(XLXN_33), .Second(XLXN_87:0), .Set_Hr(XLXN_137:0), .Set_Min(XLXN_147:0), .ALARMout(XLXN_32), .LED_Hr(XLXN_377:0), .LED_Min(XLXN_387:0); trans XLXI_9 (.LED_Hr(XLXN_377:0), .LED_Min(XLXN_387:0), ._500Hz(XLXN_5), .SELE(XLXN_403:0), .SGG(XLXN_397:0);Endmodule7.引脚配置拨码开关SW0对应mode(高电平为闹钟

31、时间,低电平为正常时间),SW1对应SetHrkey(高电平有效),SW2对应SeyMinkey(高电平有效),SW3对应CtrRing(高电平有效),SW5对应AdjMin(高电平有效),SW6对应AdjHr(高电平有效),SW7对应nCR(高电平有效)。ALARM_out对应LED0。得到的代码如下:#Created by Constraints Editor (xc3s100e-cp132-4) - 2014/12/03NET XLXN_10 TNM_NET = XLXN_10;TIMESPEC TS_XLXN_10 = PERIOD XLXN_10 20 ns HIGH 50 %;NE

32、T XLXN_10 LOC = B8;NET XLXN_10 IOSTANDARD = LVCMOS25;NET XLXN_15 IOSTANDARD = LVCMOS25;NET XLXN_32 LOC = M5;NET XLXN_33 LOC = P11;NET XLXN_19 LOC = L3;NET XLXN_20 LOC = K3;NET XLXN_21 LOC = B4;NET XLXN_17 LOC = N3;NET XLXN_15 LOC = F3;NET XLXN_16 LOC = E2;NET XLXN_397 LOC = P6;NET XLXN_390 LOC = L14

33、;NET XLXN_391 LOC = H12;NET XLXN_392 LOC = N14;NET XLXN_393 LOC = N11;NET XLXN_394 LOC = P12;NET XLXN_395 LOC = L13;NET XLXN_396 LOC = M12;NET XLXN_400 LOC = F12;NET XLXN_401 LOC = J12;NET XLXN_402 LOC = M13;NET XLXN_403 LOC = K14;六、各模块功能仿真1.分频模块仿真将testbench的cnt1,cnt2,cnt3分别改为249,49,24以使得更快看到仿真结果得到结

34、果如下:可见三个信号按照设置的分频是功能正常的。2时钟模块仿真从图中看出秒分都是跑到59之后再归零,跳变正常。而时是跑到23再归零的。功能正常。3.数码管显示仿真从图中看出,SELE按照预定方式跳变,与译码表对照,可知相应段码是正确的。该模块功能也是正常的。4.闹钟模块仿真从中看出当SetMinkey有效时Set_Min信号随着_1Hz在跳变。是正确的。5.电台报时模块仿真为了更加方便地看出功能仿真结果,在testbench设置初始参数为 _1kHz=1b1; _500Hz=1b1;Minute=8h59;Second=8h50;得到如下仿真波形图:从上图看出,该模块在Minute=59,和S

35、econd=5153,55,59时会有ALARM的高电平输出,即该模块功能正常。其余模块为均非时序性的子功能模块(如模60计数器)在各自的顶层模块已经可以验证其正确性,故此处不再单独仿真。将这些都做完后将程序在FPGA实验板中进行实际验证,通过了验收,实现了目标的功能,可以设置闹钟,电台报时以及正常的时间显示。七、实验小结在完成这个实验后我也从对FPGA只有一点点常识进步到能够很清晰地明白一个程序的完整设计流程了,在整个过程中是很累的,一开始总是出各种错误,很多都不明白是什么意思,只能一点点查找错误原因,但将错误解决后也对verilog HDL程序理解加深了一层。在不断调试过程中,我也比以前更加明白了错误该怎样检查怎样排除。我现在觉得Xilinx ISE这个软件做的不够好,在win8运行会有很多兼容性问题,我们应该准备好一个win7环境(可以用虚拟机)以便更好地运行程序。Verilog一个很方便的地方是分模块设计可以很方便的理清思路,检查错误,而且通过打包成器件,可以很直观地综合整个设计。在整个过程中遇到了很多小问题,很多报错都感觉不知所措,虽然最后都解决了,但很多错误的原因还没有非常明白,看来FPGA还应该更加深入地学习。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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