【My Project】数字频率测量FPGA实现
注:以前在**負(fù)責(zé)激光測速頻率信號采集相關(guān)研究,今日整理資料時看到,近乎遺忘,共享了~
-------------------------------------------------------------------------------------------------------------------------------
數(shù)字頻率測量FPGA實現(xiàn)
SkySeraph?May 24th 2010? HQU
Email:zgzhaobo@gmail.com? ? QQ:452728574
Latest Modified Date:May 24th 2010?HQU
-------------------------------------------------------------------------------------------------------------------------------
一??? 工具:Alter Quartus
?????? 語言:VerilogHDL
??
-------------------------------------------------------------------------------------------------------------------------------二?? 相關(guān)原理
1? 常用的測頻方法[1]
①? 利用電路的某種頻率響應(yīng)特性來測量頻率,如諧振測頻法[低頻測量,應(yīng)用較廣]、電橋測頻法[高頻、微波段測量]
②? 利用標(biāo)準(zhǔn)頻率與測頻進(jìn)行比較來測量,精度取決于標(biāo)準(zhǔn)頻率的準(zhǔn)確度,如拍頻法[低頻]、示波器法[低頻]、差頻法[高頻]
③? 電子計數(shù)測頻法[適用于用數(shù)字電路實現(xiàn)]:直接測頻法[測周期法和測頻率法]和等精度測頻法
2? 頻率測量的常用方法
?
| 直接測頻法 | 原理:在一個單位時間t里計數(shù)被測信號的上升沿/下降沿的個數(shù)N。如t=1s,則被測信號頻率為N Hz。 優(yōu)點:過程簡單,計算量少,計數(shù)的結(jié)果就是被測信號的頻率 缺點:單位時間t的精確影響測量誤差;計數(shù)個數(shù)存在±1的誤差,其對低頻影響較大,對高頻影響較小。 缺點:整個測頻范圍內(nèi)的測頻精度是不同的。如閘門時間是1s時,測量100MHz的信號可達(dá)到10-8的測量精度,但測量10Hz的信號只能達(dá)到10-1的測量精度。[3] 適用:存在正負(fù)1誤差,適合于高頻 |
| 周期測頻法 | 原理:測量被測信號連續(xù)兩個上升沿/下降沿之間的時間間隔t,再求t的倒數(shù)。 或:在被測信號的一個周期里,計數(shù)標(biāo)準(zhǔn)信號的個數(shù)N,N*t(t為標(biāo)準(zhǔn)信號周期)即為被測信號的周期,1/N*t即為頻率。 優(yōu)點:測量時間快,最短只需被測信號的一個周期 缺點:需要求倒數(shù)/除法運算,存在誤差;計數(shù)時間間隔存在±1的誤差;這些誤差對低頻影響小,對高頻影響大;當(dāng)被測信號頻率大于標(biāo)準(zhǔn)信號時,這種方法幾乎不可以用 適用:適用于低頻,當(dāng)被測信號大于標(biāo)準(zhǔn)信號時,不適用。 |
| 等精度測頻法 | 原理:對時間閘門信號用被測信號進(jìn)行同步,達(dá)到減少正負(fù)1的誤差。對低頻信號尤其有效。 計算:標(biāo)準(zhǔn)時鐘計數(shù)結(jié)果為Nt,頻率為Fs,單位為Hz,則被測頻率Ft = Fs*(Nt/Ns) 優(yōu)點:在低頻階段比直接測頻法有所改進(jìn),在測量頻率比標(biāo)準(zhǔn)頻率高時,精度不會提高。 |
3? 等精度測頻法原理
?等精度測頻方法是在直接測頻方法的基礎(chǔ)上發(fā)展起來的。如圖1所示,它的閘門時間不是固定的值,而是被測信號周期的整數(shù)倍,即與被測信號同步,其實現(xiàn)方式可用圖2來說明。圖中,預(yù)置門控信號是為Tpr 的一個脈沖,CNT1和CNT2是兩個可控計數(shù)器。標(biāo)準(zhǔn)頻率信號從CNT1的時鐘輸入端CLK輸入,其頻率為fs 。經(jīng)整形后的被測信號(頻率為fx)從CNT2的時鐘輸入端CLK輸入,當(dāng)預(yù)置門信號為高電平(預(yù)置時間開始)時,被測信號的上升沿通過D觸發(fā)器的Q端同時啟動計數(shù)器CNT1和CNT2計數(shù)。CNT1和CNT2分別對被測信號(頻率為fx)和標(biāo)準(zhǔn)頻率信號(頻率為fs)同時記數(shù)。同樣,當(dāng)預(yù)置門信號為低電平(預(yù)置時間結(jié)束)時,隨后而至的被測信號的上升沿通過D觸發(fā)器的輸出端,同時關(guān)閉計數(shù)器的計數(shù)。設(shè)在一次預(yù)置門時間Tpr中計數(shù)器對被測信號的計數(shù)值為Nx,對標(biāo)準(zhǔn)信號的計數(shù)值為Ns。則下式成立:
?
由此可推得:
?
等精度測頻法具有三個特點:
(1)相對測量誤差與被測頻率的高低無關(guān);
(2)增大Tpr或fs可以增大Ns,減少測量誤差,提高測量精度;
(3)測量精度與預(yù)置門和標(biāo)準(zhǔn)頻率有關(guān),與被測信號的頻率無關(guān),在預(yù)置門和常規(guī)測頻閘門時間相同而被測信號頻率不同的情況下,等精度測量法的測量精度不變。
一種實現(xiàn)過程[7]
①? 預(yù)設(shè)閘門模塊:由標(biāo)準(zhǔn)時鐘產(chǎn)生預(yù)設(shè)閘門信號。如標(biāo)準(zhǔn)時鐘100us[10kHz],計數(shù)1000次,產(chǎn)生預(yù)設(shè)閘門信號為100ms
②? 實際閘門模塊:用被測信號來同步預(yù)設(shè)閘門模塊產(chǎn)生的閘門信號來產(chǎn)生新的實際閘門信號,本質(zhì)是一個D觸發(fā)器
③? 計數(shù)模塊:在實際閘門信號有效時,標(biāo)準(zhǔn)時鐘和被測信號同時計數(shù),在閘門信號結(jié)束時輸出計數(shù)結(jié)果
④? 頻率計算模塊:由公式進(jìn)行乘法和除法運算
直接計數(shù)測頻法
測頻法原理:在確定的閘門時間Tw內(nèi),記錄被測信號的變化周期數(shù)或脈沖個數(shù)Nx,有fx=Nx/Tw? [1]
測周期法原理:需要有標(biāo)準(zhǔn)信號頻率fs,在待測信號的一個周期時間Tx內(nèi),記錄標(biāo)準(zhǔn)頻率的周期數(shù)Ns,有fx=fs/Ns [1]
最高測量頻率為標(biāo)準(zhǔn)信號頻率[個人總結(jié)]。
測量誤差:兩種方法都會產(chǎn)生±1個字的誤差。最大誤差為1/N,N為周期個數(shù)。[1]
直接計數(shù)測頻法缺點:整個測頻范圍內(nèi)的測頻精度是不同的。如閘門時間是1s時,測量100MHz的信號可達(dá)到10-8的測量精度,但測量10Hz的信號只能達(dá)到10-1的測量精度。[3]
參考信號:測頻法需要得到一個標(biāo)準(zhǔn)的脈寬,測周期法需要一個標(biāo)準(zhǔn)時鐘。實際上標(biāo)準(zhǔn)的脈寬必須從一個標(biāo)準(zhǔn)時鐘分頻得到,而一般,標(biāo)準(zhǔn)始終是從外部晶振分頻得到。[1]
測量時間:當(dāng)計數(shù)周期為106個時,計數(shù)時間為1s[個人總結(jié)]
-------------------------------------------------------------------------------------------------------------------------------------------------
三 實現(xiàn)
除法運算的Verilog實現(xiàn)(累加比較法)
View Code 1 module mydiv(clk, dataa, datab, start, datac);2 ?input clk;
3 input [7:0] dataa;//被除數(shù)
4 input [7:0] datab;//除數(shù)
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 閘門產(chǎn)生模塊/gateout輸出1s,clk設(shè)為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; //產(chǎn)生1s閘門
17 end
18 else
19 begin
20 cnt <= cnt + 10'd1;
21 end
22 end
23
24 endmodule
25
26 計數(shù)模塊
27 說明:閘門信號高有效下進(jìn)行計數(shù),當(dāng)閘門信號為低時停止計數(shù)并輸出計數(shù)結(jié)果。采用5位十進(jìn)制計數(shù)
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 計數(shù)模塊2 module periodcnt(clk, clkt, cntout,cntok);
3 input clk;//標(biāo)準(zhǔn)時鐘信號
4 input clkt;//被測信號
5
6 output [19:0] cntout;//計數(shù)結(jié)果輸出
7 output cntok;//計數(shù)結(jié)果輸出標(biāo)志
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))//在被測信號上升沿輸出計數(shù)結(jié)果并置計數(shù)為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 預(yù)設(shè)閘門模塊:由標(biāo)準(zhǔn)時鐘計數(shù)產(chǎn)生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 實際閘門模塊:由被測信號來同步預(yù)設(shè)閘門模塊產(chǎn)生
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 計數(shù)模塊:在實際閘門信號有效時,標(biāo)準(zhǔn)時鐘與被測信號同時進(jìn)行計數(shù);在閘門信號結(jié)束時輸出計數(shù)結(jié)果
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 頻率計數(shù)模塊:根據(jù)公式計算
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應(yīng)用開發(fā)設(shè)計與工程實踐.北京:人民郵電出版社[M],2005.1
[2]王金名,冷自強(qiáng).EDA技術(shù)與Verilog設(shè)計[M].北京:科學(xué)出版社,2008.4
[3]楊曉慧,楊旭.FPGA系統(tǒng)設(shè)計與實例[M].北京:人民郵電出版社,2010.1
[4]PPT:采用等精度測頻原理的頻率計
[5]王剛,張瀲.基于FPGA的SOPC嵌入式系統(tǒng)設(shè)計與典型實例[M].北京:電子工業(yè)出版社社,2009.1
[6]葉舒亞.基于FPGA的便攜式振動頻譜分析儀的設(shè)計[D].成都理工大學(xué)碩士論文,2007.5
[7]劉福奇,劉波.VerilogHDL應(yīng)用程序設(shè)計實例精講[M].電子工業(yè)出版社,2009.10
[8]常曉明等.VerilogHDL語言編程[M].北京航天航空出版社,2005.8
[9]王彥.基于FPGA的工程設(shè)計與應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2007.5
-------------------------------------------------------------------------------------------------------------------------------
Author:???????? SKySeraph
Email/GTalk: zgzhaobo@gmail.com ???QQ:452728574
From:???????? http://www.cnblogs.com/skyseraph/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利.
?-------------------------------------------------------------------------------------------------------------------------------
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/skyseraph/archive/2011/06/30/2095039.html
總結(jié)
以上是生活随笔為你收集整理的【My Project】数字频率测量FPGA实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随即产生验证码
- 下一篇: window.open参数完全手册