转置型FIR——消除关键路径的流水线架构
转置定理:将信号流图所有支路方向反转,输入输出互换,系统函数不变。对直接型FIR应用转置得到转置型结构。
| 特性 | 直接型 | 转置型 |
|---|---|---|
| 关键路径 | T_mult+log₂(M)·T_add | T_mult+T_add |
| 流水线友好 | 需额外寄存器 | 天然流水线 |
| 数据流 | 先延迟后乘 | 先乘后延迟 |
| 输入扇出 | 到所有乘法器 | 仅1个乘法器 |
//=============================================
// dsp_fir_transpose.v
// FIR转置型滤波器
// 关键路径:1个乘法器+1个加法器
//=============================================
module dsp_fir_transpose #(
parameter DATA_WIDTH = 16,
parameter COEFF_WIDTH = 16,
parameter TAP = 16,
parameter OUT_WIDTH = 32
)(
input wire clk,
input wire rst_n,
input wire data_valid,
input wire signed [DATA_WIDTH-1:0] data_in,
input wire signed [COEFF_WIDTH-1:0] coeffs [0:TAP-1],
output reg signed [OUT_WIDTH-1:0] data_out,
output reg out_valid
);
reg signed [OUT_WIDTH-1:0] acc_chain [0:TAP-1];
integer i;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (i=0;i<TAP;i=i+1) acc_chain[i]<=0;
data_out<=0; out_valid<=1'b0;
end else if (data_valid) begin
acc_chain[0] <= data_in*coeffs[TAP-1];
for (i=1;i<TAP;i=i+1)
acc_chain[i] <= acc_chain[i-1]+data_in*coeffs[TAP-1-i];
data_out <= acc_chain[TAP-1];
out_valid <= 1'b1;
end else out_valid <= 1'b0;
end
endmodule
//=============================================
// dsp_fir_transpose_pipe.v
// 流水线转置型FIR
//=============================================
module dsp_fir_transpose_pipe #(
parameter DATA_WIDTH = 16,
parameter COEFF_WIDTH = 16,
parameter TAP = 16,
parameter OUT_WIDTH = 32,
parameter PIPE_STAGES = 2
)(
input wire clk,
input wire rst_n,
input wire data_valid,
input wire signed [DATA_WIDTH-1:0] data_in,
input wire signed [COEFF_WIDTH-1:0] coeffs [0:TAP-1],
output reg signed [OUT_WIDTH-1:0] data_out,
output reg out_valid
);
reg signed [DATA_WIDTH-1:0] x_reg;
reg x_valid;
reg signed [OUT_WIDTH-1:0] acc [0:TAP-1];
reg signed [OUT_WIDTH-1:0] pipe_delay [0:PIPE_STAGES-1];
reg [PIPE_STAGES:0] valid_shift;
integer i;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
x_reg<=0; x_valid<=0;
for (i=0;i<TAP;i=i+1) acc[i]<=0;
for (i=0;i<PIPE_STAGES;i=i+1) pipe_delay[i]<=0;
data_out<=0; out_valid<=0; valid_shift<=0;
end else begin
x_reg <= data_in; x_valid <= data_valid;
if (x_valid) begin
acc[0] <= x_reg*coeffs[TAP-1];
for (i=1;i<TAP;i=i+1)
acc[i] <= acc[i-1]+x_reg*coeffs[TAP-1-i];
end
pipe_delay[0] <= acc[TAP-1];
for (i=1;i<PIPE_STAGES;i=i+1) pipe_delay[i]<=pipe_delay[i-1];
data_out <= pipe_delay[PIPE_STAGES-1];
valid_shift <= {valid_shift[PIPE_STAGES:0],data_valid};
out_valid <= valid_shift[PIPE_STAGES];
end
end
endmodule
| 需求 | 推荐结构 | 理由 |
|---|---|---|
| 低功耗/低面积 | 对称直接型 | 乘法器最少 |
| 高频率(>300MHz) | 转置型/流水线 | 关键路径最短 |
| 大阶数(>64) | DA或时分复用 | 资源受限折衷 |
| FPGA实现 | 转置型+DSP级联 | 利用DSP48级联 |
手动验证3阶FIR h[n]={1,2,3}的转置型与直接型输出一致,输入x[n]={1,0,0}。
32阶FIR,乘法器4ns,加法器1.5ns。比较直接型与转置型的最大时钟频率。
估算64阶转置型FIR在Xilinx FPGA上的资源(DSP slice+BRAM)。
设计前半转置+后半对称的混合FIR结构,分析关键路径。
✅ 理解了转置定理及其在FIR中的应用
✅ 掌握了转置型FIR的关键路径优势
✅ 实现了转置型和流水线转置型FIR
✅ 能对比分析直接型与转置型性能
✅ 理解了转置型的定点数值特性
✅ 掌握了FIR结构选择的工程决策
转置型因其短关键路径,在高速FIR设计中占主导地位。典型应用场景:
| 配置 | 面积(DSP+LUT) | Fmax(MHz) | 功耗(mW) |
|---|---|---|---|
| 直接型无优化 | 16 DSP | 120 | 85 |
| 直接型+对称 | 8 DSP | 120 | 52 |
| 转置型 | 16 DSP | 280 | 95 |
| 转置型+2级流水 | 16 DSP+200LUT | 420 | 120 |
| 转置型+对称 | 8 DSP | 280 | 60 |
Systolic阵列是转置型的进一步推广,每个处理单元包含完整的乘法器+加法器+寄存器,数据在相邻单元间流动。优点:(1)极度规整的布局;(2)局部互连,布线短;(3)天然流水线,频率极高;(4)易于扩展阶数。缺点:面积开销大,每级都需要寄存器。
转置型因其短关键路径,在高速FIR设计中占主导地位:
| 配置 | DSP数 | Fmax(MHz) | 功耗(mW) |
|---|---|---|---|
| 直接型无优化 | 16 | 120 | 85 |
| 直接型+对称 | 8 | 120 | 52 |
| 转置型 | 16 | 280 | 95 |
| 转置型+2级流水 | 16+200LUT | 420 | 120 |
| 转置型+对称 | 8 | 280 | 60 |
Systolic阵列是转置型的进一步推广,每个处理单元包含完整乘法器+加法器+寄存器,数据在相邻单元间流动。优点:(1)极度规整布局;(2)局部互连布线短;(3)天然流水线频率极高;(4)易于扩展阶数。缺点:面积开销大。适用于ASIC实现,不太适合FPGA(DSP slice不支持systolic映射)。
转置型的累加器链在定点实现中有独特的数值特性:
对于16位数据×16位系数的32阶FIR:最终累加器需要16+16+5=37位。输出截断到32位时,动态范围约192dB。
结合直接型和转置型的优势:
设计规格:fs=100MHz,通带0-20MHz,阻带25MHz以上,通带波纹0.1dB,阻带衰减60dB
两种结构的输出应完全一致(在定点精度范围内)。验证方法:
在HLS(高层次综合)工具中,可以通过directive自动将直接型FIR转换为转置型。Vivado HLS的PIPELINE指令会自动在循环间插入寄存器,等效于转置变换。对于手动转换,关键步骤是:(1)将所有延迟单元从输入侧移到输出侧;(2)将加法树改为累加链;(3)调整数据流方向。综合工具通常能自动识别FIR模式并应用最优映射。
FIR转置型结构在进阶应用中还有以下重要主题值得深入研究:
本课内容在整个DSP课程体系中处于承上启下的位置:
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。
在实际工程中,FIR转置型结构的设计经验总结如下:(1)始终从系统级需求出发,不要过早陷入实现细节;(2)先用浮点仿真验证算法正确性,再转为定点;(3)系数量化后必须重新验证频率响应;(4)硬件实现前用C/MATLAB模型作为参考;(5)综合后检查时序和资源是否符合预期;(6)板级验证时用已知的测试信号对比参考输出。每一步验证都是必要的,跳过任何一步都可能导致最终的调试时间成倍增加。