基于 FPGA 的并行 FIR 滤波器设计与实现
在数字信号处理领域,FIR(有限脉冲响应)滤波器是核心组件之一。利用 FPGA 实现并行 FIR 滤波器设计可显著提升性能。本文介绍从 MATLAB 仿真到 FPGA 实现的完整流程。
MATLAB 仿真
MATLAB 在数字信号处理中用于快速验证滤波器设计思路。以下是一个低通 FIR 滤波器的设计示例:
% 设计低通 FIR 滤波器
fc = 0.2; % 截止频率
N = 50; % 滤波器阶数
h = fir1(N, fc);
freqz(h); % 绘制频率响应
其中,fir1 函数用于设计 FIR 滤波器,N 决定复杂度与性能,fc 为截止频率。freqz 用于绘制频率响应,直观展示滤波器对不同频率信号的处理效果。
FPGA 实现
FPGA 实现中,乘法 IP 核的配置是关键环节。以 Xilinx FPGA 为例,在 Vivado 工具中配置乘法 IP 核时,需指定输入输出数据的位宽。假设输入为 16 位定点数,输出为 32 位定点数,可在 IP 核配置界面相应设置。

以下是基于 Verilog 的 FIR 滤波器实现代码:
module fir_filter (
input wire clk,
input wire rst,
input wire [15:0] in_data,
output reg [31:0] out_data
);
reg [15:0] coeffs [0:49]; // 假设 50 阶滤波器
reg [15:0] delay_line [0:49];
integer i;
always @(posedge clk or posedge rst) begin
if (rst) begin
for (i = 0; i < 50; i = i + 1) begin
delay_line[i] <= 16'd0;
end
out_data <= 32'd0;
end else begin
for (i = 49; i > 0; i = i - 1) begin
delay_line[i] <= delay_line[i - 1];
end
delay_line[0] <= in_data;
out_data = 32'd0;
for (i = 0; i < 50; i = i + 1) begin
out_data = out_data + (delay_line[i] * coeffs[i]);
end
end
end
endmodule
代码中 clk 为时钟信号,rst 为复位信号,in_data 为 16 位输入数据,out_data 为 32 位输出数据。coeffs 存放滤波器系数,delay_line 存储延时数据。复位操作清空延时线和输出数据;正常工作时,输入数据在延时线中移动,与系数相乘并累加得到输出结果。
ModelSim 仿真实现
使用 ModelSim 验证 FPGA 实现的正确性。首先编写测试平台(Testbench):
module tb_fir_filter;
reg clk;
reg rst;
reg [15:0] in_data;
wire [31:0] out_data;
fir_filter uut (
.clk(clk),
.rst(rst),
.in_data(in_data),
.out_data(out_data)
);
initial begin
clk = 0;
forever #5 clk = ~clk; // 10ns 周期,100MHz 时钟
end
initial begin
rst = 1;
in_data = 16'd0;
#20;
rst = 0;
for (int i = 0; i < 100; i++) begin
in_data = $random % 32768;
#10;
end
#100;
$stop;
end
endmodule


