高级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,一经查实,立即删除!

相关文章

二级C语言笔试2

(总分100,考试时间90分钟) 一、选择题 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。 1. 下列叙述中正确的是( )。 A) 算法的效率只与问题的规模有关,而与数据的存储结构无关 B) 算法的时间复杂度是指执行算法所需要的计算工作量 …

2V2无人机红蓝对抗仿真

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

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

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

Python爬虫urllib详解

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

mongodb数据库集合(表)的创建和数据修改

文章目录 前言发现宝藏一、集合的创建二、集合的修改三、数据插入数据库四、清空数据库集合数据 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作…

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

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

C语言代码审查:解析与应对策略

在C语言编程的世界中,代码审查是一项至关重要的任务,它旨在发现并修复潜在的错误、改进代码质量,并强化开发者的编码规范。本文将详尽阐述C语言代码审查过程中常见的错误类型及其深层原因,同时提供针对性的解决策略和最佳实践。 …

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…

eCos flash模拟EEPROM实现NV系统

Flash需要擦除的原因&#xff1a;先擦除后写入的原因是为了工业上制作方便&#xff0c;即物理实现方便。 #include <cyg/infra/diag.h> #include <cyg/io/flash.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> // SPI flash…

gerrit 安装插件

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

java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector 240204

springboot3.2.2改为2.7.18后 控制台异常显示: java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector at org.mybatis.spring.mapper.ClassPathMapperScanner.(ClassPathMapperScanner.java:91) ~[mybatis-spring-3.0.3.jar:3.0.3] at org.mybatis.spring.m…

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

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

高通android设备themal读取cpu温度

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

2024.1.30 Spark SQL的高级用法

目录 1、如何快速生成多行的序列 2、如何快速生成表数据 3.开窗函数 排序函数 平分函数 聚合函数 向上向下窗口函数 1、如何快速生成多行的序列 -- 需求: 请生成一列数据, 内容为 1 , 2 , 3 , 4 ,5 仅使用select语句 select explode(split(1,2,3,4,5,,)) as num;-- 需…

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

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

Linux mount命令教程:如何挂载文件系统(附案例详解和注意事项)

Linux mount命令介绍 mount命令在Linux中用于挂载Linux系统外的其它文件系统&#xff0c;每个设备在使用前都必须先挂载。此命令通常用于挂载文件系统。 Linux mount命令适用的Linux版本 mount命令在所有的Linux发行版中都是可用的&#xff0c;包括Debian、Ubuntu、Alpine、…