【紫光同创PCIE教程】——DMA读写/PIO内存读写TLP解析

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.meyesemi.com)

一:PIO内存读写操作TLP解析

PCIE有三种空间——内存空间、IO空间、配置空间,其中内存空间是目前PCIE设备常用的空间,IO空间是为了兼容以前的PCI设备(PCIE设备几乎不用IO空间了),配置空间是PCIE设备的信息空间(ID、BAR、等等都写在里面,主机内核程序初始化会读PCIE的配置空间信息,从而给Endpoint分配PICE总线域空间等一系列操作)。

PIO并不是说读写IO空间,原理上还是读写内存空间,PIO读写类似读写寄存器一样,每次对内存特定地址写一个数据(数据大小一般为32bit)。使用官方驱动指令读写PIO的操作,实质和使用WinDriver操作Read/Write Memory无异,不过官方驱动把每次的数据长度限制在了1DW(32bit)内,大于1DW的数据,会分多次发送。

图片

写1DW数据。

图片

写2DW数据。

图片

写3DW数据。

图片

读1DW数据。

图片

读2DW数据。

图片

读3DW数据。

注意的是,根据PCIE协议的Mwr,一次Mwr/Mrd数据大小最大可以是4096Byte,上面大于4Byte分了多次Mwr发送是驱动程序的做法。看到时序图的信号都是满足要求的,但是具体信号的数据是怎样的呢?现在以读写12Byte Memory为例来分析这些数据。

Write/Read Memory 使用到了三种类型的报文—Mwr/Mrd/CplD。在使用PCIE IP时,底层的东西可以不需要太关心,但是解析接收到的TLP解析和发送合乎要求的TLP是重点。

对于Mwr/Cpld,他们携带的数据就是数据,没什么需要分析的,需要分析的是TLP中的Header,Mrd报文只有Header,分析Header才是重点。

注意的是,Mwr/Mrd是地址路由,而CplD是ID(Bus/Device/Function)路由,这是协议规定的,所谓路由简单理解就是RC根据地址/ID,能够在众多的PCIE传输路径中把数据送到目标设备,因为内核程序初始化给给每个BAR分配了PCIE总线域空间,每个BAR空间地址都是独立映射的,而ID根据(Bus/Device/Function)唯一确定。

对于Mwr/Mrd的Header格式如下图:

图片

对于CplD的Header格式如下图:

图片

Mwr:
Header:0x0000_0000_df20_2000_0000_000f_4000_0001
Data: 0x0000_0000_0000_0000_0000_0000_0102_0304
Header:0x0000_0000_df20_2004_0000_000f_4000_0001
Data:0x0000_0000_000_0000_0000_0000_0506_0708
Header:0x0000_0000_df20_2008_0000_000f_4000_0001
Data:0x0000_0000_0000_0000_0000_0000_090a_0b0c

对于Mwr的Header,对着协议格式分析,很容易知道第一个Header地址(32bit)是df20_2000,携带数据长度Length(以DW为单位)为1,报文类型[Fmt,Type]=0x40(表明为3DW Mwr),字节使能[last DW BE,first DW BE]=0x0f,其他信息对座入号就行了,特别注意的是TLP是大端格式,[Fmt,Type]=axis_master_tdata[31:24],实际代表的是0Byte的位置,其他DW数据亦如此。

Mrd:
Header:0x0000_0000_df20_2000_0000_000f_0000_0001
Header:0x0000_0000_df20_2004_0000_000f_0000_0001
Header:0x0000_0000_df20_2008_0000_000f_0000_0001

对于Mrd的Header,对着协议格式分析,很容易知道地址(32bit)是df20_2000,请求数据长度Length(以DW为单位)为1,报文类型[Fmt,Type]=0x00(表明为3DW Mrd),字节使能[last DW BE,first DW BE]=0x0f,其他信息对座入号就行了,深入了解可读PCIE协议规范。

CplD:
Header:0x0000_0000_0000_0000_0100_0004_4a00_0001
Data:0x0000_0000_0000_0000_0000_0000_0102_0304
Header:0x0000_0000_0000_0010_0100_0004_4a00_0001
Data:0x0000_0000_0000_0000_0000_0000_0506_0708
Header:0x0000_0000_0000_0020_0100_0004_4a00_0001
Data:0x0000_0000_0000_0000_0000_0000_090a_0b0c

对于Cpld的Header,采用的是ID路由,很容易知道Requester ID为0x0000,Completer ID为0x0100,回复数据长度Length(以DW为单位)为1,报文类型[Fmt,Type]=0x4a(表明为CplD),Byte Count为0x004,TAG为0x00,其他信息对座入号就行了。具体的含义可查询PCIE协议规范。

二:DMA读写操作TLP解析

DMA直接内存访问,内存访问的发起者是FPGA,所以主机要发数据给FPGA,首先是发送DMA读指令和数据在主机内存的首地址给FPGA,FPGA根据内存首地址和数据长度发起一个Mrd,主机再回复CplD,这样就把数据传送到FPGA,称为DMA读操作。与之相反的是,主机发送DMA写指令和数据要放主机内存首地址给FPGA,FPGA根据内存首地址和数据长度发起带数据Mwr,这样就数据传送到主机,称为DMA写操作。

图片

1024Byte DMA读,主机到FPGA。

图片

1024Byte DMA写,FPGA到主机。

图片

2048Byte DMA读,主机到FPGA。

图片

2048Byte DMA读,FPGA到主机。

通过上面的DMA读写时序图不难发现,实现DMA读,主机会首先发3次Mwr TLP给FPGA,FPGA解析MWr TLP后会发起Mrd TLP,主机再回复CplD TLP,这样就数据传输到FPGA了;实现DMA写,主机首先发3次Mwr TLP给FPGA,FPGA解析MWr TLP后会直接上发带数据的MWr TLP,这样就数据传到主机了。

主机的3次MWr TLP是什么呢?通过解读例程的DMA模块下的dma_controller模块,不难发现,BAR1+0x100偏移量的数据是指示FPGA发起带数据的Mwr/不带数据的Mrd(也包含数据长度等),BAR1+0x100偏移量的数据是搬运数据的主机物理内存首地址的低32位,BAR1+0x100偏移量的数据是搬运数据的主机物理内存首地址的高32位。
DMA是直接存储器访问,要直接从主机内存搬数据/写数据,首先要知道主机内存首地址。一定是3次Mwr TLP通信握手吗?肯定不是的,这是生成IP例程的做法,自行设计DMA控制器的话,可以使用更复杂/更有效的握手机制来触发DMA操作。

时序图中Header:

DMA——主机的Mwr (以1024Byte为例)

第一次:
Header:0x0000_0000_df20_4100_0000_000f_4000_0001
Data:0x0000_0000_0000_0000_0000_0000_ff00_0100

第二次:
Header:0x0000_0000_df20_4110_0000_000f_4000_0001
Data:0x0000_0000_0000_0000_0000_0000_00a0_2647

第三次:
Header:0x0000_0000_df20_4120_0000_000f_4000_0001
Data:0x0000_0000_0000_0000_0000_0000_0100_0000

这个Mwr是32bit Address访问,存储器访问都是通过地址路由,Header的意义和上面Mwr分析是一致的。

DMA——主机的CplD(以1024Byte为例)

第1个Header:0x0000_0000_0100_0000_0000_0200_4a00_0020

第2个Header:0x0000_0000_0100_0000_0000_0180_4a00_0020

第3个Header:0x0000_0000_0100_0000_0000_0100_4a00_0020

第4个Header:0x0000_0000_0100_0000_0000_0080_4a00_0020

第5个Header:0x0000_0000_0100_0100_0000_0200_4a00_0020

第6个Header:0x0000_0000_0100_0100_0000_0180_4a00_0020

第7个Header:0x0000_0000_0100_0100_0000_0100_4a00_0020

第8个Header:0x0000_0000_0100_0100_0000_0080_4a00_0020

完成报文使用ID路由(协议规定,简单就是对于每一个BAR,都有自己的ID(Bus/Device/Function),通过这个唯一的ID可以找到接收目标)。

CplD的Header只能是3DW组成,具体和上面CplD分析是一致的。需要注意的是协议规定CplD最大数据长度是1024DW(4096 Byte),但是我们IP配置页面默认设置Max Playload Size其实是128 Byte,所以大于128 Byte的数据需要分多次发送。需要注意的是前4 Header的TAG=0x00,后4 Header的TAG=0x01,为什么这样,因为FPGA发了两次Mrd,TAG就是记录发了Mrd,收到完成报文中TAG和Mrd一致,代表当前Mrd完成了。


可以知道TAG是8bit,一旦Mrd的TAG=0xff,但是0x00的CplD还没回复,Mrd便不可再发送了(对于同一个的BAR的Mrd)。

可以看到Byte Count是变化的,这个很好理解,表示当前传输距离Mrd请求的数据量还有多少(这里不是我们最终的1024 Byte,而是一个Mrd的Byte数)。第一个Header为0x200,表示距离Mrd请求数据量还有512 Byte,第二个Header为0x180,表示距离Mrd请求数据量还有384 Byte,以此类推。一次Max Playload Size是128 Byte,传输一次CplD,距离目标就减少128 Byte。到了第5个Header,为什么回到512 Byte了,因为第5个Header CplD是新的Mrd请求了,同样请求长度为512 Byte。

DMA——FPGA的Mrd(以1024Byte为例)

Header:0x20d5_0400_0000_0000_0000_0001_0100_1c80
Header:0x20d5_0480_0000_0000_0000_0001_0100_3c80

这个Mrd是64bit Address访问,存储器访问都是通过地址路由,Header的意义和上面Mrd分析是一致的。这个64bit的地址是FPGA要读主机的内存的地址,低32bit放在第4DW,高32bit放在了第3个DW,这个地址肯定不是固定的,即使同一台电脑,主机每次读写开辟内存空间放数据的位置也不一样。

这里Mrd为什么需要分两次发送呢,因为PCIE IP设置的Max_rd_req_size为512 Byte,所以大于512 Byte的数据,需要分多次Mrd,例如向主机内存请求2048 Byte的数据,需要4次Mrd,每一个Mrd记录一个Tag,这样就对应上了CplD的Tag。

DMA——FPGA的Mwr(以1024Byte为例)

Mwr已经展开多次了,就不重复了。

盘古50K开发板|紫光同创PGL50H开发平台

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计一款可扩展和基于windows系统的一键处理表格小工具思路

原创/朱季谦 设计一款可扩展和基于windows系统的一键处理表格小工具思路 日常开发当中,业务人员经常会遇到一些重复性整理表格的事情,这时候,就可以通过一些方式进行自动化程序处理,提高工作(摸鱼)效率。 …

【机器视觉技术】:开创人工智能新时代

🎥 屿小夏 : 个人主页 🔥个人专栏 : IT杂谈 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑 前言🌤️ 机器视觉技术的实现☁️ 图像采集☁️ 图像处理☁️ 数据建模☁️应用展示…

基于harbor管理helm charts的方法

前言 Helm是Kubernetes的包管理器。Helm使用一种称为charts的打包格式。自1.6.0版本以来,Harbor是一个复合的云原生注册表,支持容器镜像管理和Helm Chart管理。对Harbor中Helm charts的访问由基于角色的访问控制(RBAC)控制&#…

Servlet概念视频笔记

学习地址:121-尚硅谷-Servlet-什么是Servlet_哔哩哔哩_bilibili 目录 1.Servlet技术 a.什么是Servlet b.手动实现Servlet程序 c.url地址如何定位到Servlet程序去访问 d.Servlet的生命周期 e.GET 和 POST 请求的分发处理 f.通过继承 HttpServlet 实现 Servlet程序 g.使用…

分享82个清新唯美PPT,总有一款适合您

分享82个清新唯美PPT,总有一款适合您 PPT下载链接:https://pan.baidu.com/s/1tnRpOR8Gexg9gjWz4z15Xw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付…

AI一键生成文案-免费AI一键生成文案的软件有哪些

AI一键生成文案的原理涉及自然语言处理(NLP)和机器学习技术。这种技术的核心是基于大量文本数据的模式识别和生成,通常使用深度学习模型,如循环神经网络(RNN)、长短期记忆网络(LSTM)…

今日公众号爆文排行

​写爆文公众号需要综合考虑多个因素,包括内容质量、受众需求、话题热度、推广策略等。在创作过程中,可以着重参考其他作品,学习其优点和技巧,但同时也要注意避免抄袭和侵权行为。以下是一些写爆文公众号的方法和建议:…

2023年第十二届数学建模国际赛小美赛D题望远镜的微光系数求解分析

2023年第十二届数学建模国际赛小美赛 D题 望远镜的微光系数 原题再现: 当我们使用普通光学望远镜在昏暗的光线下观察远处的目标时,入射孔径越大,进入双筒望远镜的光线就越多。望远镜的放大倍数越大,视野越窄,图像显示…

使用NVM管理多个版本的node.js

1、nvm介绍: nvm全英文也叫node.js version management,是一个nodejs的版本管理工具。nvm是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js 2、下载nvm地址: https://d…

蓝桥杯day03——二进制间距

1.题目 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。 如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离…

计算机新建盘符和重新分配盘符的大小

一、新建盘符 有些电脑刚买来时候,只有一个C盘分区,此时最好增加几个分区方便使用。 注意:分区操作要慎重,不要轻易去试。这里只针对购买的电脑厂家未做分区,只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码(不在Android源码) 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动,有个技巧可以new 空proje…

Vue生命周期:组件的生命之旅

🍃引言 在Vue.js中,每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子,对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

【Linux】I/O多路转接技术

I/O多路转接技术 一、I/O多路转接之select1、select函数2、fd_set的相关内容3、如何在代码中高效的使用select函数4、select服务器5、select的优缺点6、select的适用场景 二、I/O多路转接之poll1、poll函数2、struct pollfd结构2、poll服务器3、poll的优缺点 三、I/O多路转接之…

在文本框中添加单位

<el-col :span"12"><el-form-item label"进度" prop"schedule":rules"[{required: true, message:进度不能为空, trigger:blur},{validator: validator.isFloatGteZero, trigger:blur}]"><el-input v-model"input…

vcruntime140_1.dll错误的解决方案,与vcruntime140_1.dll下载指南

vcruntime140_1.dll是Visual C redistributable 2015-2019的一部分&#xff0c;如同很多动态链接库&#xff08;dll&#xff09;文件&#xff0c;它落在系统级别可共享软件组件的范畴。用户可能会在安装或运行一些游戏或程序时遇到"vcruntime140_1.dll丢失"的问题。今…

【Docker】Swarm的ingress网络

Docker Swarm Ingress网络是Docker集群中的一种网络模式&#xff0c;它允许在Swarm集群中运行的服务通过一个公共的入口点进行访问。Ingress网络将外部流量路由到Swarm集群中的适当服务&#xff0c;并提供负载均衡和服务发现功能。 在Docker Swarm中&#xff0c;Ingress网络使…

基于OpenSSL和nginx搭建本地https服务器(详细实操版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…

预览功能实现

需求&#xff1a;将后端返回来的文字或者图片和视频展示在页面上。 <!-- 预览 --><el-dialog title"预览" :visible.sync"dialogPreviewVisible" width"50%" append-to-body :close-on-click-modal"false" close"Previe…