一、PCIe 总线概述
PCI Express (peripheral component interconnect express) 简称 PCIe,是一种高速串行计算机扩展总线标准,是用来互连诸如计算和通信平台应用中外围设备的第三代高性能I/O 总线,是由英特尔在 2001 年提出的,当时被称为“3GIO”,旨在替代前两代总线标准。第一代总线包括 ISA、EISA、VESA 和微通道( Micro Channel)总线,而第二代总线则包括了 PCI、AGP 和 PCI-X。 PCIe 总线的提出是为了解决当时人民日益增长的美好生活需要和传输慢带宽低提升难的总线标准之间 的矛盾。PCIe 总线提出后,经 PCI-SIG 审核,于 2002 年 7 月正式公布了第一版规范,并更名为 PCI Express。 从 2004 年开始,PCI Express 总线逐渐全面取代 PCI 和 AGP 总线,成为新的局部总线工业标准。 PCI Express 总线继承了第二代总线体系结构最有用的特点,并且采用了计算机体系结构中新的开发成 果。例如,PCI Express 采用了与 PCI 和 PCI-X 相同的使用模型和读一写( load-store)通信模型。不过与 PCI 总线的共享并行架构不同,PCI Express 总线使用高速串行传送方式,能够支持更高的频率,连接的设备不再像 PCI 总线那样共享总线带宽。除此之外PCI Express 总线还引入了一些新特性,如流量控制机制、服务质量管理(QoS)、热插拔支持、数据完整性和新型错误处理机制等。而且 PCI Express,总线在系统软件级与PCI 总线保持兼容,最大程度上降低了系统软件从原有的 PCI 总线体系结构移植到 PCI Express 总线体系结构的难度。
PCI Express 能够应用于移动设备、台式电脑、工作站、服务器、嵌入式计算和通信平台等所有周边 I/O设备互连的总线。PCIe 总线在实际工程实践中得到了良好的应用,主要应用在光纤、PCIe 数据采集卡、FPGA 加速卡、存储子系统等所有需要和主机进行高速数据交互的场所。
二、PCIe总线结构
了解了 PCIe 总线是什么后,我们简单的了解下 PCIe 总线的架构。至于是为什么简单了解而不是详细介绍,有两个原因。一是因为 PCIe 总线作为一种高速总线,其架构比较复杂,限于篇幅不可能做到详细介绍;二是因为 Xilinx 提供的 PCIe IP 对外提供了 AXI 接口,封装了 PCIe 总线协议架构,简化了 PCIe 开发,尤其是要使用的 XDMA IP。
PCIe 总线架构与以太网的 OSI 模型类似,是一种分层协议架构,分为事务层(Transaction Layer)、数据链路层(Data Link Layer) 和物理层(Physical Layer)。这些层中的每一层都分为两部分:一部分处理出站(要发送的)信息,另一部分处理入站(接收的)信息,如图1所示。
在 PCIe 体系结构中使用数据包在设备之间传递信息,数据包在事务层和数据链路层中形成,以将信息从发送设备传送到接收设备。
1、事务层
事务层的主要责任是事务层包 TLP(Transaction Layer Packet)的组装和拆卸。事务层接收来自 PCIe 设备核心层的数据,并将其封装为 TLP。TLP 用于传达事务,例如读取和写入,以及确定事件的类型。事务层还负责管理 TLP 的基于信用的流控制。每个需要响应数据包的请求数据包都作为拆分事务实现。每个数据包都有一个唯一标识符,该标识符使响应数据包可以定向到正确的始发者。数据包格式支持不同形式的寻址,具体取决于事务的类型(内存、I/O、配置和消息)。数据包可能还具有诸如 No Snoop、Relaxed Ordering 和 基于 ID 的排序(IDO)之类的属性。事务层支持四个地址空间:包括三个 PCI 地址空间(内存、I/O 和配置)并添加消息空间。该规范使用消息空间来支持所有先前 PCI 的边带信号,例如中断、电源管理请求等,作为带内消息事务。
图1:PCIe 层次架构及数据包
2、数据链路层
数据链路层充当事务层和物理层之间的中间阶段。数据链路层的主要职责包括链路管理和数据完整性,包括错误检测和错误纠正。数据链路层的发送方接受事务层组装的 TLP,计算并应用数据保护代码和 TLP序列号,以及将它们提交给物理层以在链路上传输。接收数据链路层负责检查接收到的 TLP 的完整性,并将它们提交给事务层以进行进一步处理。在检测到 TLP 错误时,此层负责请求重发 TLP,直到正确接收信息或确定链路失败为止。数据链路层还生成并使用用于链路管理功能的数据包。为了将这些数据包与事务层(TLP)使用的数据包区分开,当指代在数据链路层生成和使用的数据包时,将使用术语“数据链路层数据包(DLLP)”。
3、物理层
PCIe 总线的物理层为 PCIe 设备间的数据通信提供传送介质,为数据传送提供可靠的物理环境。物理层包括用于接口操作的所有电路,包括驱动器和输入缓冲器、并行至串行和串行至并行转换、PLL 和阻抗匹配电路。它还包括与接口初始化和维护有关的逻辑功能。物理层以实现特定的格式与数据链路层交换信息。该层负责将从数据链路层接收的信息转换为适当的序列化格式,并以与连接到链路另一端的设备兼容的频率和通道宽度在 PCI Express 链路上传输该信息。
物理层是 PCIe 体系结构最重要,也是最难以实现的组成部分(该层对用户透明,开发 PCIe 程序时无需关心)。PCIe 总线的物理层定义了 LTSSM (Link Training and Status State Machine)状态机,PCIe 链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。
PCIe 总线使用端到端的连接方式,在一条PCIe 链路的两端只能各连接一个设备,这两个设备互为数据发送端和数据接收端。由于 PCIe 是支持全双工通信的,所以发送端和接收端中都含有TX (发送逻辑) 和RX (接收逻辑)。
在PCIe 总线的物理链路的一个数据通路(Lane) 中,有两组差分信号,共4 根信号线组成。其中发送端的TX 与接收端的RX 使用一组差分信号连接,该链路也被称为发送端的发送链路,也是接收端的接收链路;而发送端的RX 与接收端的TX 使用另一组差分信号连接,该链路也被称为发送端的接收链路,也是接收端的发送链路。一个PCIe 链路可以由多个Lane 组成。
目前PCIe 链路可以支持1、2、4、8、12、16 和32 个Lane,即×1、×2、×4、×8、×12、×16 和×32 宽度的PCIe 链路。每一个Lane 上使用的总线频率与PCIe 总线使用的版本相关。
本课题使用的是PCIe2.0×8,即lanes数为8。
4、PCIe 带宽计算
GT/s ——Giga transation per second (千兆传输/秒),即每秒内传输的次数,重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。
Gbps ——Giga bits per second (千兆位/秒)。GT/s 与Gbps 之间不存在确定的比例换算关系,要根据线路编码方式而定。
传输速率为每秒传输量 GT/s,而不是每秒位数 Gbps,因为传输量包括不提供额外吞吐量的开销位。比如 PCIe 1.x 和 PCIe 2.x 使用8b / 10b 编码方案,导致占用了20% (2/10)的原始信道带宽。
在PCIe 总线中,使用 GT/s 计算PCIe 链路的峰值带宽,也就是其最大吞吐量,计算公式如下:
吞吐量 = 传输速率 * 线路编码方案
例如:PCIe 2.0 协议传输速率为5.0 GT/s,即每一条Lane 上每秒钟内传输5G 个Bit;但这并不意味着PCIe 2.0 协议的每一条Lane 支持5Gbps 的速率。因为PCIe 2.0 的物理层协议中使用的是8b/10b 的编码方案。即每传输8 个Bit,需要发送10 个Bit,这多出的2 个Bit 并不是对上层有意义的信息。因而
PCIe2.0 协议的每一条Lane 支持5 GT/s * 8 / 10 = 4 Gbps = 500 MB/s 的带宽。
以一个PCIe2.0x2 的通道为例,x2 的可用带宽为4 Gbps* 2 = 8Gbps = 1GB/s。
三、XDMA
1、XDMA概述
DMA/Bridge Subsystem for PCI Express (PCIe),也叫做 XDMA,该 IP 不仅完成了事务层的组包解包,还添加了完整的 DMA 引擎。其架构如图2所示:
图2:Xdma架构
XDMA 其本名为 Xilinx DMA/Bridge Subsystem for PCI Express,直译为用于 PCI Express(PCIe)的 Xilinx DMA/Bridge 子系统。XDMA 实现了高性能,可配置的 Scatter Gather DMA,可与 PCI Express 2.1 和 3.x 集成模块一起使用。XDMA 提供了 AXI4 Memory Mapped(内存映射)或 AXI4-Stream 用户接口。
XDMA 一般情况下使用AXI4 接口,AXI4 接口可以加入到系统总线互联,适用于大数据量异步传输,而且通常情况下使用 XDMA 都会使用到 BRAM 或 DDR 内存;AXI4-Stream 接口适用于低延迟数据流传输。
XDMA 允许在主机内存和 DMA 子系统之间移动数据。它通过对包含有关要传输的数据的源、目标和数量的信息的“描述符”进行操作来实现此目的。这些直接内存传输既可以用于主机到卡(Host to Card,H2C)的传输,也可以用与卡到主机(Card to Host,C2H)的传输。可以将 DMA 配置为由所有通道共享一个 AXI4 Master 接口,或者为每个启用的通道提供一个 AXI4-Stream 接口。内存传输是基于每个通道的描述符链接列表指定的,DMA 从主机内存和进程中获取这些链接列表。
2、XDMA IP配置
2.1 Basic配置
Basic配置如图3所示
图3:Basic配置
Mode:配置模式,选择 Basic
Lane Width:x8
Max Link Speed:选择5.0GT/s 即PCIE2.0
Reference Clock :100MHZ,参考时钟 100M
DMA Interface Option:接口选择 AXI4 接口
AXI Data Width:128bit,即 AXI4 数据总线宽度为128bit
AXI Clock :250M,即AXI4 接口时钟为250MHZ
2.2 PCIe ID配置
我们配置成 Memory controller 让 IP 自动选择VID 等
图4:PCIE ID 配置
2.3 PCIe BAR配置
PCIE BAR 配置,这里面的配置比较重要
首先使能 PCIE to AXI Lite Master Interface ,这样可以在主机一侧通过PCIE 来访问用户逻辑侧寄存器或者其他AXI4-Lite 总线设备。映射空间选择 1M,当然用户也可以根据实际需要来自定义大小。
PCIE to AXI Translation:这个设置比较重要,通常情况下,主机侧PCIE BAR 地址与用户逻辑侧地址是不一样的,这个设置就是进行BAR 地址到AXI 地址的转换,
比如主机一侧 BAR 地址为0,IP 里面转换设置为 0x80000000,则主机访问 BAR 地址 0 转换到AXI LIte 总线地址就是0x80000000
图5:PCIE BAR 配置
2.4 PCIe 中断配置
User Interrupts:用户中断,XDMA 提供16 条中断线给用户逻辑,这里面可以配置使用几条中断线。
Legacy Interrupt:XDMA 支持 Legacy 中断
选择 MSI 中断
注意:MSI 中断和 MSI-X 中断只能选择一个,否则会报错,如果选择了 MSI 中断,则可以选择 Legacy 中断,如 果选择了 MSI-X 中断,那么 MSI 必须取消选择,同时Legacy 也必须选择None。此 IP 对于7 系列设置有这么个问题,如果使用Ultrascale 系列,则可以全部选择
图6:PCIE 中断 配置
2.5 PCIe DMA配置
图7:PCIE DMA 配置
Number of DMA Read Channel(H2C)和Number of DMA Write Channel(C2H)通道数,对于PCIE2.0 来说最大只能选择 2,也就是 XDMA 可以提供最多两个独立的写通道和两个独立的读通道,独立的通道对于实际应用中有很大的作用,在带宽允许的前提前,一个PCIE 可以实现多种不同的传输功能,并且互不影响。这里我们选择1 Number of Request IDs for Read (Write)channel :这个是每个通道设置允许最大的 outstanding 数量,按照默认即可。
至此,PCIe XMDA配置完成
3、DDR配置
四、环路测试基础系统搭建
我们的测试目标是进行 PCIE AXI4 总线与外设进行读写操作,PCIE AXI4-Lite 总线进行用户逻辑寄存器或者其他 AXI4-Lite 总线设备访问操作。AXI4 总线上挂载到 MIG 控制器 DDR 上去,实现对 DDR 的读写控制。
搭建系统如下:
图8:系统block design
进行地址分配:
这里我们把挂在M_AXI上的
DDR地址分配从0开始
(对于widnows系统必须为0), M_AXI是需要进行DMA操作的。而M_AXI_LITE挂载的BRAM是需要进行BAR空间操作,所以
BRAM地址设置为0x80000000
和XMDA IP里面设置的地址对应。
图9:地址分配
至此,基础系统搭建完成。
五、上板测速
主机到卡h2c 的速度是 8 /3144 ?106 = 2544.529MB/s
卡到主机c2h 的速度是 8 /4060 ?106 = 1970.443MB/s
运行米联客上位机测速软件: