目录

  1. 引言
  2. FIR 滤波器基本概念
  3. FIR 滤波器的结构与实现
  4. Verilog 并行 FIR 滤波器设计
  5. 优化方法
  6. 参考资料

引言

有限脉冲响应(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 具有以下特点:

  1. 仅依赖当前和过去的输入信号,不需要反馈路径。
  2. 适用于高稳定性和线性相位应用场景。

3.2 FIR 滤波器的硬件架构

FIR 滤波器的基本结构由 移位寄存器、乘法器、加法器 组成,如下所示:

输入信号 → [移位寄存器] → [乘法器阵列] → [加法器] → 输出信号

在 FPGA 设计中,主要有 串行 和 并行 两种 FIR 结构:

  1. 串行 FIR(Serial FIR):每个时钟周期计算一部分输出,计算时间较长。
  2. 并行 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


参考资料

  1. Digital Signal Processing – John G. Proakis
  2. Xilinx FIR Compiler IP
  3. ASIC-World: Verilog FIR Filter
  4. FPGA DSP Design with Verilog