目录
引言
有限脉冲响应(Finite Impulse Response, FIR)滤波器是信号处理中的重要模块,广泛应用于 音频处理、图像处理、通信系统 等领域。传统 FIR 采用串行结构,计算效率较低,而 并行 FIR 结构 能够显著提高计算速度,适用于高性能 FPGA/ASIC 设计。本文介绍 Verilog 并行 FIR 滤波器设计方法,并提供完整代码示例。
FIR 滤波器基本概念
3.1 FIR 滤波器的数学模型
FIR 滤波器的数学表达式如下:y[n]=∑k=0N−1h[k]⋅x[n−k]
其中:
- x[n] 为输入信号
- y[n] 为输出信号
- h[k] 为滤波器系数(滤波器脉冲响应)
- N 为滤波器阶数
FIR 具有以下特点:
- 仅依赖当前和过去的输入信号,不需要反馈路径。
- 适用于高稳定性和线性相位应用场景。
3.2 FIR 滤波器的硬件架构
FIR 滤波器的基本结构由 移位寄存器、乘法器、加法器 组成,如下所示:
输入信号 → [移位寄存器] → [乘法器阵列] → [加法器] → 输出信号
在 FPGA 设计中,主要有 串行 和 并行 两种 FIR 结构:
- 串行 FIR(Serial FIR):每个时钟周期计算一部分输出,计算时间较长。
- 并行 FIR(Parallel FIR):每个时钟周期计算完整输出,提高吞吐量,但资源占用较大。
并行 FIR 结构如下图所示(以 4 级 FIR 为例):
x[n] → h[0] →(×)→
x[n-1] → h[1] →(×)→
x[n-2] → h[2] →(×)→ (+) → y[n]
x[n-3] → h[3] →(×)→
Verilog 并行 FIR 滤波器设计
4.1 并行 FIR 结构
并行 FIR 采用 全并行计算,在单个时钟周期内完成 所有乘法和加法运算。
module fir_parallel #(
parameter N = 4, // 滤波器阶数
parameter WIDTH = 16 // 数据位宽
)(
input clk,
input rst,
input signed [WIDTH-1:0] x, // 输入信号
output reg signed [WIDTH-1:0] y // 输出信号
);
reg signed [WIDTH-1:0] h[N-1:0] = {16'd3, 16'd2, 16'd1, 16'd1}; // 滤波系数
reg signed [WIDTH-1:0] x_reg[N-1:0]; // 输入数据移位寄存器
wire signed [WIDTH-1:0] mul[N-1:0]; // 乘法结果
reg signed [WIDTH-1:0] sum; // 加法累加器
integer i;
always @(posedge clk or posedge rst) begin
if (rst) begin
for (i = 0; i < N; i = i + 1)
x_reg[i] <= 0;
end else begin
x_reg[0] <= x;
for (i = 1; i < N; i = i + 1)
x_reg[i] <= x_reg[i-1]; // 数据移位
end
end
// 并行乘法计算
generate
genvar j;
for (j = 0; j < N; j = j + 1) begin
assign mul[j] = x_reg[j] * h[j];
end
endgenerate
// 加法累加
always @(*) begin
sum = 0;
for (i = 0; i < N; i = i + 1)
sum = sum + mul[i];
end
always @(posedge clk or posedge rst) begin
if (rst)
y <= 0;
else
y <= sum;
end
endmodule
优化方法
1. 流水线优化
- 将乘法和加法拆分为多个阶段,提高时钟频率。
- 适用于高阶 FIR,如 32 阶、64 阶 FIR 设计。
2. 使用 DSP 块优化乘法
- FPGA 具备 DSP 乘法单元,可用
(* use_dsp = "yes" *)
指定乘法运算在 DSP 块中执行。 - 提高计算效率,减少逻辑资源消耗。
(* use_dsp = "yes" *)
assign mul[j] = x_reg[j] * h[j];
3. 使用 ROM 预存系数
- 滤波系数可以存储在 ROM(Block RAM),减少寄存器使用量。
reg signed [WIDTH-1:0] h[N-1:0];
initial begin
h[0] = 16'd3;
h[1] = 16'd2;
h[2] = 16'd1;
h[3] = 16'd1;
end
4. 可变系数 FIR(可配置滤波器)
- 允许动态更改滤波系数,适用于 自适应滤波 和 均衡器 设计。
input signed [WIDTH-1:0] h_in[N-1:0];
always @(posedge clk) begin
if (load_coeff) // 载入新滤波器系数
h <= h_in;
end
发表回复