
最近在搞 FPGA 上的 FIR 数字滤波器设计,不得不说,这玩意儿还是挺有意思的。FIR 滤
波器在数字信号处理中应用广泛,设计起来也相对简单,尤其是用 FPGA 实现,灵活性很
高。今天就来聊聊怎么用 Quartus 和 Vivado 来实现 FIR 滤波器,顺便分享一下从
MATLAB 生成系数到仿真成功的整个过程。
首先,FIR 滤波器的核心就是它的系数。我们通常会用 MATLAB 来设计这些系数。
MATLAB 里有个`fir1`函数,可以很方便地生成 FIR 滤波器的系数。比如,我们设计一个低
通滤波器,截止频率是 0.2π,阶数是 20,代码可以这么写:
```matlab
n = 20; % 滤波器阶数
Wn = 0.2; % 截止频率
b = fir1(n, Wn); % 生成滤波器系数
```
生成系数后,我们可以把这些系数导出到文件中,供 FPGA 设计使用。MATLAB 里可以用
`dlmwrite`函数把系数保存为文本文件:
```matlab
dlmwrite('fir_coefficients.txt', b, 'precision', '%.16f');
```
接下来就是 FPGA 部分了。我们先看 Quartus 的实现。在 Quartus 中,我们可以用 Verilog
来编写 FIR 滤波器的代码。FIR 滤波器的实现其实就是卷积运算,每个输入样本与滤波器
系数相乘并累加。下面是一个简单的 FIR 滤波器的 Verilog 代码:
```verilog
module fir_filter (
input clk,
input rst,
input signed [15:0] data_in,
output reg signed [31:0] data_out
);
reg signed [15:0] shift_reg [0:20];
integer i;
always @(posedge clk or posedge rst) begin
if (rst) begin
for (i = 0; i <= 20; i = i + 1) begin
shift_reg[i] <= 16'b0;
end