您的位置:首页 > 汽车 > 新车 > 学习pcie—20240724

学习pcie—20240724

2024/10/19 17:34:24 来源:https://blog.csdn.net/weixin_49574391/article/details/140661537  浏览:    关键词:学习pcie—20240724

因为前一段时间看了xdma的IP核手册,发现只看xdma看不太懂,不清楚pcie的传输的流程,不了解报文格式,所以看看pcie手册,主要关注发送接收时序

首先是pcieIP核与xdmaIP核的区别:

Integrated Block for PCI Express:7 Series Integrated Block for PCI Express 是最基础的PCIe IP, 实现的是PCIe 的物理层、链路层和事务层,提供给用户的是以 AXI4-stream 接口定义的TLP包。这是三种 IP 中“最小的”(即最少的资源)和最灵活的,也是开发难度最大的。该 IP 将大部分开发工作留给了用户。 用户如果要往主机发数据, 需要在逻辑端组好MEM_WR事务包送到AXI4-stream 接口,同样要从主机获取数据,就要发送MEM_RD事务包,然后获取到COMPLETE事务包,再从COMPLETE事务包中提取出数据。 使用该IP核,需要对PCIe 协议有清楚的理解, 特别是对事务包 TLP 报文格式。


AXI Memory Mapped To PCI Express IP:该 IP 不仅封装了 7 Series Integrated Block for PCI Express IP,而且还提供了 AXI MM/S 桥。该桥不仅实现了 AXI4 tostream 的功能,还提供了事务层包 TLP 的组装和拆卸、地址转换、错误处理等功能。使用该 IP 时,用户只需通过 AXI4 接口接收和发送 PCIe 数据,不需要组装和拆卸事务包。 从逻辑资源消耗的角度来看, 居三种IP 之中,开发难度也是居三种 IP 之中。


DMA/Bridge Subsystem for PCI Express (PCIe)(XDMA):该 IP 不仅完成了事务层的组包解包,还添加了完整的 DMA 引擎。
XDMA 虽然简单易用,但 XDMA 也有它的局限,主要表现在两个方面:
1)XDMA 正如其名字中的 DMA 一样,适用与大批量的数据传输场景,不适合小数据场景。
2)XDMA 只能用于 PCIe 的终端( endpoint) 设备,不能用于 Root Port,另外二个 IP 既可以用于终端( endpoint)设备,也可以用与 Root Port。
PCIe 的终端设备如 PCIe 视频采集卡、显卡等。简单理解就是 PCIe 的终端设备只有 PCIe 金手指,没有PCIe 插槽,而 Root Port 带有 PCIe 插槽,可以插 PCIe 终端设备。由于一般开发 PCIe 应用大多是 PCIe 终端,所以第二点的局限性实际上较小。引用:FPGA(基于xilinx)中PCIe介绍以及IP核XDMA的使用_xilinx pcie-CSDN博客

//简单来说就是pcie ip只完成了pcie协议中的物理层 数据链路层 事务层 ,提供了一个TLP包,如果想要与主机和板卡交互,还需要自己完成,而xdma的完成了数据的拆包组包,添加了DMA引擎,可以协助搬运数据。//

顶层功能块和接口:

type0 配置头格式,就是非桥设备,桥设备为type 1 .

64位交易层接口设计:

ax4 - stream接口上的TLP格式

当使用AXI4-Stream接口时,数据包被安排在整个64位数据路径上。

图显示了相同的示例数据包在AXI4-Stream接口上。报文的字节0出现在第一个QWORD的s_axis_tx_tdata[31:24](发送)或m_axis_rx_tdata[31:24](接收)上,字节1出现在s_axis_tx_tdata[23:16]或m_axis_rx_tdata[23:16]上。字节8出现在第二个QWORD的s_axis_tx_tdata[31:24]或m_axis_rx_tdata[31:24]上。包的报头部分由三个或四个dword组成,由TLP格式和类型决定,如PCI Express Base Specification第2.2节所述。

可以看到不同颜色的字段相对应,TLP报文格式对应在axi数据流上如图所示,报文字节0对应[31:24]bite,以此类推。

定义发送用户应用程序信号。为了发送TLP,用户应用程序必须在发送事务接口上执行以下事件序列:

1. 用户应用程序逻辑断言s_axis_tx_tdata有效,并在s_axis_tx_tdata上呈现第一个TLP QWORD[63:0]。如果内核正在断言s_axis_tx_treready,则立即接受QWORD;否则,用户应用程序必须保持QWORD呈现,直到内核断言s_axis_tx_treready。

2. 用户应用程序断言s_axis_tx_tvalid,并在s_axis_tx_tdata[63:0]上显示TLP QWORDs的剩余部分,以供随后的时钟周期使用(内核断言s_axis_tx_tready)。

3. 用户应用程序将断言s_axis_tx_tvalid和s_axis_tx_tlast以及最后的QWORD数据。如果最后一次传输的所有8个数据字节都是有效的,它们将显示在s_axis_tx_tdata[63:0]上,并且s_axis_tx_tkeep被驱动到0xFF;否则,剩余的4个数据字节将显示在s_axis_tx_tdata[31:0]上,并将s_axis_tx_tkeep驱动到0x0F。

4. 在下一个时钟周期,用户应用程序取消s_axis_tx_tvalid,以发出s_axis_tx_tdata[63:0]上有效传输结束的信号。

演示了一个带有数据负载的3-DW TLP报头;例如32位可寻址内存写请求。当用户应用程序断言s_axis_tx_tlast时,它还在s_axis_tx_tkeep上放置一个0xFF值,通知内核s_axis_tx_tdata[63:0]包含有效数据。

说明了一个带有数据负载的4 dw TLP报头;一个例子是64位可寻址内存写请求。当用户应用程序断言s_axis_tx_tlast时,它还将值0x0F放在s_axis_tx_tkeep上,通知内核只有s_axis_tx_tdata[31:0]包含有效数据。

在传输接口上呈现背靠背事务,

用户应用程序可以在传输AXI4-Stream接口上呈现背靠背的tlp,以最大限度地利用带宽。图3-7所示为发送接口上背靠背的tlp。用户应用程序保持s_axis_tx_tvalid断言和在为前一个TLP断言s_axis_tx_tlast之后,在下一个时钟周期中呈现一个新的TLP

如果用户应用程序在s_axis_tx_tdata[63:0]上没有数据,则事务接口允许它进行节流。当这种情况发生时,用户应用程序取消s_axis_tx_tvalid,这将指示核心AXI4-Stream接口忽略s_axis_tx_tdata上呈现的数据[63:0]。图3-8说明了源节流机制,其中用户应用程序没有数据来表示每个时钟周期,因此必须在这些周期中取消assert s_axis_tx_tvalid

基本TLP接收操作

定义接收axis4 - stream接口信号。这一系列事件必须发生在接收axis4 - stream接口上,以便端点核心向用户应用程序逻辑呈现TLP:当用户应用程序准备好接收数据时,它断言m_axis_rx_tready。

2. 当内核准备好传输数据时,内核断言m_axis_rx_tdata有效,并在m_axis_rx_tdata上呈现第一个完整的TLP QWORD[63:0]。

3. 核心保持m_axis_rx_tvalid断言,并在随后的时钟周期中对m_axis_rx_tdata[63:0]呈现TLP QWORDs(前提是用户应用程序逻辑断言m_axis_rx_tready)。

4. 然后,内核用m_axis_rx_tlast断言m_axis_rx_tvalid,并在s_axis_tx_tdata上显示最后一个QWORD[63:0],在m_axis_rx_tkeep上显示值0xFF,或者在s_axis_tx_tdata上显示最后一个DWORD[31:0],在m_axis_rx_tkeep上显示值0x0F。

5. 如果在下一个时钟周期中没有可用的tlp,内核取消m_axis_rx_tvalid,以发出m_axis_rx_tdata[63:0]上有效传输结束的信号。

显示一个带有数据负载的3-DW TLP报头;例如32位可寻址内存写请求。当内核断言m_axis_rx_tlast时,它还会在m_axis_rx_tkeep上放置一个0xFF值,通知您m_axis_rx_tdata[63:0]包含有效数据

显示一个带有数据负载的4 dw TLP报头;一个例子是64位可寻址内存写请求。当内核断言m_axis_rx_tlast时,它还将值0x0F放在m_axis_rx_tkeep上,通知您只有m_axis_rx_tdata[31:0]包含有效数据

用户应用程序可以通过取消断言m_axis_rx_trready,随时停止从核心传输数据。如果在没有传输进行的情况下取消断言m_axis_rx_tready,并且如果TLP可用,则内核断言m_axis_rx_tvalid并在m_axis_rx_tdata上呈现第一个TLP QWORD[63:0]。在断言m_axis_rx_tdata以表示接受m_axis_rx_tdata[63:0]上呈现的数据之前,内核一直保持这种状态。此时,只要m_axis_rx_trready保持断言状态,核心就会呈现后续TLP QWORDs。如果在传输过程中取消断言m_axis_rx_tredy,那么内核将暂停数据传输,直到再次断言m_axis_rx_tredy。m_axis_rx_tready deasserted.是无限制次数的。核暂停,直到用户应用程序再次准备好接收tlp。

说明核心断言m_axis_rx_tvalid以及在m_axis_rx_tdata上呈现数据[63:0]。用户应用程序逻辑通过取消断言m_axis_rx_treready来插入等待状态。内核在检测到m_axis_rx_trready断言之前不会显示下一个TLP QWORD。用户应用程序逻辑可以根据需要断言或取消断言m_axis_rx_trready,以平衡新TLP传输的接收与应用程序逻辑内部TLP数据处理的速率

在接收接口上接收背靠背事务用户应用程序逻辑必须被设计成由核心处理接收AXI4-Stream接口上的背靠背tlp的表示。内核可以在为前一个TLP断言m_axis_rx_tlast之后的时钟周期为新TLP断言m_axis_rx_tvalid。

接收接口上的背靠背tlp示意图如图3-20所示

如果用户应用程序不能接受背对背的数据包,它可以通过取消断言m_axis_rx_trready来暂停TLP的传输,如在接收axis4流接口上节流数据路径一节中所讨论的那样。使用m_axis_rx_trready暂停接收第二个TLP的示例如图3-21所示。

排序或其他时序图参考 PG054 46到63页。

本文仅对基本传输时序做简单记录。

note: axis只是一种传输传输模式,简单来说就是规定了valid ready有效时传输数据等。。。而传输的数据就是以TLP报文格式传输的。pcie IP核就是对传输的数据进行封包和拆包。=或许可以理解为axis相当于大门,在十二点的时候开,TLP报文相当于一堆人,只能在十二点进,进去之后解封装,就是在一堆人中找到一个人(所需要的数据)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com