XDMA - AXI4 Memory Mapped

news2024/12/23 17:47:45

目录

  • 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.
    • Step 6. The driver processes the interrupt to find out channel number and checks status to see if there are any errors.
    • Step 7. The driver stops DMA run and return Step 1


XDMA是Xilinx 为了方便不熟悉PCIe用户封装起来的PCIe 易用 IP

回见 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,完成传输发出中断。

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

基于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中设置好)。

Msg TLP中Address以及Data需根据DMA中断向量号寄存器(预先设定好) 0x01A0、0x01A4,以及MSI-X Vector Table and PBA 0x8000-0x8FE0

在这里插入图片描述

在这里插入图片描述

Step 6. The driver processes the interrupt to find out channel number and checks status to see if there are any errors.

主机先向XDMA发送MRd TLP,读取IRQ模块DMA中断请求寄存器0x2044判断是哪个Channel发出的中断。

在这里插入图片描述

之后,主机再发送MWr TLP,写入IRQ模块DMA引擎中断使能掩码0x2010将该Channel中断屏蔽

主机向XDMA发送MRd TLP,读取H2C Channel1状态寄存器0x0144检查DMA过程是否存在错误。

在这里插入图片描述

主机向XDMA发送MRd TLP,读取H2C Channel1状态寄存器0x0148检查DMA处理的descriptors数量是否正确。

在这里插入图片描述

Step 7. The driver stops DMA run and return Step 1

主机向XDMA发送MWr TLP,写入H2C Channel1状态寄存器0x0104以关闭H2C Channel 1的DMA引擎。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(邓俊辉)学习笔记】串 06——KMP算法:构造next[]表

文章目录 1. 递推2. 算法3. 实现 1. 递推 接下来的这节,我们就来讨论 next 查询表的构造算法。我们将会看到非常有意思是, next 表的构造过程与 KMP 主算法的流程在本质上是完全一样的。 在这里,我们不妨采用递推策略。我们只需回答这样一个…

带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。 我们要了解面经要如何“说”! 很重要!很重要!很重要! 我们通常采取总-分-总方式来阐述!(有些知识点,你可以去…

python脚本请求数量达到上限,http请求重试问题例子解析

在使用Python的requests库进行HTTP请求时,可能会遇到请求数量达到上限,导致Max retries exceeded with URL的错误。这通常发生在网络连接不稳定、服务器限制请求次数、或请求参数设置错误的情况下。以下是一些解决该问题的策略: 增加重试次数…

【负载均衡式在线OJ】项目设计

文章目录 程序源码用到的技术项目宏观结构代码编写思路 程序源码 https://gitee.com/not-a-stupid-child/online-judge 用到的技术 C STL 标准库。Boost 准标准库(字符串切割)。cpp-httplib 第三方开源网络库。ctemplate 第三方开源前端网页渲染库。jsoncpp 第三方开源序列化…

栈和队列有何区别?

栈和队列是两种常见的数据结构,它们分别用于解决不同类型的问题。在程序设计中,栈和队列都是非常重要的数据结构,因为它们可以帮助我们解决很多实际的问题。 栈: 首先,让我们来讨论栈, 栈是一种后进先出(…

学NLP不看这本书等于白学!一书弄懂NLP自然语言处理(附文档)

随着人工智能技术的飞速发展,自然语言处理成为了计算机科学与人工智能领域中不可或缺的关键技术之一。作为一名长期致力于人工智能和自然语言处理研究的学者,今天给大家推荐的这本《自然语言处理:大模型理论与实践》正是学NLP自然语言非常牛逼…

黑神话悟空用什么编程语言

《黑神话:悟空》作为一款备受瞩目的国产单机动作游戏,其背后的开发涉及了多种编程语言和技术。根据公开信息和游戏开发行业的普遍做法,可以推测该游戏主要使用了以下几种编程语言: C: 核心编程语言:作为《黑…

【C++ Primer Plus习题】5.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Car {string brand;int year; }Car;int main() {int count 0;cout << "请问你家有多少辆车呢?" << endl;cin >> count;cin.get();Car* ca…

Java 入门指南:Java IO流 —— 序列化与反序列化

序列化 序列化是指将对象转换为字节流的过程&#xff0c;以便能够将其存储到文件、内存、网络传输等介质中&#xff0c;或者在不同的进程、网络或机器之间进行数据交换。 序列化的逆过程称为反序列化&#xff0c;即将字节流转换为对象。过反序列化&#xff0c;可以从存储介质…

【mysql】mysql之索引学习

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

面试搜狐大型模型算法工程师,感受非凡体验!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…

【Office】激活文件无法打开-DragonKMS--解决办法

【解决办法】右键 文件属性>>最下面勾选解除锁定即可打开。 【原因】&#xff1a;网络上下载的文件&#xff08;包括exe、zip等&#xff09;。

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…

esp32 控制 st7735s 显示屏(spi)

Lcd初始化后全屏为花屏&#xff0c;必须再把整个屏幕转成全底白色消除花屏后再显示图片&#xff0c;字符。 我理解为什么是花屏&#xff0c;因为只是初始化各个参数&#xff0c;显示内存现在还是为空&#xff0c;还没有执行0x2c命令。 图片 #include "driver/spi_master…

统一 transformer 与 diffusion !Meta 融合新方法剑指下一代多模态王者

本文引入了 Transfusion&#xff0c;这是一种可以在离散和连续数据上训练多模态模型的方法。 来源丨机器之心 一般来说&#xff0c;多模态生成模型需要能够感知、处理和生成离散元素&#xff08;如文本或代码&#xff09;和连续元素&#xff08;如图像、音频和视频数据&#xf…

软件测试-Selenium+python自动化测试

目录 一、元素定位 1.1一个简单的模板 1.2单选框radio定位实战 1.3下拉操作 1.4弹窗 1.5文件上传 1.6 iframe(类似于页中页,嵌套进去了) 二、元素定位实战 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览…

力扣面试经典算法150题:除自身以外数组的乘积

除自身以外数组的乘积算法详解 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;除自身以外数组的乘积。 题目链接&#xff1a;https://leetcode.cn/problems/product-of-array-except-self/description/?envTypestudy-plan-v2&envIdtop-interview-150 …

docker基础到进阶

基础 文章目录 基础1.Docker简介2.Docker基础概念3.Docker安装4.Docker命令4.1 镜像命令4.2 容器命令 5. 数据卷5.1具名挂载5.2 匿名挂载 进阶1. 镜像5.2 Dockerfile5.3 网络1.网络模式2.网络操作 DockerCompose1.基本语法 总结 这篇文章记录了以下的内容&#xff1a; 1️⃣ 利…

达梦数据库的系统视图v$object_usage

达梦数据库的系统视图v$object_usage 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$OBJECT_USAGE 视图提供了关于数据库对象的使用情况和统计信息。这些对象可以包括表、索引、视图、存储过程等。通过 V$OBJECT_USAGE 视图&#xff0c;数据库管理员可以监…

如何使用Hive构建网络电视剧收视率分析系统:大数据实战教程

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…