1. 项目背景与核心需求
2022年全国大学生电子设计竞赛F题"信号调制度测量"是一个典型的通信系统设计题目,要求参赛者实现一个能够准确测量信号调制度的系统。作为FPGA开发者,我选择完全基于硬件描述语言(Verilog/VHDL)实现所有功能模块,这种纯FPGA的解决方案相比MCU+DSP方案具有明显的并行处理优势。
调制度测量本质上是一个信号特征提取问题。以AM调幅信号为例,其数学表达式为:
code复制s(t) = A[1 + m·cos(ω_m t)]·cos(ω_c t)
其中m就是我们需要测量的调制度。通过FFT频谱分析,我们可以提取载波和边带的幅度关系来计算调制度。
2. 系统架构设计
2.1 整体数据流设计
系统采用典型的数字信号处理流水线架构:
code复制ADC采样 → FIR滤波 → FFT分析 → 寻峰算法 → 调制度计算 → UART输出
同时通过DDS模块生成测试信号用于系统验证。各模块通过FIFO进行数据缓冲,确保数据流的连续性。
2.2 关键模块选型考量
- FFT核心:选用基2按时间抽取(DIT)算法,在Xilinx FPGA上实现256点FFT,平衡了资源占用和频率分辨率
- FIR滤波器:采用对称系数结构,节省50%乘法器资源
- DDS实现:使用相位累加器+查找表方案,相位分辨率达到32位
- 寻峰算法:改进的三点比较法,在资源占用和精度间取得平衡
3. 核心模块实现细节
3.1 FFT模块优化实现
verilog复制module fft_processor (
input clk, rst,
input [15:0] din,
input din_valid,
output [31:0] dout,
output dout_valid
);
// 蝶形运算单元
butterfly #(.STAGE(0)) bf0 (.*);
butterfly #(.STAGE(1)) bf1 (.*);
// ...更多级联蝶形运算
// 旋转因子ROM
twiddle_rom rom0 (.addr(stage_cnt), .data(twiddle));
endmodule
关键优化点:
- 采用流水线结构,每时钟周期完成一个蝶形运算
- 旋转因子使用Block ROM存储
- 定点数运算的位宽扩展处理
注意:FFT输出需要做幅度计算:mag = sqrt(re² + im²)。实际实现时可用α·max(|re|,|im|) + β·min(|re|,|im|)近似。
3.2 DDS信号生成
相位累加器是DDS的核心:
verilog复制always @(posedge clk) begin
phase_acc <= phase_acc + freq_control_word;
sine_out <= sine_table[phase_acc[31:24]];
end
频率分辨率计算:
code复制Δf = f_clk / 2^N = 100MHz/2^32 ≈ 0.023Hz
足够满足音频信号生成需求。
3.3 FIR滤波器设计
采用MATLAB FDA工具设计滤波器系数:
matlab复制h = fir1(63, 0.2); % 64阶低通滤波器
fvtool(h,1); % 查看频率响应
FPGA实现时采用转置直接型结构,减少寄存器使用量。
4. 系统集成与调试
4.1 数据流控制
各模块间采用AXI-Stream接口:
verilog复制// FIFO连接示例
fifo #(.WIDTH(16)) adc_fifo (
.wr_clk(adc_clk),
.wr_data(adc_data),
.rd_clk(dsp_clk),
.rd_data(fir_input)
);
关键参数:
- ADC采样率:1MSPS
- FIFO深度:1024点
- 时钟域交叉:异步FIFO+格雷码
4.2 调制度计算算法
AM调制度计算公式:
code复制m = (A_max - A_min) / (A_max + A_min)
实际实现时:
- 通过FFT找到载波(fc)和边带(fc±fm)幅度
- 计算m = 2·Asideband / Acarrier
4.3 实测性能指标
- 频率测量范围:10Hz-100kHz
- 调制度测量误差:<1%
- 处理延迟:<5ms
5. 验证与测试方案
5.1 MATLAB仿真验证
matlab复制% 生成测试信号
fc = 10e3; fm = 1e3; m = 0.5;
t = 0:1/1e6:0.1;
s = (1 + m*cos(2*pi*fm*t)) .* cos(2*pi*fc*t);
% 添加噪声
snr = 30; % dB
s_noisy = awgn(s, snr);
% 调用FPGA仿真模型
fpga_out = fpga_model(s_noisy);
5.2 硬件测试方法
- 使用信号发生器产生标准AM信号
- 通过串口屏显示测量结果
- 与示波器测量结果对比
6. 项目开发经验总结
6.1 关键调试技巧
- FFT输出异常:检查旋转因子ROM初始化数据
- DDS频谱不纯:优化相位截断位数
- FIFO溢出:调整上下游模块的速率匹配
6.2 资源优化建议
- 共享乘法器资源
- 使用DSP48E1硬核
- 时分复用存储资源
6.3 工程管理心得
- 版本控制:Git管理代码,每个模块独立分支
- 文档记录:详细注释+设计文档
- 测试驱动:先写测试用例再开发
这个项目完整展示了从算法仿真到FPGA实现的完整开发流程,特别适合作为FPGA工程师的能力证明。在实际应聘中,建议重点突出:
- 系统架构设计能力
- 算法硬件实现的优化思路
- 调试和问题解决的实际经验