手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(二) ——XDMA详细配置步骤

2024-02-02 05:10

本文主要是介绍手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(二) ——XDMA详细配置步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因最近想通过PCIE把数据从FPGA传到PC,借此机会和大家一起学习XDMA读写DDR

制作不易,记得三连哦,给我动力,持续更新!!!

完整工程文件下载:XDMA读写DDR工程   提取码:4sxh


上一期讲到如何配置DDR的IP,相信很多小伙伴已经成功的把DDR配置成功,那么下一步就要对PCIE的IP进行配置

PCIE的IP在vivado中一般是通过XDMA实现的,XDMA有太多优点了!

Xllinx提供DMASubsystem for PCIExpressIP是一个高性能,可配置的适用于PCle2.0、PCle3.0的SG模式的DMA,提供用户可选择的AX 4接口或者AX-Stream接。XDMA是SGDMA,并主BIOCK DMA,SG模式下,主机会把要传输的数据组成群表的形式,然后将销表首地址通过BAR传送给XDMA,XDMA会根据链表结构首地址依次完成链表所指定的传输任务.

Xilinx XDMA支持的系列包括7系列,UltraScale系列,UltraScale+系列各种系列,界面配置基本相同。这里以KU040的一个板子做例程,其他系列可以参考。Vivado使用2018.3,Vivado的版本,做XDMA,建议尽量使用新一些的版本。详细的说明,参考Xilinx的文档PG195,下面主要摘取影响使用的关键部分。

先稍微讲一点点理论知识,便于大家理解XDMA:

XMDA传输流程图:

H2C 通道:

H2C 通道数量在 Vivado® 集成设计环境 (IDE) 内进行配置。H2C 通道负责处理从主机到卡的 DMA 传输。它负责根据最大读取请求大小和可用内部资源来拆分读取请求。DMA 通道可保留未完成的请求,其最大数量取决于 RNUM_RIDS(即未完成的 H2C 通道请求 ID 参数)。每次拆分(如有)读取请求都会额外耗用一项读取请求。从 DMA 通道向 PCIe RQ 块发出读取后开始,请求即处于未完成状态,直至该通道接收到在用户接口上已按顺序完成写入的确认为止。完成传输后,DMA 通道会发出写回或中断以告知主机传输完成。

H2C 通道还会在其读取接口和写入接口上拆分传输事务。在连接到主机的读取接口上,将根据可用数据 FIFO 空间拆分传输事务以满足配置的最大读取请求大小要求。数据 FIFO 空间在读取请求时进行分配,以确保有足够空间可供完成读取。PCIe RC 块会将完成数据返回到已分配的数据缓冲器位置。为最大程度减小时延,接收到任何完成数据时,H2C 通道都会开始向用户接口发出写入请求。它还会按最大有效载荷大小对写入请求进行分割。在 AXI4-Stream 用户接口上,此拆分操作为透明操作。

启用多个通道时,AXI4 主接口上的传输事务将在所有选中的通道内进行交织。在此情况下会使用简单的循环协议来维护所有通道。传输事务的粒度取决于主机最大有效载荷大小 (MPS)、页面大小和其它主机设置。

C2H 通道:

C2H 通道负责处理从卡到主机的 DMA 传输。C2H 通道的例化数量在 Vivado® IDE 中进行控制。同样,未完成的传输数量通过 WNUM_RIDS(即 C2H 通道请求 ID 数量)来配置。在 AXI4-Stream 配置中,先设置 DMA 传输详细信息,然后才会在 AXI4-Stream 接口上接收到数据。这通常是通过接收 DMA 描述符来完成的。在准备好请求 ID 并启用通道后,该通道的 AXI4-Stream 接口即可接收数据并向主机执行 DMA。在 AXI4 MM 接口配置中,向 AXI4 MM 接口发出读取请求时就会分配请求 ID。与 H2C 通道类似,给定请求 ID 保持处于未完成状态,直至完成写入请求为止。对于 C2H 通道,当按 PCIe IP 指示发出写入请求后,写入请求即告完成。

启用多个通道时,AXI4 主接口上的传输事务将在所有选中的通道内进行交织。在此情况下会使用简单的循环协议来维护所有通道。传输事务的粒度取决于主机最大有效载荷大小 (MPS)、页面大小和其它主机设置。

AXI4-Lite 主接口

此模块用于实现 AXI4-Lite 主接口总线协议。主机可使用此接口来向用户逻辑生成 32 位读取请求和 32 位写入请求。这些读取或写入请求是通过 PCIe 到 AXI4-Lite 主接口 BAR 来接收的。读取完成数据将通过目标桥接器的 PCIe IP CC 总线返回至主机。

AXI4-Lite 从接口

此模块用于实现 AXI4-Lite 从接口总线协议。用户逻辑只能负责主控该接口上针对 DMA 内部寄存器的 32 位读取或写入操作。您无法通过此接口访问 PCIe 集成块寄存器。此接口不会生成发射到主机的请求。

主机到DMA旁路主接口:

到达 PCIe 到 DMA 旁路 BAR 的主机请求都将被发送到此模块。旁路主端口属于 AXI4 MM 接口,支持读写访问。

IRQ 模块:

IRQ 模块会接收到来自用户逻辑的中断连线,其数量可配置,每个 DMA 通道 1 条中断连线。此模块负责基于 PCIe 生成中断。可在 IP 配置期间指定对 MSI-X、MSI 和遗留中断的支持

主机可在 IP 配置期间从指定的受支持中断列表中启用 1 个或多个中断类型。IP 在任意给定时间仅生成 1 种类型的中断,即使启用多个中断类型也是如此。MSI-X 中断优先于 MSI 中断,MSI 中断优先于遗留中断。当存在任一已断言有效或暂挂的中断时,主机软件不得切换(启用或禁用)中断类型

XDMA接口介绍:

枯燥的理论讲完啦,废话不多说,还是直接来干货,我只能保证大家按照我的步骤每个人都可以学会XDMA读写DDR,加油吧!!! 

XDMA IP 的配置:

1、添加XMDA IP 到项目中

2、双击XDMA IP 进行配置

Basic:

        (1)“Functional Mode”(功能模式):即DMA模式。

        (2)“Mode”(模式):basic即可,basic与advanced的区别在于advanced模式开放更多

                的可选选项与功能,basic的话为默认。

        (3)“Device /Port Type”(器件/端口类型):选择设备与端口类型,为端点设备。保持默认

        (4)“PCIe Block Location”(PCIe 块位置):从可用的集成块中选择,以启用生成特定位置

                的约束文件和输出,产品能够pg054datasheet截取的位置说明P249,根据硬件选择,一

                般保持默认。

        (5)“Lane Width”(通道宽度):通道宽度,根据硬件接口进行选择,取决于你的硬件支持

                的模式,如果不知道就选择X1,数字越大,传输速度越快。

        (6)“Maximum Link Speed”(最大链路速度):子系统需要选择 PCIe Gen 速度。

        (7)“Reference Clock Frequency”(参考时钟频率):默认值为 100 MHz,但也支持

                125 MHz 和 250 MHz。

        (8)“AXI Address Width”(AXI 地址宽度):当前,仅支持 64 位宽度。

        (9)“AXI Data Width”(AXI 数据宽度):选择 64、128、256 位或 512 位,该子系统允许

                您选择“Interface Width”(接口宽度)这个也可以不用选择,选择完通道和速度自动会自

                动改变。

        (10)“AXI Clock Frequency”(AXI 时钟频率):根据通道宽度/速度,可选择 62.5 MHz、

                125 MHz 或 250 MHz。

        (11)“DMA Interface Option”(DMA 接口选项):选择 AXI4 存储器映射或 AXI4-Stream。

        (12)“AXI4-Lite Slave Interface”(AXI4-Lite 从接口):此项即可启用 AXI4-Lite 从接口。

PCIe ID

        此界面一般保持默认,不需要做配置

PCIe BARs

        基址寄存器概述

        在端点配置中,核支持最多 6 个 32 位 BAR 或 3 个 64 位 BAR 以及扩展只读存储器 (ROM) BAR。BAR 分 2 种大小:

32 位 BAR:地址空间最小可达 128 字节或者最大可达 2 GB。用于 DMA、AXI4-Lite 主接口或 AXI Bridge 主接口。

64 位 BAR:地址空间最小可达 128 字节或者最大可达 8 艾字节 (EB)。用于 DMA、AXI4-Lite 主接口或 AXI Bridge 主接口。

所有 BAR 寄存器都共享这些选项。

        (1)Pcie to AXI Lite Master:BAR1 中的默认选项,前提是启用该选项,如果需要PC和

                FPGA进行传输信息或者指令,这个选项需要打开,寄存器大小需要自己分配。

        (2)Pcie to DMA Bypass:BAR2 中的默认选项,前提是启用该选项。

        (3)“Size”(大小):可用“Size”范围取决于选择的是 32 位 BAR 还是 64 位 BAR。DMA 需

                要 256 KB 的空间,这是固定的默认选项。其它 BAR 大小选项也可用,但必须指定。

        (4)“Scale”(标度):请选择字节、千字节或兆字节。

        (5)“Value”(值):表示基于当前选择分配给 BAR 的值。

为实现最佳结果,请禁用未使用的基址,以节省系统资源。通过在“Customize IP”(自定义 IP)对话框中取消选中未使用的 BAR 即可禁用基址寄存器。

PCIe Misc

        (1)“Number of User Interrupt Request”(用户中断请求数):可选用户中断请求最大数量

                为 16。

        (2)“Legacy Interrupt Settings”(遗留中断设置):选择任一遗留中断:INTA、INTB、

                INTC 或 INTD,保持默认。

        (3)“MSI Capabilities”(MSI 功能):默认启用“MSI Capabilities”,并启用 1 个矢量。可选

                矢量最大数量为 32。一般情况下,Linux 针对 MSI 仅使用 1 个矢量。该选项可禁用。

        (4)“Extended Tag Field”(扩展标签字段):默认情况下使用 6 位完成标签。对于 

                UltraScale™ 和 Virtex®-7 器件,“Extended Tag”(扩展标签)选项可提供 64 个标签。

        (5)“Configuration Management Interface”(配置管理接口):选中该选项时,即可将

                 PCIe 配置管理接口置于顶层。

        (6)“Link Status Register”(链路状态寄存器):默认情况下,选中Enable Slot Clock

                 Configuration(启用时隙时钟配置)。这意味着在链路状态寄存器中启用时隙配置位。

PCIe DMA

      (1)“Number of DMA Read Channels”(DMA 读取通道数):可用选项范围为 1 到 4。

      (2)“Number of DMA Write Channels”(DMA 写入通道数):可用选项范围为 1 到 4。

      (3)“Number of Request IDs for Read channel”(读取通道的请求 ID 数):选择每个通道未

                完成的请求的最大数量。可用选项范围为 2 到 64。

      (4)“Number of Request IDs for Write channel”(写入通道的请求 ID 数):选择每个通道未

                完成的请求的最大数量。可用选项范围为 2 到 32。

      (5)“Descriptor Bypass for Read (H2C)”(对应读取的描述符旁路 (H2C)):可用于所有选

                定的读取通道。每个二进制数字均对应于 1 条通道。LSB 对应于通道 0。位元位置的值

                为 1 表示对应的通道已启用描述符旁路。

      (6)“Descriptor Bypass for Write (C2H)”(对应写入的描述符旁路 (C2H)):可用于所有选

                定的写入通道。每个二进制数字均对应于 1 条通道。LSB 对应于通道 0。位元位置的值

                为 1 表示对应的通道已启用描述符旁路。

      (7)“AXI ID Width”(AXI ID 宽度):默认位宽为 4 位。您也可以选择 2 位。

      (8)“DMA Status port”(DMA 状态端口):DMA 状态端口可用于所有通道。

配置XMDA端口:

单击 Run Block Automatic:     

选择XMDA配置信息:

点击OK:即可配置完成

这样XDMA IP 配置基本已经完成

完整工程文件下载:XDMA读写DDR工程   提取码:4sxh

下一节讲解连接这XDMA、MIG两个IP,并进行下板验证

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!

这篇关于手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(二) ——XDMA详细配置步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/669570

相关文章

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.