小组成员及学号:黄婷婷15352135
黄淑桦15352134黄
蕊15352132
院系:数据科学与计算机学院
专业:移动信息工程专业
班级:1506
摘要
本设计为一个多功能的数字钟,具有时、分、秒计数显示功能,以24小时循环计数;具有校时功能。拓展实现有秒表功能,整点报时功能,倒计时功能。
本设计以硬件描述语言Verilog为系统逻辑描述手段设计文件,利用Vivado进行编译仿真,由各个基本模块共同构建了一个基于FPGA的数字钟。
本实验主要经编译和仿真所设计的程序,可通过实验输出的波形图和FPGA板子的具体操作进行验证。
关键词:数字时钟,硬件描述语言,Verilog,FPGA
Abstract
Thedesignforamulti-functionaldigitalclock,withhours,minutesandsecondscountdisplaytoa24-hourcyclecount;withschoolfunctionsDevelopingstopwatchfunction,thewholepointtimekeepingfunction,countdownfunction.
ThisdesignusesthehardwaredescriptionlanguageVerilogasthesystemlogicdescriptionmethodtodesignthedocument,usesVivadotocarryonthecompilationsimulation,byeachbasicmodulealtogetherconstructedaFPGAbaseddigitalclock.
ThisexperimentismainlycompiledandSimulationofthedesignprocess,throughtheexperimentaloutputwaveformandFPGAboardspecificoperationstoverify.
Keywords:digitalclock,hardwaredescriptionlanguage,Verilog,FPGA
目录
摘要......................................................................................................2Abstract................................................................................................3选题背景.............................................................................................6
一,课题研究的必要性............................................................6二,课题研究的内容................................................................6三,实验可行性.........................................................................7四,设计理念.............................................................................9五,编程及仿真软件Vivado.....................................................9六,实验流程...........................................................................10数字化时钟系统软件设计方案.......................................................10
一,整体设计方案描述..........................................................10二,模块描述...........................................................................10系统调试...........................................................................................24
一,硬件调试..........................................................................24二,软件调试..........................................................................26实验总结...........................................................................................26
一,实验结论..........................................................................26二,实验收获...........................................................................26三,实验反思应用...................................................................27四,实验中遇到的问题及解决方法.......................................28
五,研究总结...........................................................................30六,小组人员分工...................................................................30参考文献...........................................................................................31附录....................................................................................................31
一,计时的另一方法...............................................................31
选题背景
一,课题研究的必要性现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。本次实验在完成时钟的基本功能后进行拓展,使其更加方便快捷,贴近生活。
二,课题研究的内容本设计以硬件描述语言Verilog为系统逻辑描述手段设计文件,采
用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。
本数字钟时间以24小时为一个周期,具有时、分、秒计数显示功能。正常工作状况下显示为时分,通过调整开关改变输入电平高低,改变为显示秒界面。
本数字钟具有校时功能,可以对时、分及秒进行单独校对,使其校正到标准时间。四个按键分别控制四个需调整的位,调时位长按一秒,该位数值加一,后三位达到九后归零,最高位最大值为2,使整体及时时间不能超过23:59分。
本设计拓展实现秒表功能,通过调整开关改变输入电平高低,触发秒表功能的实现。秒表可以实现清零与暂停。
本设计拓展实现整点报时功能,无需输入,在设定的时间LED灯进行闪烁,代替蜂鸣器。因整点时间较短,人工设定从整点开始,报时维持时间10秒。
本设计拓展实现倒计时功能,通过调整开关改变输入电平高低,进入倒计时功能。利用与校对相同的方法设定倒计时时长,通过调整开关改变输入电平高低实现暂停功能,通过按键实现重置功能。当重置时倒计时归零,如需使用需重新设定时间。暂停时,倒计时保持现有的时间不变,待再次按暂停键后,倒计时继续进行。
三,实验可行性1,FPGA的优越性
随着现场可编程门阵列(fieldprogram-mablegatearray,FPGA)的出现,电子系统向集成化、大规模和高速度等方向发展的趋势更加明显,作为可编程的集成度较高的ASIC,可在芯片级实现任意数字逻辑电路,从而可以简化硬件电路,提高系统工作速度,缩短产品研发周期。故利用FPGA这一新的技术手段来研究电子钟有重要的现实意义。设计采用FPGA现场可编程技术,运用自顶向下的设计思想设计电子钟。避免了硬件电路的焊接与调试,而且由于FPGA的I/O端口丰富,内部逻辑可随意更改,使得数字电子钟的实现较为方便。2,Verilog的优越性
本设计采用的Verilog是一种以文本形式来描述数字系统硬件的结构和行为的硬件描述语言。
Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言,可以让电路设计人员更容易学习和接受。
Verilog具有极强的描述能力,可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。其能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。
本设计利用Verilog结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。具有易学,方便,新颖,有趣,直观,设计与实验项目成功率高,理论与实践结合紧密,体积小,容量大,I/O口丰富,易编程和加密等特点,应用非常方便。
四,设计理念为了描述复杂的硬件电路,将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。
本设计采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。“自底向上”方式是“自顶向下”方式的逆过程。
同时使用描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。实际的电路元件。Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。
五,编程及仿真软件VivadoVivado设计套件,是FPGA厂商赛灵思公司2012年发布的集成设计环境。包括高度集成的设计环境和新一代从系统到IC级的工具,这些均建立在共享的可扩展数据模型和通用调试环境基础上。Vivado工具把各类可编程技术结合在一起,能够扩展多达1亿个等效ASIC门的设计。
六,实验流程1.工程师按照“自顶向下”的设计方法进行系统划分。
2.将以上的设计输入编译成标准的Verilog文件,并以模块形式进行封装。
3.进行代码级的功能仿真,主要是检验系统功能设计的正确性。最后在FPGA板子上进行实际操作。
数字化时钟系统软件设计方案
一,整体设计方案描述设计中的数字时钟,带有按键校准,整点报时,秒表,倒计时,数码管显示等功能。整体设计代码详见附录。
二,模块描述1,时钟模块1.1目的
针对计时器模块与闹钟设定模块的需求,可以知道分频模块需要生成一个1Hz的频率信号,用来产生时钟的秒脉冲,确保计时模块可以正常计数。1.2实现代码
wiremove;wire[0:0]ss;reg[26:0]clkdiv;reg[23:0]times;assignmove=clkdiv[26];assigns=clkdiv[19:18];assignss=clkdiv[18];//主要实现部分always@(posedgeclk)beginclkdiv<=clkdiv+1;end2,计时器模块2.1目的
此模块除基础的计数模块外,包含了调时功能。
计数模块的作用是收到分频模块1Hz频率的信号线,能进行正确计时,从功能上讲分别为模60计数器,模60计数器和模24计数器。校时功能,可以对时、分及秒进行单独校对,使其校正到标准时间。2.2,实现代码
moduleclock(inputwireclk,inputwiremod,inputwirecheck,inputwireclr,inputwire[3:0]button,outputwire[1:0]s,outputreg[3:0]digit,outputwire[15:0]led);wiremove,clk190;wire[0:0]ss;reg[30:0]clkdiv;reg[23:0]times;reg[15:0]light_reg;assignmove=clkdiv[26];assignclk190=clkdiv[19];assigns=clkdiv[19:18];assignss=clkdiv[18];//assigntimes=24'b0;always@(*)beginif(mod==0)begincase(s)0:digit=times[11:8];1:digit=times[15:12];2:digit=times[19:16];3:digit=times[23:20];default:digit=4'b1111;endcaseendelseif(mod==1)begincase(ss)0:digit=times[3:0];1:digit=times[7:4];default:digit=4'b1111;endcaseendEndalways@(posedgebeginif(check==0)beginmove)times[3:0]<=times[3:0]+1;//秒加1if(times[3:0]==4'b1001)//加到10,复位begintimes[3:0]<=4'b0000;if(times[7:4]<4'b0101)times[7:4]<=times[7:4]+1;//秒的十位加一elsebegintimes[7:4]<=4'b0000;times[11:8]<=times[11:8]+1;//分个位加一if(times[11:8]==4'b1001)//加到10,复位begintimes[11:8]<=4'b0000;if(times[15:12]<4'b0101)位加一elsebegintimes[15:12]<=4'b0000;times[19:16]<=times[19:16]+1;//时个位加一if(times[19:16]==4'b1001)//加到10,复位begintimes[19:16]<=4'b0000;if(times[23:20]<24)times[23:20]<=times[23:20]+1;//时十位加一elsetimes[23:16]<=4'b0000;//加到24,复位endendendendendendelsebeginif(clr==0)beginif(button[0:0]==1)beginif(mod==1)beginif(times[3:0]==4'b1001)times[3:0]<=4'b0000;elsetimes[3:0]<=times[3:0]+1;endelsebeginif(times[11:8]==4'b1001)times[11:8]<=4'b0000;elsetimes[11:8]<=times[11:8]+1;endendif(button[1:1]==1)beginif(mod==1)begintimes[15:12]<=times[15:12]+1;//分十if(times[7:4]==4'b0101)times[7:4]<=4'b0000;elsetimes[7:4]<=times[7:4]+1;//秒的十位加一endelsebeginif(times[15:12]==4'b0101)times[15:12]<=4'b0000;elsetimes[15:12]<=times[15:12]+1;endendif(button[2:2]==1)beginif(mod==0)beginif(times[19:16]==4'b0011×[23:20]==4'b0010)times[19:16]<=4'b0000;elseif(times[19:16]==4'b1001×[23:20]==4'b0001)times[19:16]<=4'b0000;elsetimes[19:16]<=times[19:16]+1;endendif(button[3:3]==1)beginif(mod==0)beginif(times[19:16]>4'b0011×[23:20]==4'b0001)times[23:20]<=4'b0000;elseif(times[23:20]==4'b0010)times[23:20]<=4'b0000;elsetimes[23:20]<=times[23:20]+1;endendendelsebegintimes[3:0]<=4'b0000;times[7:4]<=4'b0000;times[11:8]<=4'b0000;times[15:12]<=4'b0000;times[19:16]<=4'b0000;times[23:20]<=4'b0000;endendend3,LED显示模块3.1,目的:
根据实际的需求显示计时模块的时间,还是闹钟设定模块的时间,8个七段码LED数码管,进行扫描方式显示数据。3.2,实现思路
本模块通过代码实现74LS48的功能,将其封装为一个模块。选择74LS48作为显示译码电路,选择数码管作为显示单元电路。计数器实现了对时间的累计并以8421BCD码的形式输送到动态扫描模块,再由其输出的端送到74LS48,将BCD码转换为七段码,再由数码管显示出来。3.3,实现代码
//7seg数码管显示模块moduleprint(inputwire[2:0]pattern,inputwire[1:0]s,inputwire[3:0]digit,outputreg[3:0]an,outputreg[6:0]a_to_g);always@(*)beginan[3:0]=4'b1111;if(pattern[0]==1&pattern[1]==0&pattern[2]==0)//显示时间的秒钟模式,只显示2位beginif(s==0)an[s]<=0;if(s==1)an[s]<=0;endelsean[s]<=0;//其他模式都显示4位case(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'b0000100;'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;endcaseendEndmodule//04,动态扫描模块4.1,目的:
使每一个显示块显示与自己相对应的数据。只要保证每一位显示的时间间隔不要太大,利用人眼的视觉暂留的现象,就可以造成各位数据同时显示的假象。4.2,实现思路
动态扫描电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且输出数码管的片选信号和位选信号。所谓动态扫描显示方式是在显示某一位LED显示块的数据的时候,让其它位不显示,然后在显示下一位的数据,同时关闭其他显示块。
4.3,实现代码
wiremove,clk190;wire[0:0]ss;reg[30:0]clkdiv;reg[23:0]times;reg[15:0]light_reg;assignmove=clkdiv[26];assignclk190=clkdiv[19];assigns=clkdiv[19:18];assignss=clkdiv[18];//assigntimes=24'b0;always@(*)beginif(mod==0)begincase(s)0:digit=times[11:8];1:digit=times[15:12];2:digit=times[19:16];3:digit=times[23:20];default:digit=4'b1111;endcaseendelseif(mod==1)begincase(ss)0:digit=times[3:0];1:digit=times[7:4];default:digit=4'b1111;endcaseendend5,整点报时模块5.1,目的
整点报时无需输入,在整点时间时间LED灯进行闪烁,代替蜂鸣器。因整点时间较短,人工设定从整点开始,报时维持时间10秒。
5.2,设计说明设计基于计数器模块5.3,实现代码
always@(posedgeclk190)beginif(check==0&×[15:8]==0×[7:0]<10)//没在调时,分钟为0,秒钟在10内beginif(light_reg==16'b1000000000000000)light_reg<=16'b0000000000000001;elselight_reg<=light_reg<<1;endelselight_reg<=1;endassignled=light_reg;endmodule6,秒表实现模块6.1目的
通过调整开关改变输入电平高低,触发秒表功能的实现。6.2,实现代码
modulemod10Kcnt(inputwireclr,inputwireclk,inputwirestart,outputwire[1:0]s,outputreg[3:0]digit);reg[15:0]times;reg[30:0]clkdiv;wireclk190;always@(posedgeclk)beginclkdiv<=clkdiv+1;endassigns=clkdiv[19:18];assignclk190=clkdiv[19];always@(posedgeclk190)beginif(start==1)beginif(times[3:0]==9)begintimes[3:0]<=0;if(times[7:4]==9)begintimes[7:4]<=0;if(times[11:8]==9)begintimes[11:8]<=0;if(times[15:12]==9)times[15:12]<=0;elsetimes[15:12]<=times[15:12]+1;endelsetimes[11:8]<=times[11:8]+1;endelsetimes[7:4]<=times[7:4]+1;endelsetimes[3:0]<=times[3:0]+1;endelsebeginif(clr==1)begintimes[3:0]<=4'b0000;times[7:4]<=4'b0000;times[11:8]<=4'b0000;times[15:12]<=4'b0000;endendendalways@(*)begincase(s)0:digit=times[3:0];1:digit=times[7:4];2:digit=times[11:8];3:digit=times[15:12];default:digit=4'b1111;endcaseendEndmodule7,倒计时模块7.1目的
通过调整开关改变输入电平高低,进入倒计时功能。利用与校对相同的方法设定倒计时时长,通过调整开关改变输入电平高低实现暂停功能,通过按键实现重置功能。当重置时倒计时归零,如需使用需重新设定时间。暂停时,倒计时保持现有的时间不变,待再次按暂停键后,倒计时继续进行。7.2代码实现
//倒计时模块modulecut_down(inputwireclr,inputwireclk,inputwire[3:0]button,inputwirestart,outputwire[1:0]s,outputreg[3:0]digit);reg[30:0]clkdiv;always@(posedgeclk)beginclkdiv<=clkdiv+1;endreg[15:0]timex;assigns=clkdiv[19:18];wiremove;assignmove=clkdiv[26];always@(posedgemove)beginif(start==1)beginif(timex[3:0]!=0)timex[3:0]<=timex[3:0]-1;elsebeginif(timex[7:4]!=0)begintimex[7:4]<=timex[7:4]-1;timex[3:0]<=9;endelsebeginif(timex[11:8]!=0)begintimex[11:8]<=timex[11:8]-1;timex[7:4]<=5;timex[3:0]<=9;endelsebeginif(timex[15:12]!=0)begintimex[15:12]<=timex[15:12]-1;timex[11:8]<=9;timex[7:4]<=5;timex[3:0]<=9;endendendendendelsebeginif(clr==0)beginif(button[0:0]==1)beginif(timex[3:0]==4'b1001)timex[3:0]<=4'b0000;elsetimex[3:0]<=timex[3:0]+1;//秒加1endif(button[1:1]==1)beginif(timex[7:4]==4'b0101)timex[7:4]<=4'b0000;elsetimex[7:4]<=timex[7:4]+1;//秒的十位加一endif(button[2:2]==1)beginif(timex[11:8]==4'b1001)timex[11:8]<=4'b0000;elsetimex[11:8]<=timex[11:8]+1;//分个位加一endif(button[3:3]==1)beginif(timex[15:12]==4'b1001)timex[15:2]<=4'b0000;elsetimex[15:12]<=timex[15:12]+1;endendelsebegintimex[3:0]<=4'b0000;timex[7:4]<=4'b0000;timex[11:8]<=4'b0000;timex[15:12]<=4'b0000;endendendalways@(*)begincase(s)0:digit=timex[3:0];1:digit=timex[7:4];2:digit=timex[11:8];3:digit=timex[15:12];default:digit=4'b1111;endcaseendEndmodul8顶层模块
8.1目的
调用整个设计中的各个模块,将其联系起来,完成从下到上的整合。8.2实现代码
//顶层模块moduletop(inputwireclr,inputwireclk,inputwire[2:0]pattern,inputwire[3:0]button,inputwirecheck,inputwirestart,outputwire[3:0]an,outputwire[6:0]a_to_g,outputwire[15:0]led);reg[1:0]s;wire[1:0]s_0;wire[1:0]s_1;wire[1:0]s_2;reg[3:0]digit;wire[3:0]digit_0;wire[3:0]digit_1;wire[3:0]digit_2;regclr_0,clr_1,clr_2,start_0,start_1;reg[3:0]button_0;reg[3:0]button_1;always@(*)beginif(pattern[1]==0)beginif(pattern[2]==0)//显示时间beginclr_0<=clr;button_0<=button;s<=s_0;digit<=digit_0;endelse//倒计时beginclr_2<=clr;button_1<=button;start_1<=start;s<=s_1;digit<=digit_2;endendelse//秒表beginif(pattern[2]==0)beginclr_1<=clr;start_0<=start;s<=s_1;digit<=digit_1;endendendclockU1(.clr(clr_0),.clk(clk),.mod(pattern[0]),.check(check),.button(button_0),.s(s_0),.digit(digit_0),.led(led));mod10KcntU2(.clr(clr_1),.clk(clk),.start(start_0),.s(s_1),.digit(digit_1));cut_downU3(.clr(clr_2),.clk(clk),.button(button_1),.start(start_1),.s(s_2),.digit(digit_2));printU4(.pattern(pattern),.s(s),.digit(digit),.an(an),.a_to_g(a_to_g));endmodule系统调试
一,硬件调试在软件联机调试之前,首先要确定硬件是否完全正确。检查方面主要包括:
(1)PC机的接口和核心板上的JTAG下载口是否连接正确;(2)用示波器检测核心板的各个引脚是否有信号输出;(3)LED七段数码管显示正常引脚分布图
FPGA板上对应引脚:七位数码管第一位W19七位数码管第二位U18七位数码管第三位T17七位数码管第四位U17清零T18时分秒的切换R2
进入校时功能U16触发秒表功能T1秒表开始计时U17触发倒计时功能U1倒计时开始U17倒计时暂停U17
二,软件调试在确定好硬件系统正确之后,我对本设计进行分模块的软件调试。每完成一个模块就与前一个已完成的模块结合起来调试,直至实现相应功能,再编写下一模块程序。在与主程序衔接时,主程序和各子程序也需作相应的改动,以便与子程序更好的衔接,特别是显示子程序需作较大改动,以便对不同内容进行显示。
实验总结
一,实验结论将设计程序通过波形图输出进行预估检验,通过FPGA板进行实际操作,最终结果与预期效果基本一致,时、分、秒能够正常计数并能由控制键分别显示,整点报时功能正常,拓展功能课正常使用。
二,实验收获在此次的数字钟设计过程中,我们更进一步地熟悉有关数字电路的
知识和具体应用。学会了利用Vivado软件进行硬件描述语言的编写,程序的仿真等工作。并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善。
此次的数字钟设计重在于按键的控制和各个模块代码的编写,虽然能做到各个模块的正常使用,但对于各个模块的优化设计还有一定的缺陷和不足。同时,模块划分不够清晰,导致有的模块不能多次调用,这点做的还有所不足。
硬件描述语言在一定程度上与C语言有着紧密的联系,将其看为程序可能更加容易理解代码的含义。如将顶层模块视作main主函数,将各个需调用的底层模块视作子函数。
总的来说,通过这次的设计实验更进一步地增强了实验的动手能力,增加了对仿真软件和硬件描述语言的理解,对数字钟的工作原理也有了更加透彻的理解。
在实验过程中,小组的合作与交流也是个及其重要的方面,集思广益分工合作,才能在有限的时间内完成这一系列设计。
三,实验反思应用1,定时器进一步拓展
整点报时可通过比较器和调时功能转换为闹钟模式,并可以经
过简单的修改,将LED灯的变化改为电平的变化。以此可驱动接入的蜂鸣器实现声音的产生,也可将其输入到其他模块中,实现其他定时功能。例如定时开关定时自动报警、定时启闭电路、定时开关烘箱、
通断动力设备,甚至各种定时电气的自动启用等,所有这些,都可以在本基础上建构。2,调时功能拓展
本设计中虽然有控制键对时钟进行控制,但是用到的按键太多,在实际应用上存在不足。故提出改进方案为用一个按键控制数码管的片选,再用两个按键控制计数的加减。这样可以节省按键资源,以供更多的功能的使用。
四,实验中遇到的问题及解决方法1,计时的另一方法
本方法由案例【76】种第52例改编完成。在显示时附加毫秒的显示。通过开关控制时分,秒毫秒的切换。参考代码见附表。2,防抖模块的替换
防抖模块在整个设计中是非常必要的。一个完整的按键扫描过程还需要配合相应的键盘去抖手段才能正确的识别按键,不会发生重键和错误判断等情况。
正常思路设计应为当有按键按下时,采用软件消抖的办法去除按键抖动。模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。该模块有一个时钟输入端口,输入时钟信号是分频出来的1KHZ的时钟;有一个输入端口与行线相连,用于输入行线状态;一个输出端口,用于输出有
按键按下的信号。由于计数脉冲为1KHZ,故从有按键按下到输入信号产生大概需要15ms。一旦计数完成,抖动已经过去,不会发生重键现象了,这样就去除了抖动。但本种方法在实现上有一定的难度,所以采用了通过调节频率消除抖动的方法,而未用相应的防抖模块。在这一过程中,调节一个适当的频率是非常重要的。频率过高,扫描时间过短,会导致按一次建形成多次重复计数,造成跳位;频率过低,扫描时间过长,可能导致多次按键只计数一次的情况(虽在具体实验中频率足够高未曾发生),经计算出大致范围后多次试验,频率定为0.7HZ左右。3,调时设置按键的思路
调时设计是很重要的一个部分,制作过程中因为防抖的困难,有想过根据其他方法进行调时的设置,如将十位开关分别分别设为0~9,该位需要调节成何种数字,便将其对应开关调至高电平输入。同时划分四位开关代表显示屏的四个七段数码管,进行要调节位的控制。但同时此方法带来的弊端为,开关使用过多,硬件有效利用率极小,因此采用了优化后未继续使用此方法。4,模块划分不清晰
在设计电路时,对具体模块的仿真的过程中,往往没有考虑到整体设计的层面以及与上下模块接口的设计。开始按实现功能划分模块,分别做了每一个模块并进行检验,最后进行组合完成。因此,在检验每一个模块时会有起自己的一套译码模块,扫描模块,显示模块等,造成了重复的同时也为最后组合成一个大工程带来了一定的困难,
5,分频时间不是1s
时钟模块时,出现秒钟走的过快的现象。最终发现是分频程序中没有正确的对时钟脉冲信号进行正确的分频。通过在网络资源和书籍的学习正确的改善了这个问题。
五,研究总结本次在Verilog语言的学习上还存在一些问题,没有深入的学习,对于有些语法错误,还需要仔细的查找。同时如果将这个数字时钟应用于现实生活中,还存在些许的问题。例如按键太多,操作起来没那么的方便。在FPGA上设计和调试都需要耐心,时钟设计在生活中无处不在,设计的过程要考虑到应用的习惯,设计更人性化的体验,才会是一个好的设计。
本设计是采用硬件描述语言和FPGA芯片相结合进行的数字钟的研究,从中可以看出EDA技术的发展在一定程度上实现了硬件设计的软件化。设计的过程变的相对简单,容易修改等优点,相信随着电子技术的发展,数字钟的功能会更加多样化,满足人们的各种需要。
六,小组人员分工本设计小组成员共有三人,分工如下。
黄婷婷:具体功能模块的实现;Verilog主体代码的撰写修改。黄淑桦:具体功能模块的实现;Verilog代码的撰写;多重模块的总体整合;硬件测试运行。
黄蕊:前期参考资料及对应文献的查找;功能模块整体规划;实验论文的撰写。
参考文献
[1]郑利浩,赵峰等NEXYS2案例【76】2010-12-28
[2]刘君,常明,秦娟,基于硬件描述语言(VHDL)的数字时钟设计[3]DavidMoneyHarris,SarahL.Harris著,陈虎等译,数字设计和计算机体系结构,机械工业出版社,2009
[4].KawasakiHiroaki,SakuradaHiroshi,NarushimaShinichi,etalDouble-facedvacuumfluorescentdisplay[P].USPatent:5463276,1995
附录
一,计时的另一方法说明:由例52更改,自带显示扫描,译码等模块,可直接通过FPGA板进行使用。
//例52:模-6000计数器modulemod6Kcnt(inputwireclr,inputwireclk,outputreg[13:0]q,outputwireclkm);reg[5:0]c;//模-6000计数器always@(posedgeclkorposedgeclr)beginif(clr==1)q<=0;elseif(q==5999)beginq<=0;c<=c+1;endelseq<=q+1;endassignclkm=c[0];//oneminuteendmodule//例52:模-24:60计数器modulemodhmcnt(inputwireclr,inputwireclk,outputreg[13:0]q);always@(posedgeclkorposedgeclr)beginif(clr==1)q<=0;elseif(q[5:0]==59)beginq[5:0]<=0;if(q[9:6]==24)q[9:6]<=0;elseq[9:6]<=q[9:6]+1;endelseq<=q+1;endendmodule//例52:时钟分频器moduleclkdiv(inputwiremclk,inputwireclr,outputwireclk190,outputwireclk48);reg[25:0]q;//25位计数器always@(posedgemclkorposedgeclr)beginif(clr==1)q<=0;elseq<=q+1;endassignclk190=q[17];//760Hzassignclk48=q[19];//190Hzendmodule//例52:14-位二进制–BCD码转换器modulebinbcd14(inputwire[13:0]b,outputreg[16:0]p);//中间变量reg[32:0]z;integeri;always@(*)beginfor(i=0;i<=32;i=i+1)z[i]=0;z[16:3]=b;//shiftbleft3placesrepeat(11)//重复11次beginif(z[17:14]>4)//如果个位大于z[17:14]=z[17:14]+3;//加3if(z[21:18]>4)//如果十位大于z[21:18]=z[21:18]+3;//加3if(z[25:22]>4)//如果百位大于z[25:22]=z[25:22]+3;//加3if(z[29:26]>4)//如果千位大于z[29:26]=z[29:26]+3;//加3z[32:1]=z[31:0];//左移一位endp=z[30:14];//BCD输出endendmodule//例52:x7segbc–Display7-segwithleadingblanks4444//输入时钟信号cclk应为190Hzmodulex7segbc(inputwire[15:0]x,inputwirecclk,inputwireclr,outputreg[6:0]a_to_g,outputreg[3:0]an,outputwiredp);reg[1:0]s;reg[3:0]digit;assigndp=1;//decimalpointsoffalways@(*)case(s)0:digit=x[3:0];1:digit=x[7:4];2:digit=x[11:8];3:digit=x[15:12];default:digit=x[3:0];endcase//7段解码器:hex7segalways@(*)case(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'b0000100;'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;//0endcase//数字选择always@(*)beginan=4'b1111;//if(aen[s]==1)an[s]=0;end//2-位计数器always@(posedgecclkorposedgeclr)beginif(clr==1)s<=0;elses<=s+1;endendmodule//例52:模-10,000计数器modulemod10Kcnt_top(inputwiremclk,inputwire[3:3]btn,inputwire[3:3]sw,outputwire[6:0]a_to_g,outputwire[3:0]an,outputwiredp);wire[16:0]p;wireclr,show,clk48,clk190,clkm;wire[13:0]b1;wire[13:0]b2;reg[13:0]b;assignclr=btn[3];assignshow=sw[3];clkdivU1(.mclk(mclk),.clr(clr),.clk190(clk190),.clk48(clk48));mod6KcntU2(.clr(clr),.clk(clk48),.q(b1),.clkm(clkm));modhmcntU3(.clr(clr),.clk(clkm),.q(b2));always@(*)beginif(show==1)b[13:0]<=b1[13:0];elseb[13:0]<=b2[13:0];endbinbcd14U4(.b(b),.p(p));x7segbcU5(.x(p[15:0]),.cclk(clk190),.clr(clr),.a_to_g(a_to_g),.an(an),.dp(dp));endmodule
因篇幅问题不能全部显示,请点此查看更多更全内容