本文转载自:十年老鸟的CSDN博客
注:本文由作者授权转发,如需转载请联系作者本人
前言
在Xilinx和Intel平台的FPGA中提供了给我们各种各样的IP核,这些IP核都是厂家的成熟设计,使用起来也非常的方便。但因为我们的项目经常存在跨平台的问题,两家的IP核从参数、时序到风格都有一些区别,越复杂的IP核越难以移植,特别是如果两家的IP核输入输出的时序不一致的话会导致设计需要改动很大。因此有必要对IP核进行RTL描述,
1、 通过自己的代码写出了IP核的功能,对IP核的实现进行了深入的理解。
2、 使用纯RTL对于跨平台非常方便,由于全部都是verilog代码,跨平台移植那是分分钟的事情
但既然都能够手写了,那我们为什么还要用IP核呢。
IP核的使用对于FPGA资源和时序都会有一定优化,有些资源的使用无法简单通过RTL语言直接描述出来的。
因此在跨平台移植代码的时候,遇到比较复杂的算法模块,如果没有碰到较复杂的IP核,最好全部先进行RTL实现,后续有需要可以重新转化为另一个平台的IP核。这样就保证了功能的正确
FIR 滤波器模块的设置
FIR 滤波器模块的不同设置会导致时序出现不同,因此,我们要记录下我们要手写的FIR ip核的具体信息,必须完全一样。
我们需要手写以下IP核,其配置要点如下:
1系数:256个,非对称,位宽16bit,signed模式
2输入:位宽16bit,signed模式
3输出:全精度35bit,实际输出是40bit
4特点:时钟/采样率 = 32/1
详细配置图如下:
配置卡片1
配置卡片2
配置卡片3
配置卡片4
配置卡片5
配置总结
IP核的接口:
实现分析
因为是非对称的,所以不能通过折叠来节省一半乘法器
FIR系数为256个,实现一次FIR计算,需要256次乘法加法, 但时钟/采样率 = 32/1,因此我们可以复用乘法器。只需要256/32 = 8 个乘法器即可
实现框图:
总体模块中包括8个分段累加模块,这是分段累加模块的实现细节框图:
总体模块:
注意要点:
1、该框架可以实现FIR(卷积)或者相关,区别在于抽头是否翻转
2、为了和IP核的时序保持一致,尽量在乘法器打足够的拍,以便将来使用IP核替换的时候有余量
功能仿真对比
通过仿真,IP核和手写的RTL代码输入数据的时序和数据是一致的,IP核和手写的RTL代码输出数据的时序和数据也是一致的。表明,手写的RTL代码可以完全的替代IP核的功能
最后说明:
资源备份:百度网盘-Xilinx设计-手写FIR_COE256
对应的matlab程序可以参照XXX_detect_XXX_FPGA.m文件的相关部分
执行srcs中tb_xxx_top_and_xxx_source.tcl 文件即可直接仿真