注:以前在**负责激光测速频率信号采集相关研究,今日整理资料时看到,近乎遗忘,共享了~

-----------------------------------------------------------------------------------------------------------------------------------

数字频率测量FPGA实现

SkySeraph May 24th 2010  HQU

Email:zgzhaobo@gmail.com    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的倒数。

在被测信号的一个周期里,计数标准信号的个数NN*t(t为标准信号周期)即为被测信号的周期,1/N*t即为频率

优点:测量时间快,最短只需被测信号的一个周期

缺点:需要求倒数/除法运算,存在误差;计数时间间隔存在±1的误差;这些误差对低频影响小,对高频影响大;当被测信号频率大于标准信号时,这种方法几乎不可以用

适用:适用于低频,当被测信号大于标准信号时,不适用

等精度测频法

原理:对时间闸门信号用被测信号进行同步,达到减少正负1的误差。对低频信号尤其有效。

计算:标准时钟计数结果为Nt,频率为Fs,单位为Hz,则被测频率Ft = Fs*(Nt/Ns)

优点在低频阶段比直接测频法有所改进,在测量频率比标准频率高时,精度不会提高

3  等精度测频法原理

 等精度测频方法是在直接测频方法的基础上发展起来的。如图1所示,它的闸门时间不是固定的值,而是被测信号周期的整数倍,即与被测信号同步,其实现方式可用图2来说明。图中,预置门控信号是为Tpr 的一个脉冲,CNT1和CNT2是两个可控计数器。标准频率信号从CNT1的时钟输入端CLK输入,其频率为fs 。经整形后的被测信号(频率为fx)从CNT2的时钟输入端CLK输入,当预置门信号为高电平(预置时间开始)时,被测信号的上升沿通过D触发器的Q端同时启动计数器CNT1和CNT2计数。CNT1和CNT2分别对被测信号(频率为fx)和标准频率信号(频率为fs)同时记数。同样,当预置门信号为低电平(预置时间结束)时,随后而至的被测信号的上升沿通过D触发器的输出端,同时关闭计数器的计数。设在一次预置门时间Tpr中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。则下式成立:

 

由此可推得:

 

等精度测频法具有三个特点:

(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实现(累加比较法)

View 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]王刚,张潋.基于FPGASOPC嵌入式系统设计与典型实例[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: zgzhaobo@gmail.com    QQ:452728574

From:         http://www.cnblogs.com/skyseraph/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的 

--------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

作者: SkySeraph 发表于 2011-06-30 22:02 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"