目录
引言
有限脉冲响应(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 滤波器的基本结构由 移位寄存器、乘法器、加法器 组成,如下所示:
1 | 输入信号 → [移位寄存器] → [乘法器阵列] → [加法器] → 输出信号 |
在 FPGA 设计中,主要有 串行 和 并行 两种 FIR 结构:
- 串行 FIR(Serial FIR):每个时钟周期计算一部分输出,计算时间较长。
- 并行 FIR(Parallel FIR):每个时钟周期计算完整输出,提高吞吐量,但资源占用较大。
并行 FIR 结构如下图所示(以 4 级 FIR 为例):
1 2 3 4 | 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 采用 全并行计算,在单个时钟周期内完成 所有乘法和加法运算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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 块中执行。 - 提高计算效率,减少逻辑资源消耗。
1 2 | (* use_dsp = "yes" *) assign mul[j] = x_reg[j] * h[j]; |
3. 使用 ROM 预存系数
- 滤波系数可以存储在 ROM(Block RAM),减少寄存器使用量。
1 2 3 4 5 6 7 | 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(可配置滤波器)
- 允许动态更改滤波系数,适用于 自适应滤波 和 均衡器 设计。
1 2 3 4 5 | input signed [WIDTH-1:0] h_in[N-1:0]; always @(posedge clk) begin if (load_coeff) // 载入新滤波器系数 h <= h_in; end |
发表回复