【My Project】数字频率测量FPGA实现
注:以前在**負責激光測速頻率信號采集相關研究,今日整理資料時看到,近乎遺忘,共享了~
-------------------------------------------------------------------------------------------------------------------------------
數字頻率測量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的倒數。 或:在被測信號的一個周期里,計數標準信號的個數N,N*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設為1ms2 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: zgzhaobo@gmail.com ???QQ:452728574
From:???????? http://www.cnblogs.com/skyseraph/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
?-------------------------------------------------------------------------------------------------------------------------------
?
?
轉載于:https://www.cnblogs.com/skyseraph/archive/2011/06/30/2095039.html
總結
以上是生活随笔為你收集整理的【My Project】数字频率测量FPGA实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随即产生验证码
- 下一篇: JDK7新特性简单翻译介绍