频率计fpga,【My Project】数字频率测量FPGA实现

注:以前在**负责激光测速频率信号采集相关研究,今日整理资料时看到,近乎遗忘,共享了~
-----------------------------------------------------------------------------------------------------------------------------------
数字频率测量FPGA实现
SkySeraph May 24th 2010 HQU
Email:[email protected] QQ:452728574
Latest Modified Date:May 24th 2010 HQU
-----------------------------------------------------------------------------------------------------------------------------------
一 工具:Alter Quartus
语言:VerilogHDL
--------------------------------------------------------------------------------------------------------------------------------------二 相关原理
1 常用的测频方法[1]
① 利用电路的某种频率响应特性来测量频率,如谐振测频法[低频测量,应用较广]、电桥测频法[高频、微波段测量]
② 利用标准频率与测频进行比较来测量,精度取决于标准频率的准确度,如拍频法[低频]、示波器法[低频]、差频法[高频]
③ 电子计数测频法[适用于用数字电路实现]:直接测频法[测周期法和测频率法]和等精度测频法
2 频率测量的常用方法
直接测频法
原理:在一个单位时间t里计数被测信号的上升沿/下降沿的个数N。如t=1s,则被测信号频率为N Hz。
优点:过程简单,计算量少,计数的结果就是被测信号的频率
缺点:单位时间t的精确影响测量误差;计数个数存在±1的误差,其对低频影响较大,对高频影响较小。
缺点:整个测频范围内的测频精度是不同的。如闸门时间是1s时,测量100MHz的信号可达到10-8的测量精度,但测量10Hz的信号只能达到10-1的测量精度。[3]
适用:存在正负1误差,适合于高频
周期测频法
原理:测量被测信号连续两个上升沿/下降沿之间的时间间隔t,再求t的倒数。
或:在被测信号的一个周期里,计数标准信号的个数N,N*t(t为标准信号周期)即为被测信号的周期,1/N*t即为频率。
优点:测量时间快,最短只需被测信号的一个周期
缺点:需要求倒数/除法运算,存在误差;计数时间间隔存在±1的误差;这些误差对低频影响小,对高频影响大;当被测信号频率大于标准信号时,这种方法几乎不可以用
适用:适用于低频,当被测信号大于标准信号时,不适用。
等精度测频法
原理:对时间闸门信号用被测信号进行同步,达到减少正负1的误差。对低频信号尤其有效。
计算:标准时钟计数结果为Nt,频率为Fs,单位为Hz,则被测频率Ft = Fs*(Nt/Ns)
优点:在低频阶段比直接测频法有所改进,在测量频率比标准频率高时,精度不会提高。

3 等精度测频法原理
【My Project】数字频率测量FPGA实现频率计fpga
【My Project】数字频率测量FPGA实现频率计fpga
等精度测频方法是在直接测频方法的基础上发展起来的。如图1所示,它的闸门时间不是固定的值,而是被测信号周期的整数倍,即与被测信号同步,其实现方式可用图2来说明。图中,预置门控信号是为Tpr 的一个脉冲,CNT1和CNT2是两个可控计数器。标准频率信号从CNT1的时钟输入端CLK输入,其频率为fs 。经整形后的被测信号(频率为fx)从CNT2的时钟输入端CLK输入,当预置门信号为高电平(预置时间开始)时,被测信号的上升沿通过D触发器的Q端同时启动计数器CNT1和CNT2计数。CNT1和CNT2分别对被测信号(频率为fx)和标准频率信号(频率为fs)同时记数。同样,当预置门信号为低电平(预置时间结束)时,随后而至的被测信号的上升沿通过D触发器的输出端,同时关闭计数器的计数。设在一次预置门时间Tpr中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。则下式成立:
【My Project】数字频率测量FPGA实现频率计fpga
由此可推得:
【My Project】数字频率测量FPGA实现频率计fpga
等精度测频法具有三个特点:
(1)相对测量误差与被测频率的高低无关;
(2)增大Tpr或fs可以增大Ns,减少测量误差,提高测量精度;
(3)测量精度与预置门和标准频率有关,与被测信号的频率无关,在预置门和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的测量精度不变。
一种实现过程[7]
① 预设闸门模块:由标准时钟产生预设闸门信号。如标准时钟100us[10kHz],计数1000次,产生预设闸门信号为100ms
② 实际闸门模块:用被测信号来同步预设闸门模块产生的闸门信号来产生新的实际闸门信号,本质是一个D触发器
③ 计数模块:在实际闸门信号有效时,标准时钟和被测信号同时计数,在闸门信号结束时输出计数结果
④ 频率计算模块:由公式进行乘法和除法运算
直接计数测频法
测频法原理:在确定的闸门时间Tw内,记录被测信号的变化周期数或脉冲个数Nx,有fx=Nx/Tw [1]
测周期法原理:需要有标准信号频率fs,在待测信号的一个周期时间Tx内,记录标准频率的周期数Ns,有fx=fs/Ns [1]
最高测量频率为标准信号频率[个人总结]。
测量误差:两种方法都会产生±1个字的误差。最大误差为1/N,N为周期个数。[1]
直接计数测频法缺点:整个测频范围内的测频精度是不同的。如闸门时间是1s时,测量100MHz的信号可达到10-8的测量精度,但测量10Hz的信号只能达到10-1的测量精度。[3]
参考信号:测频法需要得到一个标准的脉宽,测周期法需要一个标准时钟。实际上标准的脉宽必须从一个标准时钟分频得到,而一般,标准始终是从外部晶振分频得到。[1]
测量时间:当计数周期为106个时,计数时间为1s[个人总结]
-------------------------------------------------------------------------------------------------------------------------------------------------------
三 实现
除法运算的Verilog实现(累加比较法)
【My Project】数字频率测量FPGA实现频率计fpga【My Project】数字频率测量FPGA实现频率计fpgaView Code 1 module mydiv(clk, dataa, datab, start, datac); 2 input clk; 3 input [7:0] dataa;//被除数 4 input [7:0] datab;//除数 5 input start;//开始新的运算 6 output [7:0] datac;//商 7 8 reg [7:0] datac; 9 reg [7:0] cbuf; 10 reg [7:0] temp; 11 12 always @(posedge clk) 13 begin 14 if(1'b1 == start) 15 begin 16 temp <= 8'd0; 17 cbuf <= 8'd0; 18 end 19 else if (dataa > temp) 20 begin 21 temp <= temp + datab; 22 cbuf <= cbuf + 8'h01; 23 end 24 else 25 begin 26 datac <= cbuf; 27 end 28 end 29 30 Endmodule

直接测频法
View Code 1 闸门产生模块/gateout输出1s,clk设为1ms 2 module gate(clk, gateout); 3 input clk; 4 output gateout; 5 6 reg [9:0] cnt; 7 reg gatebuf; 8 9 assign gateout = gatebuf; 10 11 always @(posedge clk) 12 begin 13 if (10'd999 == cnt) 14 begin 15 cnt <= 10'd0; 16 gatebuf <= ~gatebuf; //产生1s闸门 17 end 18 else 19 begin 20 cnt <= cnt + 10'd1; 21 end 22 end 23 24 endmodule 25 26 计数模块 27 说明:闸门信号高有效下进行计数,当闸门信号为低时停止计数并输出计数结果。采用5位十进制计数 28 module cnt(clk, gate, done, dtwo, dthree, dfour, dfive); 29 input clk; 30 input gate; 31 output done;//个位 32 output dtwo;//十位 33 output dthree;//百位 34 output dfour;//千位 35 output dfive;//万位 36 37 reg [3:0] done, dtwo, dthree, dfour, dfive; 38 reg [3:0] ddone, ddtwo, ddthree, ddfour, ddfive; 39 reg gatebuf; 40 41 always @(posedge clk) 42 begin 43 gatebuf <= gate; 44 end 45 46 always @(posedge clk) 47 begin 48 if((gatebuf == 1'b0) && (gate == 1'b1)) 49 begin 50 ddone <= 4'd1; 51 ddtwo <= 4'd0; 52 ddthree <= 4'd0; 53 ddfour <= 4'd0; 54 ddfive <= 4'd0; 55 end 56 else if((gatebuf == 1'b1) && (gate == 1'b0)) 57 begin 58 done <= ddone; 59 dtwo <= ddtwo; 60 dthree <= ddthree; 61 dfour <= ddfour; 62 dfive <= ddfive; 63 end 64 else if(gate == 1'b1) 65 begin 66 if (ddone == 4'd9) 67 begin 68 ddone <= 4'd0; 69 if (ddtwo == 4'd9) 70 begin 71 ddtwo <= 4'd0; 72 if (ddthree == 4'd9) 73 begin 74 ddthree <= 4'd0; 75 if (ddfour == 4'd9) 76 begin 77 ddfour <= 4'd0; 78 if (ddfive == 4'd9) 79 begin 80 ddfive <= 0; 81 end 82 else 83 begin 84 ddfive <= ddfive + 4'd1; 85 end 86 end 87 else 88 begin 89 ddfour <= ddfour + 4'd1; 90 end 91 end 92 else 93 begin 94 ddthree <= ddthree + 4'd1; 95 end 96 end 97 else 98 begin 99 ddtwo <= ddtwo + 4'd1; 100 end 101 end 102 else 103 begin 104 ddone <= ddone + 4'd1; 105 end 106 end 107 end 108 109 endmodule

周期测频法
View Code 1 计数模块 2 module periodcnt(clk, clkt, cntout,cntok); 3 input clk;//标准时钟信号 4 input clkt;//被测信号 5 6 output [19:0] cntout;//计数结果输出 7 output cntok;//计数结果输出标志 8 9 reg [19:0] cntout, cnt; 10 reg cntok, clktbuf; 11 12 always @(posedge clk) 13 begin 14 clktbuf <= clkt; 15 end 16 17 always @(posedge clk) 18 begin 19 if((clkt == 1'b1) && (clktbuf == 1'b0))//在被测信号上升沿输出计数结果并置计数为1 20 begin 21 cntout <= cnt; 22 cnt <= 20'd1; 23 cntok <= 1'b1; 24 end 25 else 26 begin 27 cnt <= cnt + 20'd1; 28 cntok <= 1'b0; 29 end 30 end 31 endmodule 32 33 除法运算模块 34 module perioddiv(clk, datab, start, datac); 35 input clk; 36 input [19:0] datab; 37 input start; 38 output [19:0] datac; 39 40 reg [19:0] dataa,datac, databbuf; 41 reg [19:0] cbuf; 42 reg [19:0] temp; 43 reg finish, cntflag; 44 45 always @(posedge clk) 46 begin 47 if((1'b1 == start) && (finish == 1'b0) && (datab != 20'd0)) 48 begin 49 dataa <= 1000000; 50 temp <= datab; 51 cbuf <= 20'd1; 52 databbuf <= datab; 53 cntflag <= 1'b1; 54 end 55 else if ((dataa > temp) && (cntflag == 1'b1) ) 56 begin 57 temp <= temp + databbuf; 58 cbuf <= cbuf + 20'd1; 59 finish <= 1'b1; 60 end 61 else 62 begin 63 datac <= cbuf; 64 finish <= 1'b0; 65 cntflag <= 1'b0; 66 end 67 end 68 69 endmodule

等精度测频法
1 预设闸门模块:由标准时钟计数产生 2 module pregate(clk, gateout); 3 input clk; 4 output gateout; 5 6 reg gateout, gatebuf; 7 reg [19:0] cnt; 8 9 always @(posedge clk) 10 begin 11 if (cnt == 20'd1000) 12 begin 13 gatebuf <= ~gatebuf; 14 gateout <= gatebuf; 15 cnt <= 20'd0; 16 end 17 else 18 begin 19 cnt <= cnt + 20'd1; 20 end 21 end 22 23 endmodule 24 25 实际闸门模块:由被测信号来同步预设闸门模块产生 26 module actgate(clk, gatein, gateout); 27 input clk; 28 input gatein; 29 output gateout; 30 31 reg gateout; 32 33 always @(posedge clk) 34 begin 35 gateout <= gatein; 36 end 37 38 endmodule 39 40 计数模块:在实际闸门信号有效时,标准时钟与被测信号同时进行计数;在闸门信号结束时输出计数结果 41 module cnt(clk, gate, cntout); 42 input clk; 43 input gate; 44 output [19:0] cntout ; 45 46 reg [19:0] cnt, cntout; 47 reg gatebuf; 48 49 always @(posedge clk) 50 begin 51 gatebuf <= gate; 52 end 53 54 always @(posedge clk) 55 begin 56 if((gate == 1'b1) && (gatebuf == 1'b0)) 57 begin 58 cnt <= 20'd1; 59 end 60 else if((gate == 1'b0) && (gatebuf == 1'b1)) 61 begin 62 cntout <= cnt; 63 end 64 else if(gatebuf == 1'b1) 65 begin 66 cnt <= cnt + 20'd1; 67 end 68 end 69 endmodule 70 71 频率计数模块:根据公式计算 72 module frediv(clk, datat,datas, freout); 73 input clk; 74 input [19:0] datat; 75 input [19:0] datas; 76 77 output [19:0] freout; 78 79 reg [19:0] datam,freout, databbuf; 80 reg [19:0] cbuf; 81 reg [19:0] temp; 82 reg finish, cntflag; 83 84 always @(posedge clk) 85 begin 86 if((finish == 1'b0) && (datas != 20'd0) && (datat != 20'd0)) 87 begin 88 datam <= 20'd10000 * datat; 89 temp <= datas; 90 cbuf <= 20'd1; 91 databbuf <= datas; 92 cntflag <= 1'b1; 93 finish <= 1'b1; 94 end 95 else if ((datam > temp) && (cntflag == 1'b1) ) 96 begin 97 temp <= temp + databbuf; 98 cbuf <= cbuf + 20'd1; 99 100 end 101 else 102 begin 103 freout <= cbuf; 104 finish <= 1'b0; 105 cntflag <= 1'b0; 106 end 107 end 108 109 endmodule
-------------------------------------------------------------------------------------------------------------------------------------------------------
参考资料
[1]求是科技.CPLD/FPGA应用开发设计与工程实践.北京:人民邮电出版社[M],2005.1
[2]王金名,冷自强.EDA技术与Verilog设计[M].北京:科学出版社,2008.4
[3]杨晓慧,杨旭.FPGA系统设计与实例[M].北京:人民邮电出版社,2010.1
[4]PPT:采用等精度测频原理的频率计
[5]王刚,张潋.基于FPGA的SOPC嵌入式系统设计与典型实例[M].北京:电子工业出版社社,2009.1
[6]叶舒亚.基于FPGA的便携式振动频谱分析仪的设计[D].成都理工大学硕士论文,2007.5
[7]刘福奇,刘波.VerilogHDL应用程序设计实例精讲[M].电子工业出版社,2009.10
[8]常晓明等.VerilogHDL语言编程[M].北京航天航空出版社,2005.8
[9]王彦.基于FPGA的工程设计与应用[M].西安:西安电子科技大学出版社,2007.5
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Author: SKySeraph
Email/GTalk: [email protected] QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Tags:  数字频率计设计 数字频率计 fpga数字钟 频率计fpga

延伸阅读

最新评论

发表评论