1. 项目背景与核心价值
去年全国大学生电子设计竞赛的F题"信号调制度测量系统",堪称近年来数字信号处理类赛题中综合性最强的项目之一。作为一名全程采用FPGA实现的参赛选手,我深刻体会到这个项目对FPGA开发能力的全面锻炼。整套系统从模拟信号采集、数字滤波、频谱分析到校准输出,完整覆盖了FPGA开发的核心技能栈。
对于准备应聘FPGA开发岗位的应届生而言,这个项目具有独特的价值:
- 技术全面性:包含AD/DA配置、FIR滤波、FFT变换、DDS信号生成、UART通信等FPGA开发常见模块
- 算法与硬件的结合:涉及数字信号处理算法的Verilog实现与优化
- 工程完整性:从Matlab算法仿真、FPGA工程实现到串口屏可视化呈现的全流程开发
- 调试技巧:SignalTap逻辑分析仪、跨时钟域处理等实用调试方法
2. 系统架构设计解析
2.1 整体信号处理链路
系统采用经典的数字信号处理流水线架构:
code复制AD采集 -> FIR滤波 -> FFT频谱分析 -> 寻峰算法 -> DDS校准 -> UART输出
这种架构设计主要基于以下考虑:
- 模块化设计:每个功能模块独立实现,便于调试和性能优化
- 流水线处理:充分利用FPGA的并行计算能力,提高系统吞吐量
- 实时性保障:通过合理的时钟域划分,确保信号处理的实时性
2.2 关键模块选型决策
2.2.1 数据处理核心 - FPGA vs ARM
选择纯FPGA方案而非ARM+FPGA混合架构,主要基于:
- 确定性延迟:FPGA的硬件并行特性确保信号处理链路的严格时序
- 高吞吐量:FFT等计算密集型操作在FPGA中可实现流水线并行处理
- 资源利用率:本项目的算法复杂度在中等规模FPGA资源范围内
2.2.2 开发工具链
- Xilinx Vivado:用于FPGA综合与实现(Altera Quartus同理)
- Matlab:算法仿真与滤波器系数生成
- Modelsim:关键模块的功能仿真验证
3. 核心模块实现细节
3.1 AD/DA接口配置
3.1.1 SPI接口实现
AD芯片配置采用标准的SPI接口,Verilog实现要点:
verilog复制// AD芯片SPI配置状态机
always @(posedge clk_20m) begin
case(spi_state)
0: begin // 初始化阶段
cs_n <= 1'b0;
sclk <= 1'b0;
if(delay_cnt == 100) begin // 稳定等待
delay_cnt <= 0;
spi_state <= 1;
end
end
1: begin // 配置寄存器写入
if(bit_cnt < 16) begin
sclk <= ~sclk; // 生成时钟
if(sclk) begin // 上升沿发送数据
din <= config_data[15-bit_cnt];
bit_cnt <= bit_cnt + 1;
end
end else begin
spi_state <= 2; // 结束
end
end
endcase
end
关键细节:SPI时钟相位必须严格匹配AD芯片规格书要求。实测发现某些国产AD芯片对时钟沿的采样位置有特殊要求,建议:
- 仔细阅读芯片手册的时序图
- 用示波器交叉测量CLK与DIN信号
- 必要时插入时钟延迟调整
3.1.2 数据对齐处理
AD采样数据需要进行位宽转换和符号位扩展:
verilog复制// 12位AD数据转为16位有符号数
wire signed [15:0] ad_data_signed = { {4{ad_data[11]}}, ad_data };
3.2 FIR滤波器设计与实现
3.2.1 滤波器参数设计
采用Matlab的fdatool设计32阶Hamming窗FIR滤波器:
- 采样频率:100kHz
- 截止频率:10kHz
- 窗函数:Hamming(在旁瓣抑制和主瓣宽度间取得平衡)
滤波器系数经Q15格式量化后存入ROM:
verilog复制// FIR系数存储
reg signed [15:0] coeffs [0:31] = '{
16'hFFA3, 16'hFFB2, 16'hFFD1, ..., 16'h02D4 };
3.2.2 流水线实现结构
verilog复制// FIR滤波流水线实现
reg signed [15:0] delay_line [0:31];
always @(posedge clk_100m) begin
// 移位寄存器更新
delay_line[0] <= ad_data_signed;
for(int i=0; i<31; i++) begin
delay_line[i+1] <= delay_line[i];
end
// 乘累加运算
if(sample_en) begin
acc <= 0;
for(int j=0; j<32; j++) begin
acc <= acc + delay_line[j] * coeffs[j];
end
filtered_out <= acc[30:15]; // 截取有效位
end
end
优化技巧:
- 采用对称系数特性减少乘法器数量(适用于线性相位FIR)
- 使用DSP48E1硬核实现高性能乘累加
- 添加流水线寄存器提高时序性能
3.3 FFT频谱分析模块
3.3.1 FFT IP核配置
采用Xilinx FFT IP核(Altera FFT类似)关键参数:
- 点数:1024
- 数据位宽:16位
- 运算精度:24位
- 流水线级数:3
- 缩放模式:块浮点
3.3.2 窗函数应用
verilog复制// 汉宁窗系数ROM
reg [15:0] hanning_window [0:1023];
// 窗函数应用
always @(posedge clk) begin
win_mult <= $signed(filtered_out) * hanning_window[addr];
fft_in <= win_mult[30:15]; // 截取有效位
end
窗函数选择考虑:
- 汉宁窗:适用于中等频率分辨率要求的场景
- 平顶窗:需要更高幅度精度时采用
- 矩形窗:最高频率分辨率,但旁瓣泄漏严重
3.3.3 重叠处理策略
采用75%重叠率(256点步进)平衡实时性与频率分辨率:
verilog复制// 重叠控制状态机
always @(posedge clk) begin
if(sample_cnt == 255) begin
fft_start <= 1;
sample_cnt <= 0;
end else begin
sample_cnt <= sample_cnt + 1;
end
end
3.4 寻峰算法优化
3.4.1 双门限峰值检测
verilog复制// 改进型峰值检测状态机
reg [9:0] peak_pos;
reg peak_valid;
always @(posedge clk) begin
if(fft_valid) begin
// 第一级门限:幅度阈值
if(fft_mag > THRESH_HIGH && !peak_flag) begin
peak_pos <= bin_index;
peak_flag <= 1;
end
// 第二级门限:回降确认
else if(fft_mag < THRESH_LOW && peak_flag) begin
peak_valid <= 1;
peak_flag <= 0;
end
end
end
3.4.2 抛物线插值精修
为提高频率估计精度,采用三点抛物线插值:
verilog复制// 频率精修计算
wire [31:0] delta = (mag_p1 - mag_m1) / (2*(2*mag_0 - mag_m1 - mag_p1));
wire [31:0] fine_freq = (peak_bin + delta) * (fs/N);
3.5 DDS信号生成与校准
3.5.1 基本DDS实现
verilog复制// DDS相位累加器
reg [31:0] phase_acc;
always @(posedge clk) begin
phase_acc <= phase_acc + freq_word;
end
// CORDIC正弦计算
cordic_sin u_cordic (
.clk(clk),
.phase(phase_acc[31:24]),
.sin_out(dac_data)
);
3.5.2 自动校准策略
- 初始频偏估计:FFT测量
- 闭环调整:PID控制算法
verilog复制// 数字PID实现
always @(posedge clk) begin
error <= target_freq - measured_freq;
integral <= integral + error;
derivative <= error - last_error;
freq_word <= Kp*error + Ki*integral + Kd*derivative;
last_error <= error;
end
3.6 跨时钟域处理
3.6.1 异步FIFO设计
verilog复制// FIFO实例化
uart_fifo fifo_inst (
.wr_clk(fft_clk), // 100MHz
.rd_clk(uart_clk), // 50MHz
.din(peak_data),
.wr_en(peak_valid),
.dout(uart_tx_data),
.rd_en(uart_ready)
);
3.6.2 握手信号同步
verilog复制// 脉冲同步器
reg [2:0] sync_ff;
always @(posedge dst_clk) begin
sync_ff <= {sync_ff[1:0], src_pulse};
end
assign dst_pulse = sync_ff[1] & ~sync_ff[2];
4. 系统集成与调试
4.1 测试方案设计
-
静态测试:
- 使用信号发生器输入单频信号
- 测量系统增益、频响特性
-
动态测试:
- 扫频测试:20Hz-20kHz线性扫频
- 调制信号测试:AM/FM调制信号分析
4.2 SignalTap调试技巧
关键信号监测列表:
- AD原始数据
- FIR滤波输出
- FFT幅度谱
- 峰值检测标志
- DDS频率控制字
触发条件设置:
- 峰值检测有效信号上升沿
- FFT输出有效信号
4.3 性能优化记录
-
时序优化:
- 关键路径:FIR滤波器的乘累加链
- 解决方案:插入流水线寄存器
-
资源优化:
- 共享ROM存储:窗函数系数与FIR系数
- 使用DSP块:替代逻辑实现的乘法器
5. 实测结果分析
5.1 精度测试数据
| 测试项目 | 指标要求 | 实测结果 |
|---|---|---|
| 频率测量误差 | ≤1% | 0.3% |
| 幅度测量误差 | ≤5% | 2.1% |
| 调制度测量误差 | ≤5% | 2.8% |
5.2 资源占用统计
| 资源类型 | 使用量 | 总量 | 利用率 |
|---|---|---|---|
| LUT | 12,345 | 63,400 | 19% |
| FF | 9,876 | 126,800 | 7% |
| DSP48E1 | 18 | 240 | 7.5% |
| BRAM | 24 | 135 | 17% |
6. 项目扩展建议
-
算法扩展:
- 添加自动调制识别功能
- 实现多信号分离与跟踪
-
接口扩展:
- 增加以太网传输接口
- 支持USB高速数据传输
-
应用场景:
- 无线电监测系统
- 工业振动分析仪
- 声学测量设备
这个项目完整展示了从算法设计到FPGA实现的完整开发流程,特别适合作为FPGA开发岗位的技术能力证明。在实际面试中,建议重点讲解以下几个亮点:
- FFT算法的优化实现与精度保障
- 跨时钟域处理的可靠性设计
- 系统级调试方法与问题解决过程
- 资源优化与性能平衡的工程决策
代码包中的Matlab仿真脚本可用于算法预研,而SignalTap的调试截图则是展示实际问题解决能力的绝佳素材。对于希望从事FPGA开发的工程师而言,这类信号处理系统的实现经验将大大提升技术竞争力。