FIR 低通滤波器 Verilog MATLAB 设计
名称:FIR 低通滤波器 Verilog MATLAB 设计
语言:Verilog
功能介绍
本设计实现一个 21 抽头线性相位 FIR 低通滤波器,采样频率为 100 kHz,通带截止频率为 20 kHz,阻带起始频率为 30 kHz。设计指标要求通带最大衰减不超过 1 dB、阻带衰减不低于 50 dB;MATLAB 设计结果的通带波动范围为 0.6484 dB、通带最大衰减为 0.3295 dB、阻带衰减为 53.7345 dB。 工程提供基础 FIR、对称系数优化及缩放饱和输出等 RTL 实现,并包含 MATLAB 系数设计与量化脚本,以及针对单音、通带、阻带和混合频率输入的仿真测试平台。对称版本利用 21 抽头系数的线性相位对称性,将样本成对相加后参与乘加;缩放版本则在 Q15 累加后进行算术右移,并将结果限制在 16 位有符号范围内。 设计流程覆盖滤波器指标建模、Q15 系数量化、RTL 定点实现和仿真检查。混合信号测试使用 10 kHz 通带分量与 35 kHz 阻带分量,便于检查滤波器对通带信号的保留能力和对阻带信号的抑制效果。运行环境
硬件描述语言:Verilog。滤波器系数由 MATLAB 脚本设计并量化为 Q15 格式;仿真测试平台按项目提供的脚本与测试文件运行。设计思路
设计采用线性相位 FIR 低通滤波器结构,目标指标为采样频率 100 kHz、通带截止频率 20 kHz、阻带起始频率 30 kHz,通带最大衰减不超过 1 dB、阻带衰减不低于 50 dB。MATLAB 使用 Parks-McClellan 等波纹方法搜索满足指标的最小阶数,得到 20 阶、21 抽头的滤波器;设计结果通带波动范围为 0.6484 dB,通带最大衰减为 0.3295 dB,阻带衰减为 53.7345 dB。 系数经 Q15 定点量化后写入 Verilog。RTL 通过移位寄存器保存输入采样历史,并对对称系数对应的样本先求和再乘系数,利用线性相位对称性减少乘法运算。累加结果保留为原始乘加值;另有缩放输出版本实现 Q15 右移恢复和 16 位饱和处理,适用于定点流式滤波。 验证方案通过仿真输入 10 kHz 通带正弦与 35 kHz 阻带正弦的叠加信号,观察滤波后通带分量保留、阻带分量抑制的情况,并在输入结束后补零冲洗延时线。模块结构
设计由 MATLAB 系数设计脚本、FIR RTL 和仿真测试平台组成。RTL 顶层包括基础实现 `fir_top`、对称系数实现 `fir_top_symm` 和带 Q15 缩放及饱和输出的 `fir_top_scaled`。模块使用输入有效信号控制采样更新,通过移位寄存器保存历史数据,并以乘加累加形成滤波结果。测试平台覆盖基础、对称、单音、通带、阻带及混合频率场景。演示视频
演示视频展示 FIR 低通滤波器的设计与仿真过程,包括通带与阻带混合信号输入及滤波输出效果。仿真图/仿真说明/设计文档图片
仿真测试包含单音、通带、阻带及通带与阻带混合输入场景,并提供频率响应图、相位响应图和仿真结果文本,用于查看滤波器设计特性与测试输出。




部分代码
以下展示顶层模块 fir_top_symm 的部分代码,完整源码请下载压缩包查看。
module fir_top_symm #(
parameter DATA_W = 16, // 输入数据位宽
parameter COEFF_W = 16, // 系数位宽(Q15)
parameter HALF_TAPS = 10, // 对称系数对数,21 taps 时为 10 对
parameter ACC_W = 40 // 累加器位宽
)(
input wire clk, // 系统时钟
input wire rst_n, // 低有效复位
input wire din_valid, // 输入数据有效
input wire signed [DATA_W-1:0] din, // 输入采样数据
output reg dout_valid, // 输出数据有效
output reg signed [ACC_W-1:0] dout // 原始乘加输出(未缩放)
);
// 总抽头数固定为 21,对应当前设计结果
localparam TAPS = 21;
// 输入延时线
reg signed [DATA_W-1:0] shift_reg [0:TAPS-1];
// 仅保留前半部分对称系数
reg signed [COEFF_W-1:0] coeff [0:HALF_TAPS-1];
// 中心抽头系数(21 taps 为第 10 个)
reg signed [COEFF_W-1:0] coeff_center;
// 对称样本对相加结果,位宽比输入多 1 位以防止溢出
reg signed [DATA_W:0] pair_sum;
// 乘加累加器
reg signed [ACC_W-1:0] acc;
integer i;
// 系数初始化
// 利用线性相位 FIR 的对称性质,只需保存一半系数和中心系数
initial begin
coeff[0] = 16'sd197;
coeff[1] = 16'sd130;
coeff[2] = -16'sd578;
coeff[3] = -16'sd883;
coeff[4] = 16'sd403;
coeff[5] = 16'sd1432;
coeff[6] = -16'sd621;
coeff[7] = -16'sd3096;
coeff[8] = 16'sd661;
coeff[9] = 16'sd10287;
coeff_center = 16'sd15683;
end
// 对称优化版 FIR 主逻辑
// 计算公式:
// y[n] = h[10]*x[n-10] + Σ h[k]*(x[n-k] + x[n-20+k])
// 这样可以把 21 个乘法器减少为 11 个乘法器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// 复位时清空延时线和输出
for (i = 0; i < TAPS; i = i + 1)
shift_reg[i] <= 'sd0;
dout <= 'sd0;
dout_valid <= 1'b0;
end else begin
if (din_valid) begin
// 输入样本进入延时线
shift_reg[0] <= din;
for (i = 1; i < TAPS; i = i + 1)
shift_reg[i] <= shift_reg[i-1];
// 先计算中心抽头贡献
acc = shift_reg[10] * coeff_center;
// 再计算对称样本对的乘加结果
for (i = 0; i < HALF_TAPS; i = i + 1) begin
pair_sum = shift_reg[i] + shift_reg[TAPS-1-i];
acc = acc + pair_sum * coeff[i];
end
// 输出原始累加结果
dout <= acc;
dout_valid <= 1'b1;
end else begin
dout_valid <= 1'b0;
end
end
end
endmodule
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » FIR 低通滤波器 Verilog MATLAB 设计
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » FIR 低通滤波器 Verilog MATLAB 设计