0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

​构建自定义AXI4-Stream FIR滤波器

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-11-07 09:25 次阅读

构建自定义 AXI4-Stream FIR 滤波器

副标题:优秀的IC/FPGA开源项目(五)-在Vivado中构建自定义 AXI4-Stream FIR 滤波器 IP

《优秀的IC/FPGA开源项目》是新开的系列,旨在介绍单一项目,会比《优秀的 Verilog/FPGA开源项目》内容介绍更加详细,包括但不限于综合、上板测试等。两者相辅相成,互补互充~


AMD-Xilinx 的 Vivado 开发工具具有很多方便FPGA开发功能,我最喜欢的功能之一是block design的设计流程。Vivado 中的block design是使用RTL IP形式的图形表示进行设计,在block design中使用 RTL 模块的方便之处在于,它将自动检测某些类型的信号,例如时钟、复位和总线接口,然后,检测这些信号进行IP间的自动化连接。Vivado 中包含大量预构建 IP 模块(官方IP)。

为了方便用户进行相关设计,Vivado 提供了一个内置的 IP 封装编辑器工具,它可以为 AXI IP 生成框架,只需将自己的 RTL 代码插入其中。同时也提供了相关的驱动文件,可以在Vitis中方便调试。

为了演示究竟上面流程“好”在哪里,接下来我们创建一个AXI FIR IP 模块,然后将IP添加到我们设计中最后验证功能。

创建 Vivado 项目

首先,启动 Vivado 并针对自己的FPGA创建一个新项目。

53b89720-5e3a-11ed-a3b6-dac502259ad0.png53c5f640-5e3a-11ed-a3b6-dac502259ad0.png

添加 MicroBlaze,对于这个项目来说,使用 BRAM 就足够了。

选择 Add IP 选项并搜索 MicroBlaze,将其添加到模块设计中并运行 Block Automation,该模块会在窗口顶部的绿色横幅中弹出。接下来添加中断控制器

53dd205e-5e3a-11ed-a3b6-dac502259ad0.png5423c978-5e3a-11ed-a3b6-dac502259ad0.png5432aeac-5e3a-11ed-a3b6-dac502259ad0.png

验证并保存块设计,接下来我们将开始我们的IP设计。

创建新的 AXI4 外设

要使用自己的 RTL 创建新的 AXI 外设并将其封装为 IP ,请选择工具>创建和打包新 IP...

5440dc16-5e3a-11ed-a3b6-dac502259ad0.png

在弹出的窗口中,按照提示逐步浏览屏幕,选择Create AXI4 Peripheral选项,指定 IP 块的所需名称、位置目录以及 IP 将具有的 AXI 接口数量以及 AXI类型。

Vivado 中使用了三种主要类型的 AXI:

  • AXI4 (full)
  • AXI4-Lite
  • AXI4-Stream

每种类型都适合不同的用例,在这个项目中,我们正在创建自己的 AXI FIR 滤波器 IP 。由于 FIR 滤波器输入并输出具有已知数据包边界和流量控制要求的恒定数据流,因此 AXI4-Stream 是最适合的类型。它将需要一个从接口来输入数据样本,并需要一个主接口来输出处理后的样本。

作为参考,FIR 是一个运行速度为 100 MS/s 的 LPF,具有 15 个抽头,接收带符号的 16 位数据并输出带符号的 32 位数据。它有一个从 1MHz 到 10MHz 的通带和一个从 20MHz 开始的阻带。

接下来,选择编辑 IP并单击完成。IP 包编辑 Vivado 项目将重新打开一个gui。

54510e9c-5e3a-11ed-a3b6-dac502259ad0.png5462ca42-5e3a-11ed-a3b6-dac502259ad0.png5483cbac-5e3a-11ed-a3b6-dac502259ad0.png54964f3e-5e3a-11ed-a3b6-dac502259ad0.png54a1cd8c-5e3a-11ed-a3b6-dac502259ad0.png54510e9c-5e3a-11ed-a3b6-dac502259ad0.png

将自定义 RTL 添加到 AXI4-Stream IP

从Flow Navigator中选择Add Sources添加我们要设计的 FIR Verilog 文件。

54bee9bc-5e3a-11ed-a3b6-dac502259ad0.png

在使用 Add Files 选项指向 FIR Verilog 文件后,取消选中Scan and add RTL include files into project复选框。由于这不是一个普通的 Vivado 项目,并且 Verilog 代码被打包到一个 IP 块中,因此选中该选项后将引发错误。

54cd59c0-5e3a-11ed-a3b6-dac502259ad0.png54d879e0-5e3a-11ed-a3b6-dac502259ad0.png

添加后,源层次结构更新并且 FIR Verilog 文件独立于 AXI Verilog 源文件。

54e5e404-5e3a-11ed-a3b6-dac502259ad0.png

根据生成 IP 编辑器 Vivado 项目时所做的选择,会为此 AXI4-Stream 外设生成三个 RTL 源文件:

  • 从接口功能 RTL。
  • 主接口功能 RTL。
  • 具有物理接口声明和主从接口实例化的顶层文件。

在设计之前,需要将几个默认未启用的可选 AXI4-Stream 接口信号添加到主 AXI 端口和从 AXI 端口。大多数 DSP IP 模块,例如 DDS 利用了 AXI4-Stream 额外的keep 和 tlast信号。

添加这些可选信号很简单,但最初并不清楚。导航到Package IP窗口中的Customization Parameters选项卡。

54f31e94-5e3a-11ed-a3b6-dac502259ad0.png

主接口和从接口都需要添加它们,因此右键单击每个接口并选择Edit Interface 。

5514ac94-5e3a-11ed-a3b6-dac502259ad0.png

在“Parameters”选项卡中启用HAS_TKEEP ,方法是单击每个选项,然后单击单个箭头将其从左列移动到右列。

5522eade-5e3a-11ed-a3b6-dac502259ad0.png

然后切换到Port Mapping选项卡,将 tkeep 和 tlast 映射到 AXI IP 块的物理接口。在Interface's Logical Ports列和IP's Physical Ports列中分别匹配 tkeep 和 tlast 信号。然后在下面的Mapped Ports Summary列中验证它们的映射。

5531ac18-5e3a-11ed-a3b6-dac502259ad0.png

由于默认情况下不启用 tkeep,因此还必须手动将其端口声明添加到所有三个 AXI 接口 RTL 源文件的用户定义端口声明部分。它还需要添加到顶级 AXI 包装器中的 AXI 主接口和从接口实例中。

553e5e36-5e3a-11ed-a3b6-dac502259ad0.png554f7f7c-5e3a-11ed-a3b6-dac502259ad0.png555fecae-5e3a-11ed-a3b6-dac502259ad0.png557dee2a-5e3a-11ed-a3b6-dac502259ad0.png

在注释Add user logic here标记的部分中实例化 FIR Verilog 模块。

55a33ef0-5e3a-11ed-a3b6-dac502259ad0.png

现在,虽然 AXI 接口的基本功能分别在每个 RTL 源文件中自动生成,但如何从输入数据流中提取数据并传递到自己的自定义逻辑中由自己来定义。以及如何将自定义逻辑的数据输出馈送到主 AXI 接口进行输出。因此,会在三个自动生成的 RTL 源文件中注意到相同的 Add user 逻辑。

55b3bf46-5e3a-11ed-a3b6-dac502259ad0.png55c3dd0e-5e3a-11ed-a3b6-dac502259ad0.png

另一点需要注意的是,AXI4-Stream 接口的功能需要进行一些修改,以便将 tkeep 和 tlast 信号功能添加到主 AXI 接口和从 AXI 接口。

55d2c1f2-5e3a-11ed-a3b6-dac502259ad0.png

这个项目的最后一个独特的要求是,因为这个逻辑的核心是一个 FIR 滤波器,所以主从 AXI 接口和 FIR 都需要由相同的时钟作为 FIR 采样时钟。所以只是将从 AXI 接口时钟传递给 FIR 和主 AXI 接口。

55e299a6-5e3a-11ed-a3b6-dac502259ad0.png

封装 AXI IP 块

返回到 Package IP 窗口,让我们浏览每个选项卡并验证,然后最终将其打包。

第一个选项卡中是输出 AXI 外设 IP 包的基本显示信息

55f41de8-5e3a-11ed-a3b6-dac502259ad0.png

第二个标签很重要。默认情况下,AXI 外设 IP 仅支持启动 IP 包编辑器的主 Vivado 所针对的 FPGA 芯片系列。大多数时候,可能希望能够将 AXI 外设 IP 块与其他 Xilinx FPGA 芯片系列一起使用,就需要添加我们需要的目标FPGA芯片。

5604aa82-5e3a-11ed-a3b6-dac502259ad0.png

对于其余选项卡,默认需求即可。

561ce520-5e3a-11ed-a3b6-dac502259ad0.png562bd116-5e3a-11ed-a3b6-dac502259ad0.png563778f4-5e3a-11ed-a3b6-dac502259ad0.png566f0044-5e3a-11ed-a3b6-dac502259ad0.png567a7abe-5e3a-11ed-a3b6-dac502259ad0.png

在最后一个选项卡中,单击窗口底部的Package IP按钮。将出现一个提示,询问是否要关闭 IP 编辑器 Vivado 项目。

此时,FIR AXI IP 块被打包并放置在 Package IP 窗口的第一个选项卡指定的目录中的存储库中。

将自定义 AXI4-Stream FIR 添加到项目

现在自定义 FIR AXI IP 模块已经完成并封装,我们可以返回原始 Vivado 项目,将其添加到模块设计中。

我们的验证项目如下:

56881b10-5e3a-11ed-a3b6-dac502259ad0.png

其中DDS IP设置如下:

56b0b8f4-5e3a-11ed-a3b6-dac502259ad0.png56bfb4f8-5e3a-11ed-a3b6-dac502259ad0.png56d9567e-5e3a-11ed-a3b6-dac502259ad0.png56f1fc24-5e3a-11ed-a3b6-dac502259ad0.png

创建仿真平台

首先创建仿真文件,并在sim文件夹下的 Sources 选项卡中,右键单击它并选择Set as Top 。

57015bb0-5e3a-11ed-a3b6-dac502259ad0.png

在这种情况下,只需在块设计中实例化块设计,并为其提供差分系统时钟和主 FPGA 复位。一旦接收到时钟和复位信号,相位增量状态机就会自行运行。

`timescale1ns/1ps

modulesp701_bd_tb;

regclk_p,clk_n,reset;

alwaysbegin
clk_p=1;clk_n=0;#5;
clk_p=0;clk_n=1;#5;
end

alwaysbegin
reset=1;#40;
reset=0;#1000000000;
end

sp701_bdsp701_bd_i(
.reset(reset),
.sys_diff_clock_clk_n(clk_p),
.sys_diff_clock_clk_p(clk_n)
);

endmodule

这里注意一下主 AXI 接口输出信号和 tlast、tvalid 和 tdata 需要进行初始化。否则仿真将会报错。

57119ab6-5e3a-11ed-a3b6-dac502259ad0.png

单击Flow Navigator窗口中的Run Simulation并选择Run Behavioral Simulation 。

57302e2c-5e3a-11ed-a3b6-dac502259ad0.png

注意仿真结果显示格式。

参考

https://www.hackster.io/

总结

上面的一些创建细节没有全部展现,因为本身对于IP的创建不是我们的核心,我们只想说明使用目前这种BD设计可以达达简化设计,尤其是目前Verilog的一些缺点。

最后说一下调试中的注意点,就是使用ILA查看AXI-Stream输出时候,会造成FIR的时序与采样混淆导致 FIR 不再工作,可能会查看不到任何波形,使用AXIS的专用调试IP即可,后续我们在说明这方面的知识。

示例工程

https://github.com/suisuisi/AXI4-Stream-FIR-filter


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 滤波器
    +关注

    关注

    160

    文章

    7727

    浏览量

    177668
  • 自动化
    +关注

    关注

    29

    文章

    5511

    浏览量

    79096
  • 开源
    +关注

    关注

    3

    文章

    3245

    浏览量

    42391

原文标题:​构建自定义 AXI4-Stream FIR 滤波器

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA实现FIR数字滤波器

    在数字信号处理系统中,有限脉冲响应(finite impulse response,FIR)数字滤波器是一个非常重要的基本单元。近年来,由于FPGA具有高速度、高集成度和高可靠性的特点而得到快速发展
    的头像 发表于 11-05 16:26 209次阅读
    基于FPGA实现<b class='flag-5'>FIR</b>数字<b class='flag-5'>滤波器</b>

    FIR滤波器的工作原理和特点

    FIR(Finite Impulse Response)滤波器,即有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件之一。其名称“有限长单位冲激响应”意味
    的头像 发表于 08-05 16:33 873次阅读
    <b class='flag-5'>FIR</b><b class='flag-5'>滤波器</b>的工作原理和特点

    如何区分IIR滤波器FIR滤波器

    IIR(无限脉冲响应)滤波器FIR(有限脉冲响应)滤波器是数字信号处理领域中两种非常重要的滤波器类型。它们在许多应用中都发挥着关键作用,如音频处理、图像处理、通信系统等。 1. 引言
    的头像 发表于 07-19 09:44 3334次阅读

    iir滤波器fir滤波器的优势和特点

    IIR滤波器FIR滤波器是数字信号处理领域中两种非常重要的滤波器类型。它们各自具有独特的优势和特点,适用于不同的应用场景。本文将介绍IIR滤波器
    的头像 发表于 07-19 09:28 1067次阅读

    如何为ESP8266构建自定义盾牌?

    我正在寻找某种如何为ESP8266构建自定义盾牌的指南。 到目前为止,我已经使用 NODEMCU 构建了功能原型,但我现在想简化事情并使其更小。 1. 是否有一些书面的、开放的硬件指南 (很好
    发表于 07-08 07:17

    基于matlab FPGA verilog的FIR滤波器设计

    今天和大侠简单聊一聊基于matlab FPGA verilog的FIR滤波器设计,话不多说,上货。 本次设计实现8阶滤波器,9个系数,由于系数的对称性,h(0)=h(8),h1(1)=h(7
    发表于 07-04 20:11

    Matlab生成fir滤波器抽头系数

    在Vivado调用fir滤波器时,我们会遇到需要填充滤波器抽头系数的问题,手工计算又不现实,所以在此向大家介绍一个生成系数的工具。 首先,我们打开matlab软件,在命令窗口输入fdatool并回
    发表于 04-30 16:17

    Vivado 使用Simulink设计FIR滤波器

    今天给大侠带来Vivado经典案例:使用Simulink设计FIR滤波器,话不多说,上货。 FIR(Finite Impulse Response)滤波器:有限长单位冲激响应
    发表于 04-17 17:29

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 973次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。
    的头像 发表于 04-08 10:17 601次阅读

    Matlab生成fir滤波器抽头系数的流程

    在Vivado调用fir滤波器时,我们会遇到需要填充滤波器抽头系数的问题,手工计算又不现实,所以在此向大家介绍一个生成系数的工具。
    的头像 发表于 03-25 09:49 1335次阅读
    Matlab生成<b class='flag-5'>fir</b><b class='flag-5'>滤波器</b>抽头系数的流程

    Vivado经典案例:使用Simulink设计FIR滤波器

    FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格
    的头像 发表于 03-25 09:18 1947次阅读
    Vivado经典案例:使用Simulink设计<b class='flag-5'>FIR</b><b class='flag-5'>滤波器</b>

    FIR滤波器和IIR滤波器的区别与联系有哪些

    FIR滤波器和IIR滤波器是数字信号处理中的两种常见滤波器类型,它们在原理、结构和性能等方面存在显著的差异与联系。
    的头像 发表于 01-29 16:41 2534次阅读
    <b class='flag-5'>FIR</b><b class='flag-5'>滤波器</b>和IIR<b class='flag-5'>滤波器</b>的区别与联系有哪些

    使用Moku自定义实时数字滤波器实现降噪与去尖峰

    在本应用笔记中,我们利用Moku云编译和多仪器模式来解释常用移动平均滤波器的开发。我们使用示波器和频率响应分析仪来检测有限脉冲响应(FIR)滤波器。然后,我们使用Moku:Pro、MokuGo设备
    的头像 发表于 01-04 08:15 605次阅读
    使用Moku<b class='flag-5'>自定义</b>实时数字<b class='flag-5'>滤波器</b>实现降噪与去尖峰

    AD6620的FIR滤波器是什么类型的滤波器呢?

    请问AD6620的FIR滤波器是什么类型的滤波器呢?它的功能是什么呢?可不可以直接从AD6620的输出中进行符号同步的时钟提取呢?谢谢!!!
    发表于 12-22 07:00