• 手撕IP核系列——Xilinx FIR IP核之一


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    手撕IP核系列——Xilinx FIR IP核之一


    前言

    在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 文件即可直接仿真

  • 相关阅读:
    对于html和css初学者,你有什么值得推荐的简单的网页适合练习?
    Java设计模式之适配器模式
    基于ensp的园区网络搭建综合实验
    【b站韩顺平 快速学Java课】Java的JDK8(包括公共JRE8)安装教程 总结
    武林新秀(一)`git init` 初始化一个新的Git仓库
    N32学习笔记2-GPIO使用和关闭JTAG打开SW调试模式
    C#、Unity中正则表达式 Regex类的使用——最白话,手把手教你做
    5G定位系统,实现通信服务和定位功能一体化
    关于初始化page入参的设计思路
    有哪些公共管理或行政管理学习帮助较大的外文期刊?
  • 原文地址:https://blog.csdn.net/gzy0506/article/details/126177640