高级FPGA开发之基础协议PCIe

基础协议之PCIe部分

一、TLP包的包头

在PCIe的系统中,tlp包的包头的结构有许多部分是相似的,通过掌握这些常规的包头,能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。

在这里插入图片描述

通用的字段

通用字段作用
Fmt决定了包头是3DW还是3DW,tlp包是否包含数据
type决定tlp包的类型,比如Mrd、Mwr、Cfg、Msg、Cpl、Cpld
TCtraffic class,用于决定tlp包处理的优先级,3bit,数值越大优先级越高
attr属性,3bit,需要注意3个bit不是连在一起,attr[2]表示的是ID的一种排序方法。attr[1]表示tlp包的传输是保序还是乱序,保序要求严格按照tlp的顺序。attr[0]表示是否需要cache一致性,在进行大量数据传输的时候,可以选择关闭cache,提高效率。
TDtlp Digest该字段为1的时候需要在tlp包的最末尾添加ecrc,0不需要添加
EPtlp包错误信号
ATaddress type,表示地址类型,是否需要进行地址的转换
length用于Mwr,cpl,msg包,10bit,0-1024DW,1-1023表示对应数量的DW。tlp的起始地址和结束地址不能跨4K边界
first/last DW BE用于表示第一个DW和最后一个DW有效的字节,每一位对应一个字节。

在这里插入图片描述

内存请求tlp包头结构

在这里插入图片描述

在这里插入图片描述

对于内存请求包的包头如上图所示,3DW和4DW对应的可访问的地址空间是不同的。

  • request ID

    其中这个request id由3部分组成:分别是bus_num[7:0]、device_num[4:0]、func_num[2:0]决定。PCIe端点设备在上电时候会被RC进行枚举,并分配对应的ID,每个设备的ID在上电时确定。

  • tag

    这个表示是由请求方产生的,可以和request ID组成一个唯一的ID,保证唯一性,可以用来识别应答信息,用于包过滤。

对于Mwr和Mrd tlp包,他们的包头信息基本是一致的,同样包括了常规字段和requester ID等。

但是读内存请求Mrd是一个非转发Non-posted的包,需要一个独立的反馈事务来获取反馈回来的数据。

Mwr tlp包是一个转发包posted,写tlp包中需要包含数据。

完成包cpl、cpld包头

完成包的包头结构如下:

在这里插入图片描述

除了第一个DW的常规字段外,还有一些特殊的字段,需要掌握一下:

字段作用
Completer ID指示是由谁反馈的数据
Requester ID指示是谁请求的数据
Completion Status3bit完成状态,000是成功,001是不支持,010是配置请求重试,100是忽略
Byte Count指的是剩余未反馈数据的字节数量
Routing Tag从请求包当中复制的表示信号
Lower Address第一个有效字节地址的低7bit

二. 具体的tlp组包分析

2.1 内存读请求Mwr

假设系统的一些参数如下:

  • PCIe的最大负载为MPS=512 字节;
  • 系统边界RCB=128字节
  • 需要读取的地址起始地址:0x0010_00f8
  • 需要读取的长度:272字节
  • 请求ID号request ID:0x0001;
  • 回复者ID号completer ID:0x1000;
  • 标识tag:0x00;

基于上面的消息我们就能来模拟一个tlp包的传输了。

在这里插入图片描述

首先需要产生一个读请求包,所以可以确定ftm字段和type字段的值。

然后是tc,attr等字段,都保持为0就可以了。

然后需要注意的是要读取的数据长度为272字节,刚好是68个DW,所以在长度这里需要填入DW的长度,也就是0x44=0b00_0100_0100;由于读取的长度刚好是DW的整数倍,因为在first DW BE和last DW BE里面都填1,表示第一个和最后一个DW的数据中的每个字节都有效。

然后把tag、id填写到tlp包中,最后是填写入地址就可以了。

因此,得到的最终的这个Mrd包的结果如下:

在这里插入图片描述
当rc(root complex)接收到这个读请求包之后,就会从内存当中读取数据,并把这些数据组成一个一个的tlp包通过ID路由的方式,发送给端点的PCIe设备。

2.2 cpld

cpld包的包头结构如下:
在这里插入图片描述

第一个cpld包

首先确定CPLD包的类型,确定FMT字段和TYPE字段的值。

然后看第一个包能够发送多少数据,因为要读取的数据的地址是0x0010_00F8。由于不能跨rc界,因此第一次能够读取的数据个数为8字节,所以第一个tlp包的长度为8/4=2DW。

然后是需要填写当前还剩下多少字节没有返回,由于第一个tlp还没有返回数据,因此还剩下272个字节没有发送,所以这里需要填入272。

status的值,需要根据返回的状态来确定,正确返回需要填写3’b000。

然后依次把请求者ID和回复者ID还有TAG进行一个填写。

最后还需要关心的是一个lower address字段,该字段应该填入第一个有效字节的地址的低7位,也就是0x0010_00F8的低7位,也就是0x78。

然后在cpld的包头后面,跟上从内存当中读出的数据就好了。

因此可以得到第一个cpld包的内容如下:
在这里插入图片描述

第二个cpld包

第一个cpld包返回了8字节的数据,还剩下274字节的数据。

根据最大负载的mps=512字节,所以还剩下的数据小于最大负载。然后再考虑RCB,再保证不跨RCB的情况下能传输的最大长度就是两个RCB的长度也就是256字节。因此,本次传输的数据的长度就是256字节,换算成DW就是256/4=64=0x40。本次传输的起始地址是接着上一个包的结束地址,也就是0x0010_0100,可以构成第2个cpld包。

关键参数:

  • 长度64DW
  • 剩余的count 264字节
  • lower address,第一个有效字节低7位也就是0x00

在这里插入图片描述

第三个cpld包

在上一个包返回了256个字节后,还剩下8个字节的数据没有发送,因此在本包中,还需要完成最后的这8个字节的发送,本次发送的起始地址是0x0010_0200,发送的长度是2个DW
在这里插入图片描述

这样就完成了本次请求的全部的CPLD包的返回了。

三、未完待续

下章将继续介绍FPGA PCIe IP设置和使用。欢迎关注知乎:北京不北欢迎+V:beijing_bubei欢迎关注douyin:near.X (北京不北)获得免费答疑,长期技术交流。

四、参考文献

https://blog.csdn.net/qq_41332806/article/details/115338533

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

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

相关文章

2V2无人机红蓝对抗仿真

两架红方和蓝方无人机分别从不同位置起飞,蓝方无人机跟踪及击毁红方无人机 2020a可正常运行 2V2无人机红蓝对抗仿真资源-CSDN文库

Android电动汽车充电服务vue+uniAPP微信小程序

本系统利用SSM和Uniapp技术进行开发电动汽车充电服务系统是未来的趋势。该系统使用的编程语言是Java,数据库采用的是MySQL数据库,基本完成了系统设定的目标,建立起了一个较为完整的系统。建立的电动汽车充电服务系统用户使用浏览器就可以对其…

Python爬虫urllib详解

前言 学习爬虫,最初的操作便是模拟浏览器向服务器发出请求,那么我们需要从哪个地方做起呢?请求需要我们自己来构造吗?需要关心请求这个数据结构的实现吗?需要了解 HTTP、TCP、IP 层的网络传输通信吗?需要知…

华清远见嵌入式学习——春节作业——2.4日

作业要求: 编写程序实现二叉树的创建,三种遍历自己销毁 作业答案: 作业代码截图 作业代码效果图 作业代码 #include "myhead.h"// 定义二叉树节点结构体 struct Tree {int value; //编号(值)struct Tree* left; //左子树stru…

idea创建spring项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建spring项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype,在Archetype,选中maven-archetype-webapp,点击Create 2、配置maven 默认是使用IDEA内…

管理类联考-复试-英语-听力

文章目录 准备工作1.如何准备英语听力?2.听力学习注意事项一:培养良好的听音习惯,听读顺序要合理3.听力学习注意事项二:边听边记关键词 训练短期记忆能力4.听力学习注意事项三:熟记语篇衔接词把握信息走向5.听力学习注…

少儿编程 中国电子学会图形化编程2022年1月等级考试Scratch三级真题解析(选择题、判断题)

1.默认小猫角色和气球角色都是显示状态,小猫程序如下图所示,气球没有程序,点击绿旗,舞台上最终显示的效果是?( ) A:可能出现6个不同位置的小猫和6个小球 B:可能出现6个…

Multisim14.0仿真(四十九)共阴极/阳极7段数码管驱动设计

一、74LS47/48简介: 74LS47/48芯片是一种常用的七段数码管译码器驱动器,常用在各种数字电路和单片机系统的显示系统中. 二、74LS47/48引脚说明及定义: 7段显示译码器74LS47/48是输出低/高电平有效的译码器,74LS47/48除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya…

Unity类银河恶魔城学习记录1-9 PlayerWallSilde源代码 P36

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; us…

gerrit 安装插件

1.插件下载 gerrit 3.9 插件,打开链接去右上角搜索插件名称,找到合适的版本,由于我这儿需要安装gerrit 3.9.1 的 autosubmitter 插件,但是好像没有 3.9 的,有下面这俩 上面那个可以理解为基于插件的主分支代码进行构…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItemGroup组件 该组件用来展示菜单MenuItem的分组。 子组件 无 接…

高通android设备themal读取cpu温度

以msm8953的themal分布信息,主要是下图的位置: 这其中 cpu相关的themal的位置有: 读取thermal 温度数据可以通过以下几个步骤: 获取sensor_info rootmsm8953_64:/ # cat /sys/module/msm_thermal/sensor_info tsens:tsens_tz_se…

我用全志V851s做了一个魔法棒,使用Keras训练手势识别模型控制一切电子设备

这是一个可以直接启动原神的魔法棒~ 原神,启动! 这是一个万全的解决方案!只需要花80元再动动手,就可以将哈利波特的魔杖与人工智能结合到一起!它就是用全志V851s做的赛博魔杖! 这个魔法手杖有啥亮点 手势…

Go协程揭秘:轻量、并发与性能的完美结合

目录 1. Go协程简介什么是Go协程?Go协程与线程的比较Go协程的核心优势 2. Go协程的基本使用创建并启动Go协程使用匿名函数创建Go协程Go协程与主函数 3. Go协程的同步机制1. 通道 (Channels)2. sync.WaitGroup3. 互斥锁 (sync.Mutex) 4. Go协程的高级用法1. 选择器 (…

每日一题——LeetCode1394.找出数组中的幸运数

方法一 桶数组计数法 又要保存整数的数值和他出现的频次,那么碰到一个整数num就让res[num],那么循环res数组,如果res[i]0则代表i没有在arr中出现过,res[i]n则代表i在arr中出现n次 因为题目要求只返回最大的幸运数,所…

计算机软件能力认证考试CCF-202312-1 仓库规划

#自己跑的测试没问题&#xff0c;不知道为啥就是不能满分 原理比较绕&#xff0c;就是让数组中一行不断地与其他行进行比较&#xff0c;最终得到各自的索引 #include <iostream> using namespace std; int main() {int n;int m;cin>>n>>m; int array[n][m];…

【C/C++ 08】简单计算器

一、题目 输入算术表达式&#xff0c;可包含空格&#xff0c;检查算术表达式的合法性&#xff0c;若算术表达式不合法&#xff0c;打印错误类型&#xff0c;若合法&#xff0c;则进行运算&#xff0c;打印计算结果。 二、算法 1. 将输入的算术表达式字符串去除空格。 2. 检查…

电源模块欠压保护点测试方法分享 纳米软件

电源欠压保护原理 欠压保护是指当电源电压低于一定值时&#xff0c;电源的保护功能会及时断开电路&#xff0c;避免设备受到损坏。电源欠压保护一般是通过一个或多个传感器来检测电压&#xff0c;当电压低于设定值时就会触发电源的保护功能&#xff0c;断开电路&#xff0c;保护…

猫用空气净化器真的能除菌吗?除毛可以用宠物空气净化器吗?

猫咪给我们带来了无尽的欢乐&#xff0c;但它们换毛时家里到处都是猫毛。我们会在地板、沙发上发现一大堆&#xff0c;甚至衣服也难逃其影响。这些浮毛中可能携带着微生物和尘螨等。对于免疫力较低的老年人、孩子和孕妇来说&#xff0c;他们更容易感染这些微生物。而对于鼻炎患…

[Tomcat问题]--使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常

[Tomcat问题]–使用Tomcat 10.x部署项目时&#xff0c;出现实例化Servlet类[xxx]异常 本片博文在知乎同步更新 环境 OS: Windows 11 23H2Java Version: java 21.0.1 2023-10-17 LTSIDE: IntelliJ IDEA 2023.3.3Maven: Apache Maven 3.9.6Tomcat: Tomcat 10.1.18 ReleasedSer…