毕业设计:集成FFT+FIR+IIR的完整DSP片上系统
本课是DSP数字信号处理课程的毕业设计项目,我们将集成前29课所学内容,设计一个完整的DSP片上系统(SoC)。该SoC包含FFT频谱分析引擎、FIR滤波器组、IIR均衡器、以及采样率转换器,实现从信号采集到频谱分析再到滤波输出的完整信号处理链路。
完整DSP SoC的系统架构如下:
| 模块 | 功能 | 来源课程 | 资源估算 |
|---|---|---|---|
| ADC接口 | 数据采集 | 第01课 | 2个IO引脚 |
| CIC抽取器 | 4倍降采样 | 第23课 | 0个乘法器 |
| FIR低通 | 抗混叠滤波 | 第07-09课 | 16个DSP48 |
| IIR均衡器 | 5段参数均衡 | 第13-16课 | 10个DSP48 |
| FFT引擎 | 256点频谱分析 | 第04-06课 | 8个DSP48+2BRAM |
| NCO | 本地振荡器 | 第01课 | 1BRAM+1DSP48 |
| 控制FSM | 系统调度 | 本课 | 100LUT |
//=============================================
// dsp_soc_top.v
// 完整DSP SoC顶层模块
// 集成:CIC+FIR+IIR+FFT
//=============================================
module dsp_soc_top #(
parameter DATA_WIDTH = 16,
parameter COEFF_WIDTH = 16,
parameter FFT_N = 256,
parameter OUT_WIDTH = 32
)(
input wire clk_100m, // 100MHz系统时钟
input wire rst_n,
// ADC接口
input wire signed [DATA_WIDTH-1:0] adc_data,
input wire adc_valid,
// DAC接口
output wire signed [DATA_WIDTH-1:0] dac_data,
output wire dac_valid,
// FFT结果输出
output wire signed [OUT_WIDTH-1:0] fft_mag,
output wire [$clog2(FFT_N)-1:0] fft_index,
output wire fft_valid,
// 控制接口
input wire [1:0] eq_band_sel,
input wire signed [COEFF_WIDTH-1:0] eq_gain
);
// 内部信号
wire signed [DATA_WIDTH-1:0] cic_out;
wire cic_valid;
wire signed [OUT_WIDTH-1:0] fir_out;
wire fir_valid;
wire signed [OUT_WIDTH-1:0] iir_out;
wire iir_valid;
// CIC抽取器(4倍降采样)
dsp_cic_decimator #(
.DATA_WIDTH(DATA_WIDTH),
.STAGES(3),
.DECIM_RATE(4)
) u_cic (
.clk(clk_100m), .rst_n(rst_n),
.data_valid(adc_valid), .data_in(adc_data),
.data_out(cic_out), .out_valid(cic_valid)
);
// FIR低通滤波器
dsp_fir_direct #(
.DATA_WIDTH(DATA_WIDTH),
.COEFF_WIDTH(COEFF_WIDTH),
.TAP(32),
.OUT_WIDTH(OUT_WIDTH)
) u_fir (
.clk(clk_100m), .rst_n(rst_n),
.data_valid(cic_valid), .data_in(cic_out),
.coeffs(fir_coeffs),
.data_out(fir_out), .out_valid(fir_valid)
);
// IIR均衡器
dsp_iir_eq5band #(
.DATA_WIDTH(OUT_WIDTH),
.COEFF_WIDTH(COEFF_WIDTH)
) u_iir (
.clk(clk_100m), .rst_n(rst_n),
.data_valid(fir_valid), .data_in(fir_out),
.band_sel(eq_band_sel), .gain(eq_gain),
.data_out(iir_out), .out_valid(iir_valid)
);
// FFT频谱分析器
dsp_fft_core #(
.N(FFT_N),
.DATA_WIDTH(DATA_WIDTH),
.TWIDDLE_WIDTH(COEFF_WIDTH)
) u_fft (
.clk(clk_100m), .rst_n(rst_n),
.fwd_inv(1'b0),
.data_valid(iir_valid),
.data_re_in(iir_out[DATA_WIDTH-1:0]),
.data_im_in(0),
.data_re_out(), .data_im_out(),
.out_valid(fft_valid), .fft_done()
);
// DAC输出选择(IIR均衡后输出)
assign dac_data = iir_out[DATA_WIDTH-1:0];
assign dac_valid = iir_valid;
endmodule//=============================================
// dsp_iir_eq5band.v
// 5段参数均衡器
// 每段为二阶IIR峰值/谷值滤波器
//=============================================
module dsp_iir_eq5band #(
parameter DATA_WIDTH = 32,
parameter COEFF_WIDTH = 16
)(
input wire clk,
input wire rst_n,
input wire data_valid,
input wire signed [DATA_WIDTH-1:0] data_in,
input wire [1:0] band_sel,
input wire signed [COEFF_WIDTH-1:0] gain,
output reg signed [DATA_WIDTH-1:0] data_out,
output reg out_valid
);
// 5个频段参数均衡器级联
// 频段1: 60Hz, 频段2: 250Hz, 频段3: 1kHz
// 频段4: 4kHz, 频段5: 16kHz
reg signed [DATA_WIDTH-1:0] band_out [0:4];
reg signed [COEFF_WIDTH-1:0] b0 [0:4];
reg signed [COEFF_WIDTH-1:0] b1 [0:4];
reg signed [COEFF_WIDTH-1:0] b2 [0:4];
reg signed [COEFF_WIDTH-1:0] a1 [0:4];
reg signed [COEFF_WIDTH-1:0] a2 [0:4];
reg signed [DATA_WIDTH-1:0] x1 [0:4];
reg signed [DATA_WIDTH-1:0] x2 [0:4];
reg signed [DATA_WIDTH-1:0] y1 [0:4];
reg signed [DATA_WIDTH-1:0] y2 [0:4];
integer i;
initial begin
// 默认平直增益(bypass)
for (i = 0; i < 5; i = i + 1) begin
b0[i] = 16'sd32768; b1[i] = 0; b2[i] = 0;
a1[i] = 0; a2[i] = 0;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (i = 0; i < 5; i = i + 1) begin
x1[i] <= 0; x2[i] <= 0;
y1[i] <= 0; y2[i] <= 0;
band_out[i] <= 0;
end
data_out <= 0; out_valid <= 1'b0;
end else if (data_valid) begin
band_out[0] <= data_in; // 第一级输入
for (i = 0; i < 5; i = i + 1) begin
band_out[i] <= b0[i]*band_out[i] + b1[i]*x1[i] + b2[i]*x2[i]
- a1[i]*y1[i] - a2[i]*y2[i];
x2[i] <= x1[i];
x1[i] <= band_out[i];
y2[i] <= y1[i];
y1[i] <= band_out[i];
end
data_out <= band_out[4];
out_valid <= 1'b1;
end else out_valid <= 1'b0;
end
endmoduleDSP SoC的集成验证需要分层进行:
| 资源 | 使用量 | 可用量 | 利用率 |
|---|---|---|---|
| DSP48E1 | 35 | 240 | 14.6% |
| BRAM18 | 8 | 135 | 5.9% |
| LUT | 5000 | 63400 | 7.9% |
| FF | 4000 | 126800 | 3.2% |
恭喜你完成了全部30课的DSP数字信号处理课程!让我们回顾一下学习之旅:
将所有模块集成到dsp_soc_top中,完成编译和综合。
在FPGA开发板上实现完整DSP SoC,用音频输入验证均衡器效果。
分析SoC的关键路径,通过流水线优化将工作频率提升到200MHz。
添加UART控制接口,允许通过串口实时调整均衡器参数。
✅ 完成了全部30课的DSP数字信号处理课程
✅ 实现了完整的DSP SoC片上系统
✅ 掌握了从理论到硬件的完整设计流程
✅ 具备了独立设计复杂数字信号处理系统的能力
✅ 你已经是合格的DSP硬件工程师了!🎉
在基础SoC实现之上,还可以进行以下进阶优化:
在整个课程的学习中,最重要的经验总结:
毕业设计答辩需要准备以下材料:
完成本课程后,你已具备以下职业能力: