【摘要】本文介绍了基于FPGA的数字频率计的设计方法,设计采用硬件描述语言Verilog,在软件平台QuartusⅡ9.1上完成,可以在较高的时钟频率下正常工作。该数字频率计采用测频的方法,能基本测量1Hz到16MHz之间的信号。并使用仿真软件对Verilog程序做了仿真,并完成综合布局布线,最终下载到DE2-70实验板上得到实现。【关键词】FPGA、Verilog、QuartusⅡ9.1、测评方法Abstract:ThispaperintroducesthedesignmethodofdigitalfrequencymeterbasedonFPGA,whichusehardwaredescriptionlanguage-VeriloginsoftwaredevelopmentplatformQuartusⅡ9.1andwordinrelativelyhigh-speedclock.Thefrequencymeterusesthemethodoffrequencymeasurement,whichcouldaccuratelymeasurethefrequencyofsignalsfrom1Hzto16MHz.ThissystemusesthesimulationtooltorunanddebugtheVerilogprogran,anddesignthecircuitplacement.AgoodresultcanbeachievedwhentheprogramwasburntonthebreadboardDE2-70.Keywords:FPGA,Verilog,QuartusⅡ9.1,FrequencyMeasurement0引言数字频率计是一种基本的测量仪器,是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,它被广泛应用与航天、电子、测控等领域。它的基本测量原理是,首先让被测信号与标准信号一起通过一个闸门,然后用计数器计数信号脉冲的个数,把标准时间内的计数的结果,用锁存器锁存起来,最后用显示译码器,把锁存的结果用液晶显示器显示出来。根据数字频率计的基本原理,本文设计方案的基本思想是分为四个模块来实现其功能,即整个数字频率计系统分为分频模块、计数模块、锁存器模块和显示模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。而且,本设计方案还要求,被测输入信号的频率范围自动切换量程,控制小数点显示位置,并以十进制形式显示。本文详细论述了利用VHDL硬件描述语言设计,并在EDA(电子设计自动化)工具的帮助下,用大规模可编程器件(CPLD)实现数字频率计的设计原理及相关程序。特点是:无论底层还是顶层文件均用VerilogHDL语言编写,避免了用电路图设计时所引起的毛刺现象;改变了以往数字电路小规模多器件组合的设计方法。整个频率计设计在一块CPLD芯片上,与用其他方法做成的频率计相比,体积更小,性能更可靠。该设计方案对其中部分元件进行编程,实现了闸门控制信号、多路选择电路、计数电路、位选电路、段选电路等。频率计的测频范围:1~16MHz。该设计方案通过了QuartusⅡ9.1软件仿真、硬件调试和软硬件综合测试。1电路设计总体框图本设计主要由8个部分组成,以CycloneⅡ芯片部分为核心展开,待测信号输入,由外部电源,复位电路,单片机电路,液晶显示,标准时钟以及JTAG下载各个单元配合起来实现测试频率并在液晶显示屏上实时显示出数字频率信号,原理框图如图1所示。被测频率频标Gate锁存信号图1原理框图频率是周期信号在单位时间内的重复次数,电子计数器可以对一个周期信号发生的次数,进行计数。如果某一信号在T秒时间间隔内的重复次数为N次,则该信号的频率f为NfT在直接测频率的基础上发展的多周期同步测频率法,在目前的测频系统中得到越来越多广泛的应用。将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器提供标准的时间脉冲信号、若其周期为1s。则门控电路的输出信号持续时间亦准确地等于1s。闸门电路由标准秒信号进行控制,当秒信号来到时,闸门开通.被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数所以被测频率fx=NHz。所以,直接测频法的测量准确度与信号的频率有关:当待测信号频率较高时,测量准确度也较高,反之测量准确度也较低。其频率测量原理如图2所示。控制信号产生计数器锁存器显示译码器图2频率测量原理图2系统的硬件框架设计控制的核心芯片是FPGA,其硬件框架设计如图3所示,它由两大功能模块组成:(1)频率计数模块,包含两个部分,选通时间控制部分,可改变选通时间;计数部分,根据选通时间的长短对被测信号正脉冲进行计数;(2)扫描显示模块,对计数的结果进行扫描显示,从而完成整个测频率的过程。外围的电路相对简单,只有信号输入整形电路和数码管显示电路和LCD显示模块。系统的工作原理是,被测信号经整形生成矩形波输入到控制核心芯片FPGA的计数模块,计数模块根据所提供的矩形波上升沿计数,计数时间则由选通时间控制部分决定,根据频率所处的范围来决定档位;将计数的结果给显示电路,通过扫描,在数码管上和LCD上显示频率的大小。3仿真结果由于频率计的仿真计数时间为1s,在软件测试中仿真时间较长,故此设计直接在实验板上实现可得测试结果如图4所示。4设计总结通过此次课程设计,使我更加扎实的掌握了有关QuartusII软件的使用,使我们对EDA的知识重新巩固了。也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。代码:moduleFreq_counter(iCLK,RST_N,MODE,START,FCLK,HEX,HEX1,HEX2,HEX3,HEX4,HEX5,HEX6,HEX7,CONT,SEL,LCD_DATA,oLCD_RW,oLCD_RS,oLCD_EN,oLCD_ON);inputiCLK,RST_N;inputMODE,START,FCLK;output[24:0]CONT;output[7:0]HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,HEX6,HEX7;outputSEL;output[7:0]LCD_DATA;outputoLCD_RW,oLCD_RS,oLCD_EN,oLCD_ON;wireCLK_33M,rst10;wire[24:0]CONT;regSEL,en,rst1;reg[5:0]stat;wirert,clk1,clk2,clk3,clk4,clk5,clk6,clk7;wire[31:0]bcd;reg[31:0]bcd1;wire[6:0]SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7;wire[7:0]HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,HEX6,HEX7;//-----------------------------------------------------------------PLL50MU0(.inclk0(iCLK),.c0(CLK_33M));always@(posedgeMODEornegedgeRST_N)if(!RST_N)SEL=1'b0;elseSEL=SEL+1'b1;//SEL=0autoMODE;SEL=1manMODE;always@(posedgeCONT[19]ornegedgeRST_N)if(!RST_N)beginstat=6'd0;en=1'd0;rst1=1'b0;endelseif(!SEL)case(stat)6'd31:beginstat=stat+1'b1;en=1'b1;rst1=1'b1;end6'd32:beginstat=6'd0;en=1'b0;rst1=1'b0;enddefault:beginstat=stat+1'b1;en=1'b0;rst1=1'b1;endendcaseelsecase(stat)6'd0:if(!START)beginstat=stat+1'b1;rst1=1'b0;endelsestat=stat;6'd32:beginstat=stat+1'b1;en=1'b1;rst1=1'b1;end6'd33:beginstat=6'd0;en=1'b0;rst1=1'b0;enddefault:beginstat=stat+1'b1;en=1'b0;rst1=1'b1;endendcaseassignrt=en;assignrst10=RST_N&rst1;//---------------------------------------------------------------------------CONT_10hex0(.clk(FCLK),.rst(rst10),.bcd(bcd[3:0]),.co(clk1));CONT_10hex1(.clk(clk1),.rst(rst10),.bcd(bcd[7:4]),.co(clk2));CONT_10hex2(.clk(clk2),.rst(rst10),.bcd(bcd[11:8]),.co(clk3));CONT_10hex3(.clk(clk3),.rst(rst10),.bcd(bcd[15:12]),.co(clk4));CONT_10hex4(.clk(clk4),.rst(rst10),.bcd(bcd[19:16]),.co(clk5));CONT_10hex5(.clk(clk5),.rst(rst10),.bcd(bcd[23:20]),.co(clk6));CONT_10hex6(.clk(clk6),.rst(rst10),.bcd(bcd[27:24]),.co(clk7));CONT_10hex7(.clk(clk7),.rst(rst10),.bcd(bcd[31:28]));always@(posedgertornegedgeRST_N)if(!RST_N)bcd1=32'd0;elsebcd1=bcd;sem_driveU2(.oSEG0(SEG0),.oSEG1(SEG1),.oSEG2(SEG2),.oSEG3(SEG3),.oSEG4(SEG4),.oSEG5(SEG5),.oSEG6(SEG6),.oSEG7(SEG7),//outputto8SEG.iDIG(bcd1));//input8-BCDcode(4*8=32bit)assignHEX0={1'b1,SEG0};assignHEX1=((bcd1[11:8]==4'd0)&&(bcd1[7:4]==4'd0))?8'd255:{1'b1,SEG1};assignHEX2=((bcd1[15:12]==4'd0)&&(bcd1[11:8]==4'd0))?8'd255:{1'b1,SEG2};assignHEX3=((bcd1[19:16]==4'd0)&&(bcd1[15:12]==4'd0))?8'd255:{1'b1,SEG3};assignHEX4=((bcd1[23:20]==4'd0)&&(bcd1[19:16]==4'd0))?8'd255:{1'b1,SEG4};assignHEX5=((bcd1[27:24]==4'd0)&&(bcd1[23:20]==4'd0))?8'd255:{1'b1,SEG5};assignHEX6=((bcd1[31:28]