分享一种高速串行扩展总线-PCIe

文摘   2024-06-23 22:14   广东  


正文


大家好,我是bug菌~
随着半导体、芯片的快速发展,嵌入式平台越来越趋向于廉价、高性能的方向发展,外设接口丰富度和高性能愈来愈突出,那么今天bug菌跟大家介绍一下一种高速串行扩展总线-PCIe,相信不久的将来大家会用到此接口。

1

什么是PCIe

PCIe英文名:Peripheral Component Interconnect Express,它是一种高速串行计算机扩展总线标准,旨在取代传统的并行PCI和AGP总线。它提供点对点的连接,高带宽和低延迟,是现代计算机系统中常见的接口,并广泛用于连接各种外部设备,如显卡、网卡、存储设备等。

比如说你的平台上SD卡不再满足项目需求,考虑挂个固态硬盘,PCIe接口的高带宽和低延迟特性使其成为高性能固态硬盘的理想选择。比如NVMe SSD,NVMe(Non-Volatile Memory Express)是专为PCIe接口设计的高性能固态硬盘协议,直接使用PCIe总线进行数据传输,具有极高的读写速度和低延迟。

上图是TI整理的PCIe接口发展路线,可以了解到PCIe继承与PCI,并且初期的PCIe1.0的每条通道的传输速率为2.5 GT/s(注意单位是:每秒传输2.5亿次信号,GT/s实际上是指每秒内在PCIe总线上发生的数据传输次数),然后每个时间阶段几乎翻倍的增加,不过目前在嵌入式主流高端系统平台PCIe3.0接口的较多,再往上就是更加数据密集型应用和高性能计算需求的系统了。

2

PCIe与PCI的异同

虽然PCI主要用于早期的计算机系统,但是面对PCIe的普及,进行一下对比能够更加突出PCIe的进步与优秀。

PCI使用并行总线架构,通过多个并行数据线同时传输数据,并且所有连接到同一总线的设备共享总带宽,这会导致带宽瓶颈,尤其是在多设备同时工作的情况下,大家都知道并行通信比较依赖时钟同步,对信号完整性提出了比较严苛的要求,所以PCI基本也就是MB/s的水平,并行通信的物理限制,带宽提升空间有限。

然而PCIe采用点对点的串行通信方式,通过高频率的串行链路进行数据传输。每个设备都有自己的专用通道,我们称之为Lane,以后接触这个也是接口性能指标,不需要与其他设备共享带宽。数据传输不依赖于全系统的时钟同步,而是通过8b/10b编码和独立时钟恢复技术实现高速传输,比如PCIe 3.0提高到1 GB/s,通过增加通道数(如x1、x4、x8、x16等),可以进一步提高总带宽。

PCIe支持高级电源管理(如Active State Power Management, ASPM),可以动态调整功耗,提高能效,更重要的是支持热插拔,维护也比较方便。

3

PCIe链路拓扑

PCIe使用树型拓扑结构,这种结构有助于管理和优化数据流动,并提供灵活的连接选项和高带宽的数据传输能力,一般由根复合体(Root Complex),中继器(Repeater),终端设备(Endpoint)等类型的PCIe设备组成。

关于PCIe树型拓扑结构中常见设备的简要描述:

  1. 根复合体(Root Complex):

  2. 根复合体是CPU和PCIe总线连接的接口,也是PCIe总线的起点和管理者,通常集成在主板的芯片组或处理器中。它负责初始化PCIe总线、分配带宽、管理数据流量,并提供与主机处理器或芯片组的接口,负责存储器域到PCIe总线域的地址转换

  3. 中继器(Repeater):

  4. 中继器在PCIe拓扑中起到信号放大和延长传输距离的作用。它们能够增强PCIe信号以便跨越更长的物理距离,同时确保数据的可靠传输。

  5. 终端设备(Endpoint):

  6. 终端设备是PCIe链路的终点,包括各种外围设备如显卡、存储控制器SSD、网卡等。每个终端设备连接到PCIe总线的一个或多个通道(Lanes),通过这些通道进行数据传输。

  7. 交换机(Switch):

  8. 交换机允许多个PCIe设备通过单个根复合体连接到主板上的PCIe总线,提供额外的端口和带宽管理功能。它们可以在多个设备之间实现数据的交换和路由,有效地扩展PCIe总线的连接能力和灵活性。

4

PCIe通信大致过程

PCIe协议确实定义了三层结构,分别是物理层、数据链路层和事务层。

  1. 物理层:

  2. 功能:物理层负责电气接口和信号传输,确保数据能够在设备之间物理传输。

    组成:包括发送器和接收器、电气规范、线路编码(如8b/10b编码)、时钟恢复等。

    任务:处理电气特性、介质访问控制、链路初始化和维护。

  3. 数据链路层:

  4. 功能:数据链路层负责数据包的可靠传输,包括差错检测和纠正、流量控制等。

    组成:包括数据包组装和解包、序列号管理、ACK/NACK机制、链路层控制包(DLLP)的处理。

    任务:确保数据传输的完整性和顺序,通过错误检测(如CRC校验)和重传机制来保证数据的可靠性。

  5. 事务层:

  6. 功能:事务层负责高层协议数据包的创建和解释,管理和处理端到端的事务,如读写请求、配置事务等。

    组成:包括事务层包(TLP)的生成和解析、地址映射、路由选择、事务管理。

    任务:处理来自CPU或其他主设备的命令,将其转换为适当的PCIe事务,并将响应返回。

这样去描述PCIe通信还是比较抽象,其实可以把它简化为如下通信过程:

  1. 链路初始化:

  2. PCIe链路初始化过程包括电气初始化、链路训练和状态检测、链路激活和确认、配置空间访问和设备枚举,以及高级配置和优化,这里就不详细展开了,比较复杂,感兴趣的朋友再去研究。

    发送端(PCIe发起器)和接收端(PCIe终端)进行物理层的握手协商,包括速率、信号编码方式等参数的确定。握手完成后,链路将进入已建立状态,准备进行数据传输。

  3. 数据传输准备:

  4. PCIe数据传输准备阶段包括数据缓冲、数据编码和解码、数据打包和解包、数据传输协议、时钟同步、错误检测和纠正,以及传输开始和结束标志等步骤。

    发送端将待传输的数据封装成事务层包(Transaction Layer Packet,TLP),并加上错误检测和流量控制信息。发送端生成数据链路层包(Data Link Layer Packet,DLLP),用于发送链路层控制信息,如序列号管理、流量控制等。

  5. 数据传输:

  6. 发送端将封装好的TLP和DLLP通过物理层进行传输,经过链路的中转和路由选择,最终到达接收端。

    接收端对接收到的数据进行解包和校验,确认数据的完整性,并返回ACK(确认)或NACK(否认)给发送端。

  7. 错误处理与重传:

  8. 如果接收端检测到数据传输中的错误(如CRC校验失败),将向发送端发送NACK信号。发送端在接收到NACK后,将重传有错误的数据包,直到接收端无法检测到错误为止。

  9. 事务完成与响应:

  10. 接收端在成功接收到数据后,对其进行处理,执行相应的操作(如读写内存、执行配置等)。接收端生成响应数据,并封装成TLP发送回发送端,用于确认和结果的反馈。

  11. 链路关闭:

  12. 在数据传输结束后,发送端和接收端可以选择关闭链路,释放相关资源。

这是一个简化的PCIe通信过程,实际的通信过程还涉及更多的细节和协议规范,这里就不过多介绍了。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

bug菌唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 

☞  嵌入式C语言进阶专辑 

☞  “bug说”专辑 

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

最后一个bug
一个嵌入式技术进阶公众号,定期分享C语言,C++、MCU(如stm32等)、DSP、ARM、嵌入式Linux等“独门”软件设计技巧和知识归纳总结,同时分享应用程序设计、物联网、滤波及控制算法推导和仿真设计等嵌入式硬核知识技巧!欢迎大家关注!
 最新文章