基于 FPGA 的数字频率计设计
为什么非要用 FPGA 做频率计?
为什么不直接用单片机?
答案很简单——速度和确定性。
假设你要测一个 100 MHz 的信号,每秒要处理一亿个上升沿。传统 MCU 靠中断或定时器轮询?别想了,光响应延迟就可能吃掉几个周期。更别说多任务调度带来的抖动。而 FPGA 不同,它是硬件并行运行的,所有逻辑同时工作,没有'下一条指令'的概念。
更重要的是,FPGA 允许我们实现全流水线化的测频引擎:一边在精确闸门内计数,一边同步启动数据打包上传,还能实时判断是否切换测量模式。这一切都在纳秒级完成,毫无软件延迟。
所以,在对高频、低抖动、宽动态范围有要求的应用中(比如通信系统时钟监控、雷达回波分析),FPGA 几乎是唯一选择。
核心架构:这个频率计是怎么'看'信号的?
让我们先把整个系统的骨架搭起来。一个真正能用的数字频率计,绝不仅仅是'数脉冲'那么简单。它必须解决几个根本问题:
- 如何让各种杂乱输入变成干净的数字信号?
- 怎么保证测量时间本身足够准确?
- 高频信号好办,那接近直流的低频信号怎么测准?
- FPGA 内部资源有限,如何高效组织逻辑?
下面这张图,就是我们最终要实现的系统结构(文字版):
待测信号 ↓ [前端调理电路] → 把正弦/小信号变换成标准方波 ↓ FPGA 芯片 ├─ [PLL 锁相环] ← 外接 10MHz 温补晶振 → 提供精准时间基准 ├─ [主控状态机] ← 控制测量流程 ├─ [高速计数器] ← 统计单位时间内脉冲数(测频法) ├─ [周期测量模块] ← 精确捕捉单个周期长度(测周法) ├─ [自动量程切换逻辑] ← 动态选择最优算法 ├─ [结果缓存与打包] ← FIFO + 数据格式化 └─ [通信接口] → UART / Ethernet → 上位机或 LCD 显示
整个系统以 FPGA 为核心,像一位冷静高效的指挥官,协调各个模块协同作战。接下来,我们就深入每个关键模块,看看它们是如何工作的。
第一步:让千奇百怪的输入信号'听话'
现实世界中的信号可不像仿真里那么理想。可能是几毫伏的正弦波,也可能是带噪声的三角波,甚至还有负电压。如果直接喂给 FPGA 的 IO 口,轻则误触发,重则烧毁芯片。
所以我们需要一套前端调理电路,完成以下任务:
- 保护:防止静电、过压损坏 FPGA;
- 放大整形:把微弱或缓慢变化的信号转为陡峭边沿的方波;
- 电平匹配:确保输出符合 FPGA 的 LVCMOS 输入标准(通常是 3.3V 或 1.8V)。
典型电路设计要点:
- 输入端加 TVS 二极管和限流电阻(如 1kΩ),形成第一道防线;
- 使用交流耦合电容隔断直流偏置,再通过电阻网络提供 1.65V 左右的偏置电压;
- 核心采用高速比较器(如 ADI 的 ADCMP600,响应时间<5ns),搭配迟滞反馈提升抗干扰能力;
- 输出端串联小电阻(约 22Ω)用于阻抗匹配,减少反射。
⚠️ 特别提醒:不要依赖 FPGA 内部的施密特触发输入来做主要整形!虽然有些 FPGA IO 支持 Schmitt-trigger 模式,但其滞后电压不精确且不可调,容易引入测量偏差。
对于超过 100 MHz 的射频信号,建议外接预分频器芯片(如 ON Semi MC12090),先将频率降到 50 MHz 以内再送入 FPGA,避免因布线延迟导致采样失败。
第二步:时间的标尺——没有它,一切都不准
频率的本质是什么?是单位时间内的事件次数。所以,'单位时间'本身必须极其精确。哪怕你的计数器再快,参考时钟漂了 1%,结果照样错 1%。
这就是为什么我们必须建立一个高稳定性时间基准。

