目录
引言
有限脉冲响应(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 滤波器的特点:
- 仅依赖当前和过去的输入信号,无反馈路径。
- 计算复杂度较高,但适用于 FPGA 硬件实现。
- 线性相位特性,适用于 音频和图像处理。
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] →
优点:
- 节省资源,适用于 低成本 FPGA 设计。
- 功耗较低,适用于 移动设备和低功耗应用。
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
发表回复