前言
作为一个有一定工作经验(划水好多年)的FPGA工程师,很多模块都已经学习过或者使用过,但是如果让我重新实现,感觉又是一脸懵。因此,这是我发文档的原因。对于自己来说,这是一个总结归纳的过程,对读者,可能是一次解惑。
后期,将会逐渐分享DDR/ETH/SERDES/PCIe/SPI/FFT/FIR等等应用、调试经历。2022.8.4@gz
如果有疑惑的地方,可以站内信联系,共同探讨!
本文的仿真工程文件,放在末尾的公众号中,不需要积分就可以下载。
-
概述
在项目中,需要实现一个多通道的FIR滤波器,滤波器的信号速率不高,是一个300Hz~4KHz范围的滤波器。问题在于多通道,预计是需要实现16通道的。如果是实现16通道并行的滤波器,即使这个滤波器是串行结构,那消耗的资源也是非常可观的。幸好,xilinx提供的IP中支持实现多通道的滤波器。
设计目标:基于xilinx的FIR ip、单组系数、多通道(16通道)
有点感慨:xilinx提供的这个fir滤波器IP,功能实在是有点强大。不但可以实现多种结构的滤波器,还支持多通道、多组系数等功能,另外,matlab提供了超级简便的系数生成模块,弄一个fir模块,简直便捷到飞起。
瞬时,觉得自己以前手撕代码写的滤波器,有点low的感觉。
使用xilinx提供的FIR滤波器模块,要点有:
- 如何使用matlab设计fir滤波器系数并且导出coef文件;
- 如何对vivado提供的FIR滤波器系数进行重载;
- 如何对vivado提供的FIR滤波器系数进行切换;
- 如何使用vivado提供的FIR滤波器实现多通道应用;(本文重点)
-
IP配置
-
目标滤波器参数
滤波器描述
在配置IP之前,我们预先使用matlab获得了对应的FIR滤波器系数。FIR滤波器是一个300Hz~3KHz的带通滤波器,系数量化成16bit,450阶。信号的采样率:6.4kHz
IP运行时钟:120MHz的时钟;
滤波器设置选项 |
通道设置 |
实现设置 |
详细实现方案 |
接口设置 |
最终滤波器设计 |
-
IP接口信号说明
S_axis_data_tlast:该信号表示滤波器信号输入的最后一个。如何理解?比如,在设计中一共有16个通道的滤波器,也就是相当于有16个独立的滤波器。在输入端,只有一组信号输入接口,如果是并行的,那么s_axis_data_tdata应该有16*32bit位宽,实际上只有32bit。因此,需要使用tuser结合tlast来对各个通道进行数据输入。而tlast在tuser=15的时候需要拉高。其余的时候置地。如图:
event_s_data_chanid_incorrect:如果tuser信号输入不正确,这个信号会拉高的。
如何区分输出通道信号?
- 仿真结果
仿真事项设置 |
-
总结与感想
到此,如何使用该IP实现多通道滤波器,已经基本搞明白了。需要注意的是,最好是自己建立一个简单的仿真工程,尝试多设置一下系数,就可以更好的理解与设置;
经验如下:
- 注重event标志信号,如果有置高的,就必须检查输入信号是否不符合要求;
- 注意检查输入输出的时序关系,最好仿真一下