XDMA - AXI4 Memory Mapped

2024-08-27 20:52
文章标签 memory mapped axi4 xdma

本文主要是介绍XDMA - AXI4 Memory Mapped,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. What is SG DMA
  • 2. Descriptor
  • 3. Transfer for H2C
    • Step 1. The host prepares stored data and creates descriptors in main memory
    • Step 2. The host enables DMA interrupts
    • Step 2. The driver initializes DMA with descriptor start address
    • Step 3. The driver writes a control register to start the DMA transfer
    • Step 4. The DMA reads descriptors from the host and starts processing each descriptor.
    • Step 4. The DMA fetches data from the host and sends the data to the user side.
    • Step 5. After all data is transferred based on the settings, the DMA generates an interrupt to the host.


回见 XDMA原理

pg195 《DMA/Bridge Subsystem for PCI Express v4.1Product Guide Vivado Design Suite》

1. What is SG DMA

AXI4 Memory Mapped接口是XDMA实现SG DMA的接口,可以配置为多Channel H2C Stream或C2H Stream类型,也可以配置为AXI4 Master用于所有通道共享。此处我们介绍配置为AXI4 Memory Mapped的SG DMA,对应到XDMA IP上其实就是一个M_AXI接口

首先介绍一下什么是SG DMA。SG DMA与普通DMA不同的是 允许每次 DMA 传输访问多个内存空间,所有任务都结束后,才发出中断。 能够提高CPU工作效率。

SG DMA基本原理是主机在主存中开辟一片空间保存H2C链表和C2H链表,链表以 Descriptor 为基本单元。每个Descriptor包含了要进行DMA的起始地址、长度、目标外设地址、下一个Descriptor在内存空间地址等信息。

主机控制SG DMA启动后,先读取第一个Descriptor、解析、执行DMA传输,传输完成后再从主存中读取第二个Descriptor,往复循环上述过程,直到读取到最后一个Descriptor,完成传输发出中断。

基于Xilinx FPGA的AXI Direct Memory Access (Scatter Gather Engine模式) 行为分析及软件操作流程

2. Descriptor

无论是H2C还是C2H,XDMA规定的descriptor格式如下图所示

在这里插入图片描述

在这里插入图片描述
可以看到一个descriptor占32字节

Len[27:0]单位是字节,Nxt_adj[5:0]表示链表后还剩多少个descriptor。

Src_addr[63:0]表示需要执行DMA的数据源地址,如果是H2C DMA该地址为主机侧PCIe总线域地址,若是C2H DMA该地址为FPGA侧AXI总线域地址。

同理,Dst_addr[63:0]表示需要执行DMA的数据目的地址,如果是H2C DMA该地址为FPGA侧AXI总线域地址,若是C2H DMA该地址为主机侧PCIe总线域地址。

Nxt_addr[63:0]表示下一个descriptor地址,只能是主机侧PCIe总线域地址。

可以在XDMA IP的GUI界面的PCIe: DMA标签下选择Descriptor Bypass for H2C和C2H,就可以通过旁路接口输入descriptor,可以不只从host主存获取
36.XDMA原理详解2-DMA描述符、描述符FIFO、描述符旁路详解

3. Transfer for H2C

XDMA执行SG DMA是基于通过BAR空间对相关DMA寄存器控制 进行的。

下面以H2C为例,介绍XDMA执行SG DMA整个流程

在这里插入图片描述

图中一个框出多个箭头表示并行执行。

执行过程如下:

Step 1. The host prepares stored data and creates descriptors in main memory

主机向主存中存储多块连续数据,假设为100块。主机生成100个Descriptor分别指向这100个数据块,形成descriptors链表放入主存中。

注意每个descriptor.Dst_adr[63:0]是FPGA侧的AXI总线域地址

Step 2. The host enables DMA interrupts

主机初始化H2C DMA,开启中断。以H2C通道1(0起始)为例

H2C Channel 1的DMA中断开启包括 H2C通道中断使能掩码0x0190、IRQ模块DMA引擎中断使能掩码0x2010

在这里插入图片描述

在这里插入图片描述

39.XDMA寄存器详解3-IRQ Block寄存器组剖析

Step 2. The driver initializes DMA with descriptor start address

主机通过MWr TLP命中 XDMA某个H2C Channel的BAR空间,向该Channel的 SG DMA寄存器组写入首descriptor起始地址、首descriptor后的descriptor个数。

分别对应XDMA中BAR空间地址(即MWr TLP中的Address[31:0]字段,下同)为0x4180、0x4184、0x4188寄存器

在这里插入图片描述
在这里插入图片描述

41.XDMA寄存器详解5-H2C SGDMA/C2H SGDMA寄存器组剖析

Step 3. The driver writes a control register to start the DMA transfer

DMA引擎启动,开启对应通道的descriptor获取。

寄存器包括H2C Channel 1Control寄存器0x0104、SGDMA Descriptor Controller 寄存器0x6110等等

在这里插入图片描述

在这里插入图片描述

38.XDMA寄存器详解2-H2C、C2H通道寄存器组剖析

Step 4. The DMA reads descriptors from the host and starts processing each descriptor.

XDMA根据H2C Channel 1的SG DMA寄存器组的信息,以及获取的descriptor中Nxt_adr[63:0]信息,不断向主机发送MRd TLP包,获取descriptor缓存入FIFO。

与此同时,XDMA不断从FIFO读出descriptor,每读出一个descriptor,根据descriptor中PCI总线域源地址Src_adr[63:0]和长度Length[27:0]信息向主机发送MRd TLP包,主机从主存中读出待DMA的数据并通过CplD TLP返回给XDMA。

每次向主机请求多少个Descriptor(每个MRd TLP的Length[9:0]字段)与XDMA自身的Max Read Request Size(MRRS)寄存器0x300C和descriptor FIFO容量有关。

MRRS寄存器如下所示,一般为512B或1024B
在这里插入图片描述
DMA内部descriptor FIFO深度为 AXI Data Width×512供所有Channel共用,例如2个H2C、2个C2H的Gen3 x8,AXI Data Width=256bit,因此有256bit×5122=16KB=32B×512,可放入512个descriptor。

Step 4. The DMA fetches data from the host and sends the data to the user side.

XDMA收到CplD后,根据descriptor中AXI总线域目的地址Dst_adr[63:0]的信息,通过AXI MM接口进行AXI写握手。待全部数据写握手完毕后,从FIFO中读出下一个descriptor,直到所有descriptors处理完毕

Step 5. After all data is transferred based on the settings, the DMA generates an interrupt to the host.

XDMA使用Msg TLP向主机发送MSI-X中断(需在GUI中设置好)。根据DMA中断向量号寄存器 0x02A0、0x02A4

35.XDMA原理详解1-DMA描述符概述及DMA数据传输架构
37.XDMA寄存器详解1-内部寄存器概览

这篇关于XDMA - AXI4 Memory Mapped的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Learning Memory-guided Normality for Anomaly Detection——学习记忆引导的常态异常检测

又是一篇在自编码器框架中研究使用记忆模块的论文,可以看做19年的iccv的论文的衍生,在我的博客中对19年iccv这篇论文也做了简单介绍。韩国人写的,应该是吧,这名字听起来就像。 摘要abstract 我们解决异常检测的问题,即检测视频序列中的异常事件。基于卷积神经网络的异常检测方法通常利用代理任务(如重建输入视频帧)来学习描述正常情况的模型,而在训练时看不到异常样本,并在测试时使用重建误

【论文分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

目录 AbstractIntroductionResponsible disclosure BackgroundGPU BasicsGPU architectureGPU virtual memory management GPU Programming and ExecutionGPU programming modelGPU kernelDevice function NVIDIA

org.hibernate.hql.ast.QuerySyntaxException: XX is not mapped

 1、from XXX的XXX应该是实体类而不是表名。 2、hibernate配置文件中没有加入相应的映射文件<mapping resource=" " />  3、HQL语句出现错误,经常出现空格格式问题。

FUSEE: A Fully Memory-Disaggregated Key-Value Store——论文阅读

FAST 2023 Paper 论文阅读笔记整理 问题 分布式内存键值(KV)存储正在采用分离式内存(DM)体系结构以提高资源利用率。然而,现有的DM上的KV存储采用半分离式设计,在DM上存储KV对,但在单个元数据服务器上管理元数据,因此仍然在元数据服务器上遭受低资源效率的问题。 如图1a,Clover[60]采用半分离式设计,在计算节点(CN)上部署客户端,在内存节点(MN)上存储KV对,

怎样在xcode4.x里面使用Memory Leaks和Instruments

开胃小菜--简单的断点调试 在xcode中打开一个app,在想要break的行号上单击,即可生成一个深色的箭头标识--断点。如下图,在viewDidLoad:中设置了断点。 运行app,等待。。。就可以看到xcode在断点处进入调试模式,现在让我们把视线移到xcode右下角的控制台,有木有看到(lldb)这样一行,鼠标移到此行,输入 1 po [self view] 回车,看

Java memory model(JMM)的理解

总结:JMM 是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性、有序性。 总结的很精辟! 感谢Hollis总结

以太坊存储类型(memory,storage)及变量存储详解

1数据存储位置(Data location)概念 1.1 storage, memory, calldata, stack区分 在 Solidity 中,有两个地方可以存储变量 :存储(storage)以及内存(memory)。 Storage变量是指永久存储在区块链中的变量。 Memory 变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。 内存(memory)位置

C++ 之 Memory Barrier

今天群里姐夫推荐了个C++的Actor框架 Theron,就看了下源码,注释比代码还多,业界良心。 源码我还没看完,就看到了他的一个叫StringPool的类,里面通过Ref来生成单例(Singleton),看了下 static void Reference();这个函数实现的时候,突然脑洞一开,为啥没有Memory Barrier( wiki)。 先贴一下他的代码:

【精讲】PCIe基础篇——Memory IO 地址空间

在早期的PC中,IO设备中的内部寄存器/存储是通过IO地址空间(由Intel定义)来访问的。然而,由于与IO地址空间相关的一些限制和不良影响(我们在这里不讨论),IO地址空间很快就失去了软件和硬件供应商的青睐。这导致IO设备的内部寄存器/存储被映射到内存地址空间(通常称为Memory mapped IO,或MMIO)。然而,由于早期的软件是使用IC地址空间来访问IO设备上的内部寄存