目录

  1. 引言
  2. FIR 滤波器基本概念
  3. FIR 滤波器的硬件实现
  4. Verilog 串行 FIR 滤波器实现
  5. 优化方案
  6. 参考资料

引言

有限脉冲响应(Finite Impulse Response, FIR)滤波器是数字信号处理(DSP)中的关键模块,广泛应用于 音频信号处理、通信系统、图像处理 等领域。FIR 滤波器可以通过 串行(Serial)或并行(Parallel) 的方式实现。

  • 串行 FIR 结构计算 一个乘法-累加(MAC) 操作需要多个时钟周期,占用较少硬件资源,适用于 低功耗 FPGA/ASIC 设计
  • 并行 FIR 结构可以在 一个时钟周期内计算完整 FIR 输出,提高吞吐量,但 资源占用较大

本文重点介绍 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. 计算复杂度较高,但适用于 FPGA 硬件实现
  3. 线性相位特性,适用于 音频和图像处理

3.2 FIR 滤波器的硬件架构

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

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

3.3 串行 FIR 结构

串行 FIR 计算方式:

  • 在 多个时钟周期内 完成 FIR 计算,每个时钟周期进行 一次乘法-累加(MAC) 操作。
  • 适用于 低功耗 FPGA/ASIC 设计,节省 乘法器(DSP 资源)

串行 FIR 结构示意图(以 4 阶 FIR 为例):

         x[n] → [移位寄存器] → (×) h[0] → (+)  
                 x[n-1] → (×) h[1] → (+)  
                 x[n-2] → (×) h[2] → (+) → y[n]
                 x[n-3] → (×) h[3] →  

优点:

  1. 节省资源,适用于 低成本 FPGA 设计
  2. 功耗较低,适用于 移动设备和低功耗应用

Verilog 串行 FIR 滤波器实现

module fir_serial #(
    parameter N = 4,  // 滤波器阶数
    parameter WIDTH = 16  // 数据位宽
)(
    input clk,
    input rst,
    input valid,  // 输入信号有效位
    input signed [WIDTH-1:0] x,  // 输入信号
    output reg signed [WIDTH-1:0] y  // 输出信号
);

    // FIR 滤波系数(可存储在 ROM 或 DSP 块中)
    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];

    // 乘法器和累加器
    reg signed [WIDTH-1:0] acc;
    reg [2:0] counter;

    integer i;

    always @(posedge clk or posedge rst) begin
        if (rst) begin
            y <= 0;
            acc <= 0;
            counter <= 0;
        end else if (valid) begin
            // 数据移位
            x_reg[0] <= x;
            for (i = 1; i < N; i = i + 1)
                x_reg[i] <= x_reg[i-1];

            // 计算 FIR 乘法-累加
            if (counter == 0) acc <= 0;
            acc <= acc + (x_reg[counter] * h[counter]);

            // 计数器累加
            counter <= counter + 1;

            // 计算完成,更新输出
            if (counter == N-1) begin
                y <= acc;
                counter <= 0;
            end
        end
    end

endmodule


优化方案

1. 流水线优化

  • 可以对 移位寄存器和乘法器 进行流水线优化,提高时钟频率。

2. 使用 DSP 块优化乘法

  • FPGA 具备 DSP 乘法单元,可用 (* use_dsp = "yes" *) 指定 DSP 块加速 乘法计算。
(* use_dsp = "yes" *)
assign mul = x_reg[counter] * h[counter];

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. 节能模式

  • 仅在 valid 信号有效时进行 FIR 计算,减少功耗。
if (valid) begin
    acc <= acc + (x_reg[counter] * h[counter]);
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