• 正文
  • 相关推荐
申请入驻 产业图谱

FPGA频率测量:从原理到工程实践的四种硬核方案

07/13 10:38
299
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

FPGA开发中,频率测量是一个既基础又考验功底的课题。无论是通信系统中的载波同步、电机控制里的转速反馈,还是数字信号处理与系统时钟监控,准确获取信号频率都是第一步。

针对不同的频段和精度要求,工程上通常有四种处理思路。理解它们的底层逻辑和误差来源,是选型的前提。

1. 直接测频法(计数法)

这是最直观的逻辑:设定一个固定时间的闸门(比如精确的1秒),在这个时间内去数被测信号产生了多少个上升沿。

• 优点:逻辑极简,高频测量准。

• 缺点:低频极差。因为闸门开启和关闭的瞬间,是由系统内部时钟决定的,无法和被测信号同步。这就不可避免地会产生 ±1 个脉冲的误差。被测频率越低,这 ±1 个脉冲占总数的比例就越大,相对误差直接失控。

2. 测周法(周期法)

直接测频的镜像方案:以被测信号的一个(或整数 N 个)周期作为闸门,在这个闸门内去数内部高频基准时钟的脉冲数。

• 优点:低频测量精度高。

• 缺点:高频测量误差大,动态范围窄。被测频率越高,闸门时间就越短,计得的基准时钟脉冲数越少。此时,基准时钟自身的 ±1 误差带来的影响就会急剧放大。

3. 等精度测频法(工程首选)

为了解决前两者的短板,等精度测频法应运而生。它巧妙地结合了计数法和测周法,使得相对误差在整个测量频段内保持恒定。

它的核心机制是同步闸门:软件先给出一个预设闸门(软件闸门),但这只是一个准备信号。真正的测量闸门(实际闸门)是由被测信号的上升沿触发开启,并在被测信号的下一个上升沿(软件闸门关闭后)触发关闭。

在这个实际闸门内,FPGA同时对“被测信号”和“高频基准时钟”进行计数。由于实际闸门和被测信号严格同步,被测信号的 ±1 误差被物理消除。误差被全部转移到了高频的基准时钟上,只要基准时钟频率足够高,整体相对误差就能压制在极低水平。

4. 游标卡尺法/内插法

当等精度测频也无法满足需求(例如需要皮秒级的时间分辨率,常见于激光测距或高端示波器)时,就需要利用FPGA内部的进位链(Carry Chain)或延迟线构成时间数字转换器(TDC)。通过测量不到一个时钟周期的细微相位差来提高精度。这种方法极度消耗资源,且严重依赖具体的FPGA底层架构和布线,属于特定领域的进阶方案。


等精度测频的 Verilog 核心实现

以下是等精度测频的核心逻辑片段。重点在于实际闸门的生成以及两个独立时钟域的计数。

// 假设 soft_gate 是由系统控制模块给出的软件闸门(高电平有效,持续时间例如1秒)
// soft_gate 已经同步到了 clk_fx (被测时钟) 域
reg        actual_gate_fx;
reg [31:0] fx_cnt;
reg [31:0] ref_cnt;

// 1. 在被测时钟域生成实际闸门
// 实际闸门与被测信号(clk_fx)严格对齐,消除了 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. 被测信号计数器 (在被测时钟域)
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
// 软件闸门关闭且实际闸门也关闭后,等待外部读取完毕可清零
// 实际工程中通常由状态机控制清零时机
fx_cnt <= 32'd0;
end
end

// 3. 基准时钟计数器 (在基准时钟域)
// 需要先将 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
// 同样由状态机控制清零
ref_cnt <= 32'd0;
end
end

// 频率计算公式(通常交由后续的DSP模块或软核CPU计算):
// Fx = (fx_cnt * Fref) / ref_cnt


工程实践中的踩坑点

理论公式通常很完美,但真正上板测试时,问题往往出在物理信号和时序上。

跨时钟域(CDC)的数据读取

在等精度测频中,fx_cnt 和 ref_cnt 分别在两个不同的时钟域累加。千万不要在闸门开启期间去读取这两个计数器的值,一定会采到亚稳态或中间乱码。标准做法是:通过状态机监控实际闸门的下降沿,闸门关闭后,等待几个时钟周期让计数值彻底稳定,再通过握手协议(Handshake)或异步FIFO将数值统一拉到系统时钟域进行除法运算。

管脚毛刺与数字滤波

如果被测信号来自外部物理引脚(比如电机霍尔传感器的脉冲),线缆干扰会引入大量毛刺。FPGA的触发器极其敏感,一个几纳秒的毛刺就会导致计数器多加1。外部信号入管脚后,必须先过两级寄存器解亚稳态,然后加一段数字滤波逻辑(例如:连续判断 N 个系统时钟周期电平保持一致,才确认信号发生了真正的翻转)。

位宽防溢出设计

计数器给多少位,不能盲目拍脑袋定32位或64位。需要根据“最大预设闸门时间 × 理论最高频率”算出最大可能计数值,再以此分配位宽。如果被测信号频率极高,而闸门时间又开得很长,计数器一旦静默溢出反转,算出来的频率将完全错误。

复位逻辑的同步释放

在多时钟域系统中,复位信号的撤销必须遵循“同步释放”原则。如果复位信号在不同时钟域不同步地撤销,可能会导致部分计数器已经开始工作,而另一部分还处于复位状态,从而产生不可预知的初始状态偏差。

频率测量看似简单,实则涵盖了FPGA设计中跨时钟域处理、时序约束、误差分析等多个核心知识点。掌握这些方法,不仅能帮你解决测频问题,更能提升对数字系统设计的整体掌控力。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录
lee
lee

从数字出发,走进图像世界,聆听音频的美妙旋律。从电路出发,实现美妙的算法,展示代码的美奂。从知识到实现,欢迎大家关注公众号FPGA开源工作室。