FIR(Finite Impulse Response)是一种有限脉冲响应的数字滤波器,其特点是系统的响应是有限的,即对于一个有限的输入序列会产生一个有限的输出序列,且其具有的线性相位特性使得滤波器对于不同频率的信号在时域上引入的相位延迟时恒定的,遇到有噪声叠加的信号进入滤波器后不会引入信号畸变,且FIR滤波器的设计相对灵活
在这里简介一下使用matlab设计 FIR滤波器参数然后导入到vivado中使用ip核实现的方式,公式啥的就不过多介绍,一些讲原理的帖子里都说的很明白了,这里只讲操作
首先在matlab命令行中输入fdatool打开filter designer工具,然后根据你自己的需要填写好滤波器的参数,需要低通还是高通还是带通还是带阻,然后设置通带频率,阻带频率,采样频率以及滤波器阶数,如图所示,并可以查看滤波器的幅频响应曲线
然后选择上面的 目标-XILINX系数文件(coe文件)然后导出coe文件
导出后将coe文件复制到fpga的工程文件夹下,然后ip catalog中搜索FIR compiler,然后选择coe文件导入方式,那个系数是系统帮你默认的,可以不用管
然后继续第二个选项卡,设置和matlab中一样的采样频率和你这个FPGA工程的时钟频率,建议两边都保持一致
然后更改第三个选项卡中你需要输入fir滤波器的信号位宽,他会自动给你生成一个输出位宽
然后点击生成就可以
生成之后如图所示引用原语并进行配置
wire s_axis_data_tready;
wire m_axis_data_tvalid;
assign s_axis_data_tvalid = 1'b1;
fir_compiler_0 your_instance_name (
.aclk(aclk), // input wire aclk,配置自己的时钟
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(s_axis_data_tdata), // 输入数据
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata) // 输出数据
);
就可以正常使用了