本文主要是介绍手把手教你学会 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详细配置步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!