基于FPGA的多功能数字钟一、设计题目基于FPGA的多功能数字钟二、设计目的1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;4.掌握分模块分层次的设计方法;5.用Verilog完成一个多功能数字钟设计;6.学会FPGA的仿真。三、设计内容设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。数字中系统主要由系统时钟,三个功能按键(mode,turn,change),FPGA,数码管和蜂鸣器部分组成。四、FPGA及硬件描述语言简介1.FPGA简介FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。2.硬件描述语言简介硬件描述语言HDL(HardwareDescriptionLanguage)是一种用形式化方法来描述数字电路和系统的语言。目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,HDL在这种形势下显示出了巨大的优势,展望将来HDL在硬件设计领域的地位将与C和C++在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。VerilogHDL是一种硬件描述语言(hardwaredescriptionlanguage),为了制作数字电路而用来描述ASICs和FPGA的设计之用。VerilogHDL是目前应用最为广泛的硬件描述语言,可以用来进行各种层次的逻辑设计,也可以进行数字系统的逻辑综合,仿真验证和时序分析等,适合算法级,寄存器级,逻辑级,开关级、系统级和版图级等各个层次的设计和描述。VerilogHDL进行设计最大的优点是其工艺无关性,这使得工程师在功能设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件,即可设计出实际电路。VerilogHDL是工业和学术界的硬件设计者所使用的两种主要的HDL之一,另一种是VHDL。现在它们都已成为IEEE标准。两者各有特点,但VerilogHDL拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL丰富,且非常容易学习掌握。本设计提出了以VerilogHDL语言为手段,设计了多功能数字钟。其代码具有良好的可读性和易理解性,源程序经Altera公司的QuartusⅡ和ModelSim软件完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中。五、总体设计原理1、关于模式信号mode选择各个功能显示的构思:考虑到使用mode按键产生0、1信号在正常时间显示、调节时间功能、调节闹钟功能和跑表功能这四个功能之间的转换。所以mode信号的作用主要体现在控制模块(1)和显示模块中,虽然计时模块中也用到mode信号,但是它只是turn信号将秒信号清零的辅助作用,保证只有在m=0(即普通时钟显示)下turn信号清零功能才起作用,在校时功能下只能是分、小时的切换和跑表下的暂停功能。a、在控制模块下的作用:在控制模块下,其实mode和turn信号的作用更像2-4译码器的功能,将change数字上加信号按不同的mode和turn分成四个信号,分别是count1(时间显示下的分信号)、counta(时间显示下的小时信号)、count2(闹铃显示下的分信号)、countb(闹铃显示下的小时信号)。b、在显示模块下的作用:同在控制模块下的作用。只是将turn信号选出的小时和分钟在同一个mode下一起送至数码管显示。2、关于时间调整和闹铃时间调整中数字上加的原理:对于这个问题,我们要考虑两种情况,首先是时间调整的情况:因为在时间调整下,数字的上加不仅受到change信号的作用(即人工调时),还受本身在1Hz信号下计时而随时发生的累加。而闹铃时间调整不存在这种情况,因为闹铃下的时间数字发生上加只可能人工调节(change信号作用下)的结果。a、时间调整下的上加:由于在控制模块(2)下又设置了快加的功能,所以有三部分信号对上加起作用,一是快加下的numXclk,表示以原始时钟的速率上加,二是慢加下的change具体到各模块、各位的count1或counta,三是秒信号记到9向分信号的进位。b、闹铃时间调整下的上加:该部分原理同上,只是少了低位记到9向高位的进位。所以只有两部分组成,一是快加下的numXclk,表示以原始时钟的速率上加,二是慢加下的change具体到各模块、各位的count2或countb。图1多功能数字钟总体设计模块六、各模块说明1.分频模块由于FPGA内部提供的时钟信号频率大约为50MHz,在这需要将它转化成1Hz的标准时钟信号供数字钟的计时显示;在此采用了级联分频法。代码如下:modulefenpin(clk,clk_1Hz,clk_100Hz,clk_1k);outputclk_1Hz,clk_100Hz,clk_1k;inputclk;regclk_1Hz=0,clk_3=0,clk_1=0,clk_2=0,clk_1k=0;reg[6:0]cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0;wireclk_100Hz;always@(posedgeclk)beginif(cnt1156/2-1)/////////////////////////156分频,生成1MHz信号begincnt1=cnt1+1;endelsebegincnt1=0;clk_1=~clk_1;endendalways@(posedgeclk_1)if(cnt2156/2-1)////////////////////100分频,生成10000Hz信号begincnt2=cnt2+1;endelsebegincnt2=0;clk_2=~clk_2;endalways@(posedgeclk_2)if(cnt510/2-1)//////////////////////10分频,生成1kHz标准信号begincnt5=cnt5+1;endelsebegincnt5=0;clk_1k=~clk_1k;endalways@(posedgeclk_2)if(cnt3100/2-1)//////////////////////100分频,生成100Hz信号begincnt3=cnt3+1;endelsebegincnt3=0;clk_3=~clk_3;endassignclk_100Hz=clk_3;always@(posedgeclk_3)if(cnt4100/2-1)////////////////////100分频,生成1Hz标准信号begincnt4=cnt4+1;endelsebegincnt4=0;clk_1Hz=~clk_1Hz;endendmodule最终输出的是1Hz,100Hz,1kHz的标准时钟信号clk_1Hz,clk_100Hz,clk_1k。2、计时模块原理:m是模式按键,当m=0时,进入计时模式,在计时模式下可以进行时间调整。num3,num4产生加速调整时间,当其值为1时,可以快速调整时间,该调整时间的频率由clk提供。counta,count1是手动调节时间。Turn接按键,可以改变当前调节的是小时还是分钟,长按turn键还可以使秒钟信号清零。sec1,min1,hour1输出的是计时的秒,分,时。代码如下:modulejishi(clk,clk_1Hz,turn,////turn:接按键,在手动校时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时mode,count1,counta,sec1,min1,hour1,num3,num4);inputclk,clk_1Hz,turn,num3,num4;inputmode;inputcount1,counta;output[7:0]sec1,min1;output[7:0]hour1;wireclk_1Hz,ct1,cta,turn,num3,num4;reg[7:0]sec1=0,min1=0;reg[7:0]hour1=0;reg[1:0]m;wirecount1,counta;regminclk,hclk;always@(posedgemode)//mode信号控制系统在三种功能间转换beginif(m==4)m=0;elsem=m+1;end/////秒钟计时模块//////always@(posedgeclk_1Hz)if((sec1==8'h59)|turn&(!m))///////若长时间按住该键,还可使秒信号清零,用于精确调时。beginsec1=0;//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时if(!(turn&(!m)))minclk=1;///产生进位endelsebeginif(sec1[3:0]==4'b1001)beginsec1[3:0]=4'b0000;sec1[7:4]=sec1[7:4]+1;endelsesec1[3:0]=sec1[3:0]+1;minclk=0;end////////分钟计时模?///assignm_clk=minclk||count1;/////m_clk产生进位或校正改变assignct1=(num3&clk)|(!num3&m_clk);//ct1用于计时、校时中的分钟计数always@(posedgect1)beginif(min1==8'h59)beginmin1=0;hclk=1;endelsebeginif(min1[3:0]==9)beginmin1[3:0]=0;min1[7:4]=min1[7:4]+1;endelsemin1[3:0]=min1[3:0]+1;hclk=0;endend////////小时计时模块///assignh_clk=hclk||counta;//////h_clk产生进位或校正改变assigncta=(num4&clk)|(!num4&h_clk);//cta用于计时、校时中的小时计数always@(posedgecta)if(hour1==8'h23)hour1=0;elseif(hour1[3:0]==9)beginhour1[7:4]=hour1[7:4]+1;hour1