在FPGA開發(fā)中,頻率測量是一個既基礎(chǔ)又考驗功底的課題。無論是通信系統(tǒng)中的載波同步、電機控制里的轉(zhuǎn)速反饋,還是數(shù)字信號處理與系統(tǒng)時鐘監(jiān)控,準(zhǔn)確獲取信號頻率都是第一步。
針對不同的頻段和精度要求,工程上通常有四種處理思路。理解它們的底層邏輯和誤差來源,是選型的前提。

1. 直接測頻法(計數(shù)法)
這是最直觀的邏輯:設(shè)定一個固定時間的閘門(比如精確的1秒),在這個時間內(nèi)去數(shù)被測信號產(chǎn)生了多少個上升沿。
? 優(yōu)點:邏輯極簡,高頻測量準(zhǔn)。
? 缺點:低頻極差。因為閘門開啟和關(guān)閉的瞬間,是由系統(tǒng)內(nèi)部時鐘決定的,無法和被測信號同步。這就不可避免地會產(chǎn)生 ±1 個脈沖的誤差。被測頻率越低,這 ±1 個脈沖占總數(shù)的比例就越大,相對誤差直接失控。
2. 測周法(周期法)
直接測頻的鏡像方案:以被測信號的一個(或整數(shù) N 個)周期作為閘門,在這個閘門內(nèi)去數(shù)內(nèi)部高頻基準(zhǔn)時鐘的脈沖數(shù)。
? 優(yōu)點:低頻測量精度高。
? 缺點:高頻測量誤差大,動態(tài)范圍窄。被測頻率越高,閘門時間就越短,計得的基準(zhǔn)時鐘脈沖數(shù)越少。此時,基準(zhǔn)時鐘自身的 ±1 誤差帶來的影響就會急劇放大。
3. 等精度測頻法(工程首選)
為了解決前兩者的短板,等精度測頻法應(yīng)運而生。它巧妙地結(jié)合了計數(shù)法和測周法,使得相對誤差在整個測量頻段內(nèi)保持恒定。
它的核心機制是同步閘門:軟件先給出一個預(yù)設(shè)閘門(軟件閘門),但這只是一個準(zhǔn)備信號。真正的測量閘門(實際閘門)是由被測信號的上升沿觸發(fā)開啟,并在被測信號的下一個上升沿(軟件閘門關(guān)閉后)觸發(fā)關(guān)閉。
在這個實際閘門內(nèi),F(xiàn)PGA同時對“被測信號”和“高頻基準(zhǔn)時鐘”進行計數(shù)。由于實際閘門和被測信號嚴(yán)格同步,被測信號的 ±1 誤差被物理消除。誤差被全部轉(zhuǎn)移到了高頻的基準(zhǔn)時鐘上,只要基準(zhǔn)時鐘頻率足夠高,整體相對誤差就能壓制在極低水平。
4. 游標(biāo)卡尺法/內(nèi)插法
當(dāng)?shù)染葴y頻也無法滿足需求(例如需要皮秒級的時間分辨率,常見于激光測距或高端示波器)時,就需要利用FPGA內(nèi)部的進位鏈(Carry Chain)或延遲線構(gòu)成時間數(shù)字轉(zhuǎn)換器(TDC)。通過測量不到一個時鐘周期的細(xì)微相位差來提高精度。這種方法極度消耗資源,且嚴(yán)重依賴具體的FPGA底層架構(gòu)和布線,屬于特定領(lǐng)域的進階方案。

等精度測頻的 Verilog 核心實現(xiàn)
以下是等精度測頻的核心邏輯片段。重點在于實際閘門的生成以及兩個獨立時鐘域的計數(shù)。
// 假設(shè) soft_gate 是由系統(tǒng)控制模塊給出的軟件閘門(高電平有效,持續(xù)時間例如1秒)
// soft_gate 已經(jīng)同步到了 clk_fx (被測時鐘) 域
reg actual_gate_fx;
reg [31:0] fx_cnt;
reg [31:0] ref_cnt;
// 1. 在被測時鐘域生成實際閘門
// 實際閘門與被測信號(clk_fx)嚴(yán)格對齊,消除了 clk_fx 的 ±1 誤差
always @(posedge clk_fx ornegedge rst_n) begin
if (!rst_n) begin
actual_gate_fx <= 1'b0;
end else begin
actual_gate_fx <= soft_gate;
end
end
// 2. 被測信號計數(shù)器 (在被測時鐘域)
always @(posedge clk_fx ornegedge rst_n) begin
if (!rst_n) begin
fx_cnt <= 32'd0;
end else if (actual_gate_fx) begin
fx_cnt <= fx_cnt + 1'b1;
end else if (!soft_gate) begin
// 軟件閘門關(guān)閉且實際閘門也關(guān)閉后,等待外部讀取完畢可清零
// 實際工程中通常由狀態(tài)機控制清零時機
fx_cnt <= 32'd0;
end
end
// 3. 基準(zhǔn)時鐘計數(shù)器 (在基準(zhǔn)時鐘域)
// 需要先將 actual_gate_fx 同步到 clk_ref 域
reg actual_gate_ref_d1, actual_gate_ref_d2;
always @(posedge clk_ref ornegedge rst_n) begin
if (!rst_n) begin
actual_gate_ref_d1 <= 1'b0;
actual_gate_ref_d2 <= 1'b0;
end else begin
actual_gate_ref_d1 <= actual_gate_fx;
actual_gate_ref_d2 <= actual_gate_ref_d1;
end
end
always @(posedge clk_ref ornegedge rst_n) begin
if (!rst_n) begin
ref_cnt <= 32'd0;
end else if (actual_gate_ref_d2) begin
ref_cnt <= ref_cnt + 1'b1;
end else if (!soft_gate_ref_synced) begin
// 同樣由狀態(tài)機控制清零
ref_cnt <= 32'd0;
end
end
// 頻率計算公式(通常交由后續(xù)的DSP模塊或軟核CPU計算):
// Fx = (fx_cnt * Fref) / ref_cnt
工程實踐中的踩坑點
理論公式通常很完美,但真正上板測試時,問題往往出在物理信號和時序上。
跨時鐘域(CDC)的數(shù)據(jù)讀取
在等精度測頻中,fx_cnt 和 ref_cnt 分別在兩個不同的時鐘域累加。千萬不要在閘門開啟期間去讀取這兩個計數(shù)器的值,一定會采到亞穩(wěn)態(tài)或中間亂碼。標(biāo)準(zhǔn)做法是:通過狀態(tài)機監(jiān)控實際閘門的下降沿,閘門關(guān)閉后,等待幾個時鐘周期讓計數(shù)值徹底穩(wěn)定,再通過握手協(xié)議(Handshake)或異步FIFO將數(shù)值統(tǒng)一拉到系統(tǒng)時鐘域進行除法運算。
管腳毛刺與數(shù)字濾波
如果被測信號來自外部物理引腳(比如電機霍爾傳感器的脈沖),線纜干擾會引入大量毛刺。FPGA的觸發(fā)器極其敏感,一個幾納秒的毛刺就會導(dǎo)致計數(shù)器多加1。外部信號入管腳后,必須先過兩級寄存器解亞穩(wěn)態(tài),然后加一段數(shù)字濾波邏輯(例如:連續(xù)判斷 N 個系統(tǒng)時鐘周期電平保持一致,才確認(rèn)信號發(fā)生了真正的翻轉(zhuǎn))。
位寬防溢出設(shè)計
計數(shù)器給多少位,不能盲目拍腦袋定32位或64位。需要根據(jù)“最大預(yù)設(shè)閘門時間 × 理論最高頻率”算出最大可能計數(shù)值,再以此分配位寬。如果被測信號頻率極高,而閘門時間又開得很長,計數(shù)器一旦靜默溢出反轉(zhuǎn),算出來的頻率將完全錯誤。
復(fù)位邏輯的同步釋放
在多時鐘域系統(tǒng)中,復(fù)位信號的撤銷必須遵循“同步釋放”原則。如果復(fù)位信號在不同時鐘域不同步地撤銷,可能會導(dǎo)致部分計數(shù)器已經(jīng)開始工作,而另一部分還處于復(fù)位狀態(tài),從而產(chǎn)生不可預(yù)知的初始狀態(tài)偏差。
頻率測量看似簡單,實則涵蓋了FPGA設(shè)計中跨時鐘域處理、時序約束、誤差分析等多個核心知識點。掌握這些方法,不僅能幫你解決測頻問題,更能提升對數(shù)字系統(tǒng)設(shè)計的整體掌控力。