在通信系统测试和电子测量领域,信号发生器是不可或缺的基础设备。传统模拟信号源存在频率稳定性差、波形切换不灵活等问题,而基于FPGA和直接数字频率合成(DDS)技术的解决方案,能够以全数字化的方式生成高精度、可编程的多波形信号。我最近完成的一个项目,使用Xilinx Artix-7 FPGA配合高速DAC,实现了包含正弦波、方波、三角波、锯齿波等基础波形,以及2PSK、2ASK和AM调制信号的综合信号发生器。
这个项目的独特价值在于:
DDS的核心是一个相位累加器,其本质是一个模2^N的循环计数器。每次时钟到来时,累加器将当前相位值加上频率控制字(FTW):
code复制相位[n] = (相位[n-1] + FTW) mod 2^N
其中N通常取24-32位。FTW与输出频率的关系为:
code复制f_out = (FTW × f_clk) / 2^N
例如,当f_clk=100MHz,N=32时,要生成1MHz正弦波:
code复制FTW = (1e6 × 2^32) / 100e6 ≈ 42,949,673
传统方案使用查找表(LUT)存储波形数据,但会面临存储深度与资源占用的矛盾。我的优化方案包括:
对于方波等简单波形,可采用实时计算替代存储:
verilog复制// 方波生成示例
assign square_wave = (phase_acc[31]) ? amplitude : -amplitude;
调制波形的核心是将基带信号与载波相乘。以AM调制为例:
code复制AM(t) = [A + m(t)] × sin(2πf_c t)
FPGA实现时采用以下结构:
系统采用模块化设计,主要包含:
关键信号定义:
verilog复制module dds_core (
input clk_125M,
input [31:0] freq_word,
input [1:0] wave_select,
output reg [11:0] dac_data
);
// 相位累加器
reg [31:0] phase_acc;
always @(posedge clk_125M) begin
phase_acc <= phase_acc + freq_word;
end
// 波形生成
always @(*) begin
case(wave_select)
2'b00: dac_data = sin_lut[phase_acc[31:24]];
2'b01: dac_data = {phase_acc[31],{11{1'b1}}}; // 方波
// 其他波形...
endcase
end
endmodule
以2PSK调制为例:
verilog复制// 伪随机序列生成
reg [15:0] pn_seq = 16'hA5A5;
always @(posedge symbol_clk) begin
pn_seq <= {pn_seq[14:0], pn_seq[15] ^ pn_seq[12] ^ pn_seq[3] ^ pn_seq[0]};
end
// PSK调制
wire [11:0] carrier = sin_lut[phase_acc[31:24]];
wire [11:0] psk_out = (pn_seq[0]) ? carrier : -carrier;
初期测试发现输出信号存在明显杂散,通过以下措施改善:
verilog复制wire [7:0] dither = lfsr[7:0];
phase_acc <= phase_acc + freq_word + {24'd0, dither};
| 优化措施 | SFDR(dBc) | 相位噪声(dBc/Hz@1kHz) |
|---|---|---|
| 基础方案 | 45 | -75 |
| 增加相位抖动 | 58 | -72 |
| 加窗处理 | 62 | -78 |
| 电源优化 | 65 | -82 |
现象:高频正弦波出现台阶状失真
解决方法:
verilog复制// 简易AGC实现
always @(posedge clk) begin
if (mod_index > 12'd2047)
gain <= gain - 1;
else if (mod_index < 12'd1023)
gain <= gain + 1;
end
当使用较小规模FPGA时:
本设计可进一步扩展为:
实际部署中发现,在5G FR1频段测试中,该发生器配合上变频器可完美替代商用信号源,成本仅为后者的1/20。一个特别实用的技巧是:在生成扫频信号时,采用线性步进而非对数步进,可以显著降低FPGA计算负载。