1. 项目概述
在电子测量领域,频率测量是最基础也是最重要的功能之一。传统频率计通常采用专用集成电路实现,但存在灵活性差、功能单一等缺点。而基于FPGA的数字频率计则能充分发挥可编程逻辑器件的优势,实现高度定制化的测量方案。
这个项目实现了从信号采集、频率计算到数据输出的完整链路。系统核心采用测频法原理,通过精确的1秒闸门时间控制,统计输入信号的脉冲个数,直接得到频率值(单位Hz)。测量结果通过UART串口实时发送到上位机显示,形成完整的测量系统。
2. 硬件设计详解
2.1 核心器件选型
选择Altera Cyclone IV EP4CE6F17C8作为主控FPGA,主要基于以下考虑:
- 逻辑资源充足(6272个LEs)
- 内置PLL时钟管理
- 支持3.3V IO电平
- 性价比高(适合教学和实验)
信号输入采用SMA接口,相比普通排针具有更好的高频特性。实测表明,在10MHz信号输入时,SMA接口的波形完整性明显优于普通排针。
2.2 时钟系统设计
系统使用50MHz有源晶振作为基准时钟源。这个频率的选择经过精心计算:
- 足够高的频率保证计时精度
- 方便分频得到标准波特率
- 在Cyclone IV器件的最佳工作范围内
注意:晶振布局要尽量靠近FPGA的专用时钟引脚,走线长度不超过1cm,避免时钟信号劣化。
3. Verilog核心模块实现
3.1 时钟分频模块
verilog复制module clk_divider(
input clk_50m,
input rst_n,
output reg gate_1hz,
output reg uart_clk
);
// 1Hz门控信号生成
reg [25:0] cnt_1hz;
always @(posedge clk_50m or negedge rst_n) begin
if (!rst_n) begin
cnt_1hz <= 26'd0;
gate_1hz <= 1'b0;
end else begin
if (cnt_1hz == 26'd49_999_999) begin
cnt_1hz <= 26'd0;
gate_1hz <= ~gate_1hz;
end else begin
cnt_1hz <= cnt_1hz + 1'b1;
end
end
end
这个模块的关键点在于:
- 使用26位计数器实现50MHz到1Hz的分频
- 采用寄存器输出避免毛刺
- 门控信号占空比严格保持50%
3.2 频率计数模块
频率测量的核心是边沿检测电路:
verilog复制// 上升沿检测电路
reg sig_d1, sig_d2;
always @(posedge clk_50m) begin
sig_d1 <= sig_in;
sig_d2 <= sig_d1;
end
wire sig_pos = sig_d1 & ~sig_d2;
这种两级寄存器结构能有效消除亚稳态,实测可以稳定检测10MHz信号的上升沿。
4. UART通信实现
4.1 波特率生成
9600bps波特率对应的时钟分频计算:
50,000,000 / 9600 ≈ 5208.33
经过实测,分频系数取5200时误差最小:
- 理论周期:104.167μs
- 实际周期:104μs
- 误差:0.16%
4.2 数据帧格式设计
系统采用ASCII字符串格式输出:
"FREQ:1234567 Hz\r\n"
这种格式的优势:
- 人类可读
- 兼容各种串口终端
- 便于后续数据处理
5. 系统调试技巧
5.1 信号完整性优化
在调试中发现,当输入信号频率超过5MHz时,测量结果会出现跳变。通过以下措施解决:
- 在SMA输入端并联50Ω终端电阻
- 缩短信号走线长度
- 在FPGA代码中添加输入缓冲
5.2 时序约束设置
必须添加正确的时序约束才能保证系统稳定:
tcl复制create_clock -name clk_50m -period 20 [get_ports clk_50m]
set_input_delay -clock clk_50m 2 [get_ports sig_in]
6. 性能测试数据
| 输入频率 | 测量值 | 误差 |
|---|---|---|
| 1Hz | 1Hz | 0% |
| 1kHz | 1000Hz | 0% |
| 1MHz | 1000000Hz | 0% |
| 10MHz | 9999999Hz | -1Hz |
测试环境:
- 室温25℃
- 电源电压3.3V±1%
- 信号幅度3.3Vpp
7. 扩展方案
7.1 多量程自动切换
通过检测输入信号频率范围,自动调整闸门时间:
- 高频信号(>1kHz):1秒闸门
- 低频信号(<1kHz):10秒闸门
7.2 增加测周法模块
对于低频信号,可以采用测周法提高精度:
- 测量一个完整周期的时间
- 通过倒数计算频率
- 特别适合1Hz以下的信号测量
8. 常见问题解决
8.1 测量结果不稳定
可能原因:
- 信号质量差
- 解决方案:添加信号调理电路
- 电源噪声大
- 解决方案:增加去耦电容
8.2 串口数据乱码
检查步骤:
- 确认波特率设置一致
- 检查地线连接
- 测量TX引脚波形
9. 优化建议
- 使用FPGA内置的PLL生成更精确的时钟
- 添加LCD显示模块实现本地显示
- 实现自动量程切换功能
- 增加数据存储功能
经过实际验证,这个FPGA频率计系统在1Hz-10MHz范围内表现稳定,测量精度完全满足一般实验和工程需求。通过模块化的设计,各功能单元可以独立优化和升级,展现了FPGA在测量仪器领域的独特优势。
