基于FPGA等精度的实时测量频率和占空比
目錄
一、要求:
二、指標要求?
三、?等精度測頻設計原理
四、時序分析:?
五、模塊設計?
1、計數器
2、讀數據
3、數據處理
4、數碼管顯示模塊
六、仿真分析
1、計數模塊
A、測量1Mhz頻率占空比為50%的信號的頻率。
?B、Em設置為1Mhz,占空比為46%的信號的占空比
2、數據處理模塊
3、總體仿真?
七、實測展示
?八、說明
一、要求:
????????利用Altera公司的FPGA開發軟件Quartus 13.1采用混合設計實現方波信號頻率和占空比測量。?
二、指標要求?
1) 待測方波信號頻率范圍1Hz~1MHz,測量精度優于0.1Hz
2) 待測方波信號占空比范圍1%~95%,測量精度優于1%
3) 頻率數據顯示精度0.1Hz,給出8位數字的BCD碼結果
4) 占空比給出2位整數百分比的BCD碼結果
三、?等精度測頻設計原理
?設計原理流程圖如圖 1:
圖 1設計原理流程圖?
?????????將在相同時間內對被測信號和標準信號同時計數 ,D觸發器保證實際閘門時間與被測信號同步,消除被測信號計數誤差;讀數據模塊兩個技術模塊數據同時讀入送進數據處理模塊處理;數據處理模塊將讀入的數據計算出頻率與占空比后送入顯示模塊;顯示模塊將頻率與占空比顯示在數碼管上。
等精度測頻率原理:
????????等精度測頻法本質上是多周期同步測頻,它是在直接測頻基礎上發展起來的,在目前的測頻系統中得到了越來越廣泛的應用。等精度測頻時,同時對標準信號和待測信號計數,而且實際閘門時間不是固定的,而是被測信號的整數倍,即與被測信號保持同步,因此消除了對被測信號計數所產生的士1個數字誤差,使測量精度大為提高。
四、時序分析:?
?????????如圖 2所示,Tx待測型號在Cl的預置閘門信號期間進行采樣計數,使得在En為高時Tx總是整數倍出現。?
圖 2時序分析圖?
????????設在一次實際閘門時間τ中計數器對被測信號的計數值為Nx,對標準信號的計數值為Ns。標準信號的頻率為fs,則被測信號的頻率為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?fx=(Nx/Ns)·fs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)? ? ? ? ?
五、模塊設計?
????????如圖 3所示,計數器模塊同時計數頻率Ns、Nx值與占空比Nh值,數值傳給數據處理模塊,由數據模塊switch信號切換顯示數據的不同位,數值傳給數碼管顯示模塊顯示。
????????由一個D觸發器實現預置閘門與待測信號的同步,觸發信號為Tx,后面四個D觸發器為讀信號和清零信號延時,由50Mhz標準信號觸發,延時兩個標準信號單元為Read信號,延時四個標準單元為clr信號;復位信號控制五個D觸發器的使能信號。
?
圖 3系統總體設計圖?
?模塊代碼展示:
1、計數器
頻率計數器:
module counter(clk,En,clr,tsq); input clk,clr,En; output reg [27:0]tsq; always@(posedge clk or negedge clr) beginif(!clr)begintsq<=28'b0;endelsebeginif(En)begintsq<=tsq+1;endend end endmodule?占空比計數器:
module counter_duty(clk,En,clr,Tx,duty,tsq); input clk,clr,En,Tx; output reg [27:0]duty; output reg [27:0]tsq; always@(posedge clk or negedge clr) beginif(!clr)beginduty<=28'b0;tsq<=28'b0;endelsebegintsq<=tsq+1;if(En&Tx)duty<=duty+1;//高電平數end end endmodule2、讀數據
module read_value(read,Ns_data_in,Ns_data_out,TX_data_in,TX_data_out,Nh_data_in,Nh_data_out); input read; input [27:0] Ns_data_in,TX_data_in,Nh_data_in; output reg [27:0] Ns_data_out,TX_data_out,Nh_data_out;always@(negedge read) beginTX_data_out<= TX_data_in;Ns_data_out<=Ns_data_in+28'd4;Nh_data_out<=Nh_data_in+28'd4; end endmodule3、數據處理
module data_processing(Ns_data,TX_data,Fre_data_INT,Fre_data_Fra,duty,duty_rs); input [27:0] Ns_data,TX_data,duty; reg [55:0] temp; reg [27:0] remainder;output reg [9:0]duty_rs; //占空比 output reg [27:0] Fre_data_INT; // 頻率整數部分 output reg [6:0] Fre_data_Fra; // 頻率小數部分always@(Ns_data,TX_data) begintemp = 50_000_000*TX_data;Fre_data_INT = temp/Ns_data;remainder = temp%Ns_data; Fre_data_Fra= remainder*100/Ns_data; // 保留2位小數duty_rs =(duty*1000)/Ns_data; end endmodule4、數碼管顯示模塊
module display(switch,Fre_data_INT,Fre_data_Fra,clk_50M,duty,Dis1,Dis2,Dis3,Dis4,Dis5,Dis6); input [27:0] Fre_data_INT; input [6:0] Fre_data_Fra; input [9:0] duty; input switch; input clk_50M; output reg [3:0] Dis1; output reg [3:0] Dis2; output reg [3:0] Dis3; output reg [3:0] Dis4; output reg [3:0] Dis5; output reg [3:0] Dis6;reg [27:0] Ns_data;always@(clk_50M) beginif(switch)//前六位beginDis1[3:0]<= Fre_data_INT/1_000_000;Dis2[3:0]<= (Fre_data_INT%1_000_000)/100000;Dis3[3:0]<= (Fre_data_INT%100000)/10000;Dis4[3:0]<= (Fre_data_INT%10000)/1000;Dis5[3:0]<= (Fre_data_INT%1000)/100;Dis6[3:0]<= (Fre_data_INT%100)/10;endelse//后六位(其中最后三位為占空比數據)beginDis1[3:0]<= Fre_data_INT%10;Dis2[3:0]<= 0;Dis3[3:0] <= Fre_data_Fra/10;Dis4[3:0]<=duty/100;Dis5[3:0]<=(duty%100)/10;Dis6[3:0]<=duty%10;end end endmodule六、仿真分析
1、計數模塊
????????在計數模塊中Ns為標準信號個數,Nx為待測信號個數,Nh為高電平計數個數,tsq為頻率值,duty為占空比值。
?????? 計算公式tsq = 50_000_000*Nx/Ns;? duty=Nh/Ns;用quartus自帶仿真,仿高頻信號。
A、測量1Mhz頻率占空比為50%的信號的頻率。
????????設置Tx為1Mhz,預置閘門preset_gate周期為20us,clk_50M為標準50Mhz,reset為使能信號,始終為高。
理論測得tsq=500。
????????實際仿真測得tsq=496,由于clr信號延時四個標準信號周期,所以tsq=500-4,后期數據處理模塊會將Ns補4,符合理論結果,如圖 4所示。
?圖 4計數器模塊頻率計數仿真圖?
?B、Em設置為1Mhz,占空比為46%的信號的占空比
????????理論測得Nh=230,Ns=500,duty計算得460(乘以1000后的結果,以便顯示)實際仿真測得duty=460,Nh補4后符合理論結果(原因同上),如圖 5所示。
圖 5計數器模塊占空比計數仿真圖?
2、數據處理模塊
????????Duty_rs為占空比值*1000,Fre_data_INT為頻率整數值,Fre_data_Fra為頻率小數值Read為讀信號,switch為顯示位輸出轉換開關。
仿真1MHz,占空比為46%的信號。
根據公式tsq = 50_000_000*Nx/Ns;? duty=Nh/Ns。
理論測得Duty_rs=460,fre_data_INT=1000000,fre_data_Fra=0。
實際仿真測得Duty_rs=460,fre_data_INT=1000000,fre_data_Fra=0如圖 6。
圖 6數據處理模塊仿真圖?
3、總體仿真?
????????總體仿真電路圖如圖 7所示,隨機選取了5656.5Hz占空比為55.5%的信號測試,仿真結果如下圖所示。頻率仿真得到fre =5656.5hz,占空比為55.5%符合題目設計要求。?
圖 7總體仿真電路圖?
測試文件設置如圖 8
單位1ps,精度1ps。
圖 8測試文件圖?
圖 9總體仿真測試圖?
?Switch為1時輸出頻率高六位,為0時輸出低一位和小數點后一位,以及用0代替小數點(此模塊小數點沒接管腳),和占空比(最后一位為小數后一位)。如上圖9所示。
七、實測展示
????????用50Mhz分頻的待測信號,測量280.8hz,占空比50%信號。(隨機選擇)
?圖 10生成待測信號分頻器設計
圖 11前六位顯示?
圖 12后六位顯示
????????如圖 11前六為分別是頻率的小數點前2至7位,如圖 12第一位是頻率的小數點前1位,第二位是用來當小數點的0(此塊板子沒有接小數點管腳),第三位是頻率的小數點后一位,后三位用于表述占空比,其中最后一位是占空比小數點后一位;可見測得數據位,頻率:280.8hz,占空比為50.0%。
????????將圖 10中的第7行89000改為85000,可改變其占空比,理論計算得89000/178000=47.7%,實際測得也為47.7%,如下圖所示。
?圖 13改變占空比后的后六位顯示
?八、說明
????????因為實際測量信號不是由信號發生器生成的標準信號,而是通過50Mhz分頻產生而得,?根據實際測量結果可知,較高頻的測量誤差較大,其原因是因為其待測信號是由標準50Mhz分頻而得,在生成較高頻時由于 ?(數據處理+程序運行時間)/理論分頻的周期 的比值較大,數據處理時間+程序運行時間使實際分頻周期偏大,使得實際測得信號頻率偏小,誤差較大;待測頻率越高誤差越大。
? ? ? ? 如果使用信號發生器作為標準輸入信號,誤差應該符合題目需求,但是沒有實測過。
總結
以上是生活随笔為你收集整理的基于FPGA等精度的实时测量频率和占空比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Arduino 连接旋转编码器
- 下一篇: JavaFX-绘制时钟界面