1. 项目概述:FPGA正弦信号发生器的设计与实现
在数字信号处理领域,直接数字频率合成(DDS)技术因其高频率分辨率、快速切换速度和低相位噪声等优势,成为现代信号发生器的核心技术方案。本次设计基于Xilinx Zynq-7020 FPGA平台,实现了一个全数字化的正弦信号发生器系统,其核心创新点在于解决了DAC输出点数受限条件下的波形失真问题。
传统DDS设计通常采用大量采样点(如256点/周期)来保证波形质量,但本项目的特殊约束条件要求:
- 1-10Hz频段最多使用128个采样点
- 10-100Hz频段最多使用64个采样点
- 最高频率段仅允许使用32个采样点
这种严苛的采样率限制会导致输出波形呈现明显的阶梯状特征,产生丰富的高次谐波分量。实测表明,32点采样时波形总谐波失真(THD)可达-25dB,严重影响信号质量。为此,我们设计了自适应滤波系统,通过两路独立滤波器通路和智能切换机制,在保证波形完整性的同时满足全频段覆盖需求。
系统主要技术指标:
- 频率范围:1Hz-4MHz(32点模式)
- 频率分辨率:0.0116Hz(32位相位累加器)
- 幅度调节范围:3-5V(20档可调)
- 输出阻抗:50Ω
- 谐波抑制比:>40dB(经滤波后)
2. 系统架构与核心模块设计
2.1 整体硬件架构
系统采用模块化设计思想,主要包含以下功能单元:
code复制[FPGA核心控制]
├─ 相位累加器(32位)
├─ 波形ROM(32点/128点双表)
├─ 幅度控制模块(Q15定点数)
├─ 频率字生成逻辑
└─ 滤波器控制FSM
[外围电路]
├─ AD9708高速DAC(50MSPS)
├─ 二阶RC低通滤波器(1-100Hz)
├─ 巴特沃斯有源滤波器(1-4MHz)
├─ TS12A12511模拟开关
└─ 磁保持继电器(G6K-2P)
特别需要说明的是滤波器切换方案的选择依据:
- 低频段(1-100Hz)采用无源RC滤波器,因其结构简单且低频性能稳定
- 高频段(>1MHz)选用巴特沃斯有源滤波器,确保足够的阻带衰减
- 切换器件选用继电器而非模拟开关,避免高频信号通过模拟开关时产生的非线性失真
2.2 DDS核心算法实现
相位累加器作为DDS的核心,其工作机理可通过以下数学模型描述:
相位累加方程:
θ[n] = (θ[n-1] + Δθ) mod 2^N
输出频率计算:
f_out = (Δθ × f_clk) / 2^N
其中关键参数设计:
- 相位累加器位宽N=32,提供0.0116Hz的频率分辨率(50MHz时钟)
- 频率控制字Δθ与输出频率呈线性关系
- 波形ROM采用分段存储策略,包含:
- 128点正弦表(7位地址)用于1-10Hz低频段
- 32点正弦表(5位地址)用于其他频段
在Verilog实现中,相位累加器代码如下:
verilog复制always @(posedge sys_clk) begin
phase_acc <= phase_acc + freq_word;
end
assign rom_addr = (freq_range == LOW_FREQ) ?
phase_acc[31:25] : phase_acc[31:27];
2.3 动态幅度控制方案
幅度调节采用数字域乘法结合模拟域校准的方案:
- 数字部分:
- 20级线性调节(0.66-1.00)
- Q15定点数乘法保证运算精度
verilog复制assign gain_q15 = 21627 + (amp_level * 586); assign dac_data = (rom_data * gain_q15) >>> 15; - 模拟部分:
- DAC参考电压补偿
- 后级运放增益校准
实测表明,该方案在5V满幅输出时,幅度误差<±1.5%,满足设计指标。
3. 滤波器设计与实现
3.1 阶梯波谐波分析
当使用32点生成正弦波时,输出波形可表示为:
V(t) = A × floor[sin(2πt/T)×15.5 + 16.5]
通过傅里叶分析可得,这种阶梯波包含丰富的高次谐波:
- 三次谐波幅度:-15.2dBc
- 五次谐波幅度:-20.7dBc
- 七次谐波幅度:-24.3dBc
3.2 二阶RC滤波器设计
低频段滤波器参数:
- 截止频率:150Hz(-3dB点)
- 电阻R=1kΩ(数字电位器可调)
- 电容C=1μF
- 传输函数:
H(s) = 1 / (1 + sRC + (sRC)^2)
元件选型考虑:
- 选用C0G材质的电容,温度系数±30ppm/℃
- 数字电位器采用I²C接口的MCP4017
- 布局时保证RC网络对称性
3.3 巴特沃斯滤波器设计
高频段采用四阶巴特沃斯滤波器:
- 截止频率:5MHz
- 运放选用AD8065(增益带宽积145MHz)
- 采用Sallen-Key拓扑结构
- 关键参数:
- R1=R2=160Ω
- C1=C2=200pF
- Q值=0.541
滤波器仿真结果:
- 通带纹波:<0.1dB
- 阻带衰减:>60dB@10MHz
- 群延迟:约50ns
4. 关键电路实现细节
4.1 DAC接口设计
AD9708关键配置:
- 并行接口模式
- 时钟上升沿采样
- 输出电流设置:20mA
- 参考电压:1.2V(外部基准)
PCB布局要点:
- 时钟走线长度匹配(±50ps)
- 数据线等长处理(ΔL<5mm)
- 电源去耦:0.1μF+10μF组合
4.2 继电器驱动电路
选用G6K-2P磁保持继电器,驱动设计:
- 线圈电压:5V
- 驱动电流:20mA
- 保护二极管:1N4148
- 开关时间:<3ms
实测接触电阻:
- 初始值:<50mΩ
- 寿命测试后:<80mΩ(10万次操作)
5. 系统调试与优化
5.1 频率精度校准
采用计数器法进行频率校准:
- 使用Agilent 53131A频率计测量实际输出
- 记录理论值与实测值偏差
- 建立校正曲线:
python复制def calibrate(f_target): if f_target < 10: return f_target * 0.9987 elif f_target < 100: return f_target * 1.0012 else: return f_target * 1.0035 - 在FPGA中实现校正算法
校准后频率误差:
- <1Hz:±0.02Hz
- 1-100Hz:±0.1%
-
100Hz:±0.3%
5.2 波形失真优化
针对低频段幅度衰减问题,采取以下措施:
- 增加耦合电容值(从1μF增至10μF)
- 采用ADA4817高速运放(增益带宽积105MHz)
- 数字预加重处理:
verilog复制// 低频增益补偿 wire [15:0] comp_gain = (freq_word < FW_10HZ) ? 16'h3800 : 16'h2000; assign dac_data = (raw_data * comp_gain) >>> 14;
优化后性能提升:
- 5Hz时幅度衰减从4.8%降至1.2%
- THD改善约6dB
6. 实测性能分析
6.1 频率特性测试
| 频段 | 设定频率 | 实测频率 | 误差 | 峰峰值 |
|---|---|---|---|---|
| 低频段 | 5Hz | 4.99Hz | -0.2% | 4.98V |
| 50Hz | 50.1Hz | +0.2% | 5.02V | |
| 高频段 | 1MHz | 1.003MHz | +0.3% | 4.95V |
| 4MHz | 4.012MHz | +0.3% | 4.88V |
6.2 频谱纯度测试
使用频谱分析仪测量(2MHz输出):
| 谐波次数 | 幅度(dBc) |
|---|---|
| 基波 | 0 |
| 2次 | -45.2 |
| 3次 | -51.7 |
| 4次 | -56.3 |
6.3 切换瞬态分析
滤波器通路切换时(100Hz↔1MHz):
- 建立时间:<500μs
- 过冲幅度:<5%
- 相位连续性:Δφ<5°
7. 工程经验总结
7.1 关键设计决策
-
点数分配策略:
- 低频段采用128点保证波形质量
- 高频段使用32点降低资源占用
- 动态切换时平滑过渡
-
滤波器选型:
- 低频无源滤波器避免运放噪声
- 高频有源滤波器确保足够抑制
-
切换方案:
- 继电器优于模拟开关
- 磁保持型降低功耗
7.2 典型问题解决方案
问题1:高频段波形畸变
- 原因:PCB走线寄生电感
- 解决:
- 缩短DA输出走线
- 增加地平面
- 使用屏蔽电缆
问题2:低频幅度波动
- 原因:数字电位器分辨率不足
- 解决:
- 改用16位DAC控制滤波器参数
- 增加软件校准算法
问题3:切换瞬态过大
- 原因:继电器触点弹跳
- 解决:
- 加入5ms消抖延时
- 采用先断后通切换时序
7.3 可扩展改进方向
- 相位连续调频技术
- 多波形合成(正弦+方波)
- 自动增益控制(AGC)电路
- 网络化远程控制接口
8. 完整实现代码解析
8.1 顶层模块设计
verilog复制module dds_top (
input wire clk_50m,
input wire rst_n,
input wire [3:0] key_in,
output wire [7:0] dac_data,
output wire dac_clk,
output wire filter_sel,
output wire uart_tx
);
// 时钟分频生成
clk_div #(.DIV(2)) u_clk_div (
.clk_in(clk_50m),
.clk_out(dac_clk)
);
// 按键处理
key_debounce u_key [
.clk(clk_50m),
.key_in(key_in),
.key_out(key_valid)
];
// DDS核心
dds_core u_dds (
.clk(clk_50m),
.rst_n(rst_n),
.key(key_valid),
.dac_data(dac_data),
.filter_sel(filter_sel),
.uart_tx(uart_tx)
);
endmodule
8.2 相位累加器实现
verilog复制module phase_accumulator (
input wire clk,
input wire rst_n,
input wire [31:0] freq_word,
output reg [31:0] phase_acc
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
phase_acc <= 32'd0;
end else begin
phase_acc <= phase_acc + freq_word;
end
end
// 频率字动态步进算法
function [31:0] calc_freq_step;
input [31:0] current_freq;
begin
if (current_freq < 32'd859) calc_freq_step = 32'd86;
else if (current_freq < 32'd8590) calc_freq_step = 32'd859;
else calc_freq_step = 32'd8590;
end
endfunction
endmodule
8.3 幅度控制模块
verilog复制module amplitude_ctrl (
input wire clk,
input wire rst_n,
input wire amp_up,
input wire amp_down,
input wire [7:0] wave_data,
output reg [7:0] dac_out,
output reg [4:0] amp_level
);
localparam [15:0] GAIN_MIN = 16'd21627; // 0.66 in Q15
localparam [15:0] GAIN_MAX = 16'd32768; // 1.00 in Q15
reg [15:0] current_gain;
// 幅度档位控制
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
amp_level <= 5'd10; // 中间档位
end else begin
case ({amp_up, amp_down})
2'b10: if (amp_level < 19) amp_level <= amp_level + 1;
2'b01: if (amp_level > 0) amp_level <= amp_level - 1;
default: ;
endcase
end
end
// 增益计算
always @(*) begin
current_gain = GAIN_MIN + ((GAIN_MAX - GAIN_MIN) * amp_level) / 19;
end
// 幅度调整
always @(posedge clk) begin
dac_out <= (wave_data * current_gain) >>> 15;
end
endmodule
9. 实际应用建议
-
环境适应性改进:
- 工业环境应用时增加EMI滤波器
- 高温环境下选用汽车级元器件
- 加入温度补偿算法
-
生产测试要点:
- 频率响应曲线测试
- 谐波失真自动化检测
- 继电器寿命测试(>10万次)
-
教学应用建议:
- 分模块验证(先DDS后滤波)
- 使用示波器FFT功能分析谐波
- 对比不同点数下的波形质量
10. 致谢与资源分享
本设计在实现过程中参考了以下开源项目:
- FPGA-DDS核心算法:OpenCores.org的DDS项目
- 滤波器设计工具:Analog Devices的Filter Wizard
- 硬件设计参考:Hackaday上的相关案例
完整工程文件已开源:
- GitHub仓库:github.com/your_repo
- 包含内容:
- Vivado 2019.4工程
- 仿真测试用例
- PCB设计文件(Altium Designer)
- 技术报告PDF
特别感谢我的导师在滤波器设计方面给予的指导,以及实验室提供的测试设备支持。对于想要复现本项目的读者,建议先从低频段开始验证,逐步扩展到高频应用。在实际调试中,示波器的FFT功能是分析波形质量的利器,而网络分析仪则能帮助精确调整滤波器参数。