基于FPGA的数字频率计的设计课案.docx
《基于FPGA的数字频率计的设计课案.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字频率计的设计课案.docx(36页珍藏版)》请在冰点文库上搜索。
![基于FPGA的数字频率计的设计课案.docx](https://file1.bingdoc.com/fileroot1/2023-7/14/e5c735cc-7d03-4730-944d-9d91f3c0ad54/e5c735cc-7d03-4730-944d-9d91f3c0ad541.gif)
基于FPGA的数字频率计的设计课案
基于FPGA的数字频率计的设计
学生专业:
学生姓名:
指导教师:
摘要
数字频率计是近代电子技术领域的重要测量工具之一,同时也是其它许多领域广泛应用的测量仪器。
它在规定的基准时间内把测量的脉冲数记录下来,换算成频率并以数字形式显示出来。
在许多测量方案以及测量结果中都会涉及到频率测量的相关问题,频率精确测量的重要性显而易见。
本设计在了解频率计的基本原理的基础上,基于直接测频法的测试手段,即在一定闸门时间内测量被测信号的脉冲个数;设计频率计的测量范围为1Hz-99.99MHz。
将设计分为六个模块,即顶层模块,分频模块,计数模块,单位选择模块,数码管位选模块,转换模块。
采用硬件描述语言VerilogHDL编写了各个模块的代码,并且利用QuartusII软件平台进行了功能的仿真,从而完成输入被测频率,通过选择不同档位,精确输出测量值,达到了预期目标。
关键词数字频率计;直接测频法;VerilogHDL;QuartusII
Abstract
Digitalfrequencymetermodernelectronictechnologyisoneoftheimportantmeasurementtoolsandotherareaswidelyusedmeasuringinstrument.Itstipulatedinthebenchmarktimetomeasurethenumberofpulsesrecording,theconversionintofrequencyanddisplayedindigitalform.Inmanysurveyschemeandmeasurementresultsinvolvefrequencymeasurementsofrelatedproblems,theimportanceofaccuratemeasurementoffrequencyisobvious.
Thisdesigninunderstandingthebasicprincipleofthefrequencymeter,onthebasisofdirectfrequencymeasurementmethodbasedonthemeanstesting,thatis,inacertaingatetimemeasurementofthemeasuredsignalpulsenumber;Designthefrequencymetermeasuringrangeof1Hz-99.99MHz.Willdesignisdividedintosixparts,atop-levelmodule,pointsfrequencymodules,countmodule,theunitchoosemodule,digitaltubeachosenmodule,conversionmodule
ThehardwaredescriptionlanguageVerilogHDLwriteeachmoduleofthecode,andmakeuseofQuartusIIsoftwareplatformfunctionsofthesimulation.Thenmeasuredinputfrequency,bychoosingdifferentrank,preciseoutputmeasuredvalues,andreachtheexpectedgoal.
KeywordsDigitalfrequencyplan;Directfrequencymeasurementmethod;VerilogHDL;QuartusII
CONTENTS
第1章绪论
1.1课题背景和意义
随着数字电路应用越来越广泛,传统的通用数字集成电路芯片已经很难满足系统功能的要求,而且随着系统复杂程度的不断增加,所需通用集成电路的数量呈爆炸性增长,使得电路板的体积迅速膨胀,系统可靠性难以保证[1]。
此外,现代电子产品的生命周期都很短,一个电路可能要在很短的时间内作改进以满足新的功能要求,对于通用集成电路来说则意味着重新设计和重新布线。
而可编程逻辑器件克服了上述缺点,它把通用集成电路通过编程集成到一块尺寸很小的硅片上,成倍缩小了电路的体积,同时由于走线短,减少了干扰,提高了系统的可靠性[2]。
频率计在电子产品开发中也是广受重视的领域。
很多厂家根据各种实际应用需要开发出了很多不同性能、不同档次的各类频率计产品[3]。
产品的不断更新换代也促进了相关频率测量理论和频率计开发技术的不断进步。
在高校相关专业,频率理论也是非常重要的教学内容[4]。
在基础实验中,利用频率测量器件进行信号频率的测量更是必备基本操作技能之一。
在开发性和综合性实验中,利用各种手段进行频率计的设计和开发也是一个重要课题[5]。
1.2国内外发展情况
电子计数器是其它数字化仪器的基础,在它的输入通道接入各种模-数变换器,再利用相应的换能器便可制成各种数字化仪器。
电子计数器的优点是测量精度高、量程宽、功能多、操作简单、测量速度快、直接显示数字,而且易于实现测量过程自动化,在工业生产和科学实验中得到广泛应用[6]。
它的主要实现方法有直接式、锁相式、直接数字式和混合式四种。
直接式的优点是速度快、相位噪声低,但结构复杂、杂散多,一般只应用在地面雷达中[7]。
锁相式和直接数字式都同时具有容易实现产品系列化、小型化、模块化和工程化的特点,其中,锁相式更是以其容易实现相位同步的自动控制且低功耗的特点成为众多业内人士的首选,应用最为广泛[8]。
频率计的发展也经历了从模拟到数字,从分立到集成、单片机(如美国Intersil公司研发的ICM7216D)、再到可编程逻辑器件(CPLD和FPGA)的漫长发展过程[9]。
我国利用相检宽带测频技术设计的高精度频率计也非常具有突破性和实用性。
如我国的XDU-17型高分辨频率计。
在2005年我国还研制出了中国模拟测振仪,它采用通用微机,通过“东方科卡”和“DASP”、“PDB”等大型软件实现的“PC卡泰”——微机卡式自动检测分析仪器,是专门设计的集数据采集,信号处理,故障诊断,模态分析,桩基检测,噪声与声强测量,动力学修改和响应计算等多种功能于一体的独创性产品[10]。
实现手段的进步使得频率计的性能、功能、性价比、可靠性等指标不断提高。
目前频率计主要靠以下三个电路进行设计[11]:
(1)基于分立器件的模拟电路实现:
即采用传统分立器件自下而上设计实现,这种方法在电子技术发展的早期采用较多。
(2)基于单片机的数字电路实现:
即以技术及应用都非常成熟的单片机为核心控制部件加上中规模集成数字器件来实现。
(3)基于可编程逻辑器件的数字电路实现:
即除了脉冲整形、键盘输入和显示等少部分电路外,频率计其余主要电路都用可编程逻辑器件来实现。
第2章频率计测量原理及VerilogHDL概述
2.1数字频率计测量原理
为了准确测量频率,人们研究出了很多方法。
频率测量的准确度主要取决于所测量的频率范围和被测对象的特点。
而测量所能达到的精度,既取决于基准频率源的精度,也取决于所使用的测量设备和测量方法[12]。
下面介绍几种常用频率测量方法,分析各自优缺点。
2.1.1直接计数测频法
目前广泛使用的直接测频法则适合于数字电路实现,该方法是根据频率的定义,记下单位时间内周期信号的重复次数,因此又称为电子计数器测频法[13]。
其中最基本方法是直接计数测频法,它又包括以下2种主要测量方法:
1.直接测频法
又称M法,其测频原理如图2-1所示。
其基本原理是选用一个频率较低的标准频率信号作为闸门信号,而将被测较高频率信号作为填充脉冲,在确定的闸门时间T内,记录被测信号的变化周期数N,则可知被测信号的频率为:
(2-1)
图2-1直接测频法原理
误差分析:
此法测量误差主要取决于闸门时间T和计数器计数的准确度,因此总误差可用分项误差绝对值线性相加表示:
(2-2)
式中,
是最大量化误差的相对值,它的产生是由于测频时,闸门的开启时刻与被测计数脉冲的时间关系不相关造成的,即在相同的闸门开启时间内,计数器所得的数并不一定相同[14]。
当闸门时间开启时间T接近甚至等于被测信号周期TX的整数倍时,最大量化误差为ΔN=±1个数。
为闸门时间相对误差,主要由时基电路标准频率的准确度决定[15]。
通常,对闸门时间准确度
的要求是根据所要求的测频准确度而提出的,为了使闸门时间频率误差不对测量结果产生影响,标准频率的准确度应高于被测信号准确度至少1个数量级,即
。
因此,测量较高的信号频率时,如果f0一定,闸门时间T越长,测量准确度越高;反之当T选定后,
越高,±1个计数误差对测量结果的影响越小,测量准确度越高。
根据以上介绍和分析可知直接测频法比较适合于高频信号的测量[16]。
2.直接测周期法
又称T法,其测频原理如图2-2所示。
其基本原理是选被测信号作为闸门信号,而将频率较高的标准频率信号作为填充脉冲进行计数。
设标准频率信号的频率为f0,在一个闸门时间计数值为N,则被测信号的频率为:
(2-3)
图2-2直接测周期法原理
综上可知,直接计数测频法(包括直接测频法和直接测周期法)的优点是原理简单、测量方便、读数直接,能够在比极宽的频率范围内进行测量[17]。
缺点是由于存在对被测信号或标频信号计数的±1个数字误差,难以兼顾低频和高频实现等精度测量,所以总体来说测量精度较低。
2.1.2等精度测频法
等精度测频法(M/T法),又叫多周期同步测频法,是在直接计数测频法基础上发展起来的,在目前的测频系统中应用比较广泛[18]。
其测量原理波形如图2-3所示,测量原理框图如图2-4所示。
该法同时具有M法和T法的优点,它通过测量被测信号数个周期的标频计数次数,然后换算得出被测信号的频率,可兼顾低频与高频信号,提高了测量精度[19]。
图2-3等精度测频法原理波形
图2-4等精度测频法原理框图
测量时,首先预置闸门信号开启,此时计时器并不计数。
待被测脉冲信号上升沿到来时,触发器被触发输出计数使能信号(即实际闸门)[20]。
此时,count1对标准信号进行计数,count2对被测信号计数。
预置闸门信号关闭时,计数器并不立即停止计数,而是等到被测信号上升沿到来时才停止计数,从而实现了实际闸门信号与被测信号的同步,消除了由于被测信号产生的最大±1个计数误差[21]。
2.1.3全同步测频法
在全同步测频法中,闸门信号不仅与被测信号同步,而且与标准时钟也同步,实现三者真正的全同步,从而彻底消除了由被测信号或者标频信号计数引起的量化误差,大大提高了测量精确度。
其测量原理波形如图2-5所示,测量原理系统框图如图2-6所示。
图2-5全同步测频原理波形
图2-6全同步测频原理系统框图
被测频率与标准时钟分别送给脉冲同步检测电路与两个计数器,当脉冲
同步检测电路检测到被测频率与标准时钟相位同步时,脉冲同步检测电路发出同步信号,2个计数器开始计数,当脉冲同步检测电路再次检测到同步信号时,又发出同步信号,计数器停止计数。
同时计数器的计数值锁存到锁存器,时序乘法器从锁存器中取得被测频率的计数值与标准时钟频率进行乘法运算,然后再将乘法器运算所得的值与标准时钟的计数值送给除法器,乘法器的结果为被除数,标准时钟的计数值为除数,运算所得结果就是被测信号的频率[22]。
由以上介绍和分析可知,经过长期的发展,数字频率计的测量方法已经比较丰富和成熟。
由于直接计数测频法有着设计简单,并且它是所有测量方法的基础,有着比较成熟的理论,可参考资料也较多。
所以本文采用直接计数测频法中的直接测频进行的设计。
2.2VerilogHDL概述
2.2.1VerilogHDL介绍
VerilogHDL是一种硬件描述语言(hardwaredescriptionlanguage),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。
Verilog的设计者想要以C程序语言(en:
Cprogramminglanguage)为基础C程序语言(en:
Cprogramminglanguage)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。
事实上,它产生与C程序语言类似的不严谨性质,并且大概与Pascal很相像。
这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线性(循序)执行。
Verilog模式包含不同模组(modules)的阶层关系。
模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。
在每个模组中有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。
并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。
在每个区块(blocks)内,使用begin和end的关键字来区隔开来,其中的叙述是循序被执行。
但是同一个设计,不同的区块间的执行是平行的[23]。
2.2.2VerilogHDL程序开发流程
1.文本编辑:
用任何文本编辑器都可以进行,也可以用专用的HDL编辑器进行编辑。
通常Verilog文件保存为.v文件。
2.功能仿真:
将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真)。
3.逻辑综合:
将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。
逻辑综合软件会生成.edf(edif)的EDA工业标准文件。
4.布局布线:
将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到PLD/FPGA内。
5.时序仿真:
需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。
6.编程下载:
确认仿真无误后,将文件下载到芯片中[24]。
2.3本章小结
本章主要的介绍了数字频率计的三种测量方法,分别为:
直接测量,等精度测量,全同步测量,并且在第二部分对VerilogHDL语言进行了简单的介绍。
第3章数字频率计模块设计
3.1数字频率计设计指标
该频率计有三个输入信号fre_in,clk_50k,rstn其中clk_50k脚输入标准的50KHz方波信号,作为参考时钟fre_in为信号输入端,被测信号频率从这里送入,rstn为系统复位端,上电时该引脚需要保持一端时间低电平。
该系统输出脚为a,b,c,d,e,f,g,unit,led_sel。
a,b,c,d,e,f,g为数码管译码输出。
unit表示当前显示数值的单位,可为1Hz,10Hz,100Hz,1kHz,10kHz。
led_sel为数码管位选信号。
该频率计测量范围为1Hz-99.99MHz,可根据输入信号频率自动调整显示数值的单位为合适的数值,并通过unit端口告知用户读数的单位。
本课题的数字频率计顶层RTL硬件电路图如图3-1所示。
图3-1顶层RTL硬件电路图
3.2数字频率计各个模块
3.2.1顶层模块fre_counter
顶层模块为本课题的最上层模块,由它来例化整个程序,把其它分开的小模块进行整合。
其电路原理图如图3-2所示。
图3-2顶层模块原理图
根据模块实现的功能设计VerilogHDL源代码如下:
modulefre_counter(clk_50k,fre_in,rstn,led_sel,unit,
a,b,c,d,e,f,g);
inputclk_50k,fre_in,rstn;
output[1:
0]led_sel;
output[2:
0]unit;
outputa,b,c,d,e,f,g;
wirediv_10,div_100,div_1000,div_10000,div_100000;
clk_genpart_clk_gen(.rstn(rstn),.clk(clk_50k),.div_10(div_10),
.div_100(div_100),.div_1000(div_1000),.div_10000(div_10000),.div_100000(div_100000));
reggate;
wire[3:
0]count_a,count_b,count_c,count_d;
count_4unitspart_count(.clk(fre_in),.gate(gate),.out_a(count_a),
.out_b(count_b),.out_c(count_c),.out_d(count_d));
reg[2:
0]gate_sel;
assignunit=gate_sel;
wireunit_H;
regunit_L;
always@(negedgecount_a[3]ornegedgegate)
if(!
gate)unit_L<=1'b0;
elseunit_L<=1'b1;
assignunit_H=((count_a==4'd0)&&(count_b==4'd0)&&(count_c==4'd0)&&(count_d==4'd0));
always@(negedgegateornegedgerstn)
begin
if(!
rstn)gate_sel<=3'd0;
elseif(unit_L&&(gate_sel!
=3'd4))gate_sel<=gate_sel+3'd1;
elseif(unit_H&&(gate_sel!
=3'd0))gate_sel<=gate_sel-3'd1;
elsegate_sel<=gate_sel;
end
always@(gate_selordiv_10ordiv_100ordiv_1000ordiv_10000ordiv_100000)
begin
case(gate_sel)
3'd0:
gate=div_100000;
3'd1:
gate=div_10000;
3'd2:
gate=div_1000;
3'd3:
gate=div_100;
3'd4:
gate=div_10;
default:
gate=div_100000;
endcase
end
wired_n0_a,d_n0_b,d_n0_c,d_n0_d;
wirea,b,c,d,e,f,g;
wiretrans_ena_a,trans_ena_b,trans_ena_c,trans_ena_d;
wireena_a,ena_b,ena_c,ena_d;
wireclk_lock;
assignclk_lock=~gate;
transformpart_tran_a(.d_n0(d_n0_a),.din(count_a),.clk_lock(clk_lock),
.ena(trans_ena_a),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));
transformpart_tran_b(.d_n0(d_n0_b),.din(count_b),.clk_lock(clk_lock),
.ena(trans_ena_b),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));
transformpart_tran_c(.d_n0(d_n0_c),.din(count_c),.clk_lock(clk_lock),
.ena(trans_ena_c),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));
transformpart_tran_d(.d_n0(d_n0_d),.din(count_d),.clk_lock(clk_lock),
.ena(trans_ena_d),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));
wireclk_ledc;
assignclk_ledc=div_1000;
led_selpart_led_sel(.rstn(rstn),.clk_ledc(clk_ledc),
.led_ena({ena_a,ena_b,ena_c,ena_d}),.led_count(led_sel));
assigntrans_ena_a=ena_a&d_n0_a;
assigntrans_ena_b=ena_b&(d_n0_b|d_n0_a);
assigntrans_ena_c=(d_n0_c|d_n0_b|d_n0_a)&ena_c;
assigntrans_ena_d=ena_d;
endmodule
以上程序把clk_gen,count_4units,transform和led_sel这几个模块连起来进行了整个程序的整合。
3.2.2分频模块clk_gen
这个模块主要是对给的总频率50khz进行了5次分频,通过这5个不同的频率来完成档位的自动转换。
分频模块的电路原理图如图3-3所示。
图3-3分频模块原理图
根据模块实现的功能设计VerilogHDL部分源代码如下:
always@(posedgeclkornegedgerstn)
begin
if(!
rstn)count1<=3'd0;
elseif(count1==3'd4)count1<=3'd0;
elsecount1<=count1+3'd1;
end
regd1;
always@(posedgecount1[2]ornegedgerstn)
begin
if(!
rstn)d1<=1'd0;
elsed1<=~d1;
end
assigndiv_10=d1;
reg[2:
0]count2;
always@(posedged1ornegedgerstn)
begin
if(!
rstn)count2<=3'd0;
elseif(count2==3'd4)count2<=3'd0;
elsecount2<=count2+3'd1;
end
其中,div_10是把输入的clk_10分频,为了得到占空比50%的方波,我先把它5分频,再2分频。
count1==3'd4,是因为count1有0,1,2,3,4。
这5个状态,d1用于2分频。
若输入的clk信号为50khz则div_100000的高电平持续时间为1S,用这个作为计数器的gate信号,计数器在1S内对fre_in脚信号的脉冲进行计数,所以输出的值单位为Hz。
例如若当前是div_100000信号(高电平1S),检测到计数器溢出,说明输入频率大于9999Hz,显示的数据并不准确,于是选择div_10000(高电平0.1S),显示计数单位为10Hz,若仍然检测到溢出,就选择div_1000(高电平0.01s)。
3.2.3计数模块count
这个模块是一个十进制计数器,计数范围为0-9,count对输入的clk进行加法计数,当计数到9及4'b1001时,下一个clk脉冲来时