热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PCIe中的弹性缓冲原理解析

PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。本文将详细介绍PCIe中的弹性缓冲(ElasticBuffer)原理,探讨其如何处理时钟差异,确保数据传输的稳定性和可靠性。

PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。在设计电路时,通常会提供一组100MHz的差分时钟给后端设备,但这并不是真正的同步时钟。PCIe的时钟是嵌入在差分信号中的,在链路训练初期,会完成一个比特锁定(bit lock),在这个过程中,链路上会传输一段0和1交替的序列,即连续的高低电平,用于接收器提取时钟。接收器提取到时钟后,才能继续捕获每一位数据,进行比特识别,再进行多比特识别,即序列识别。

在PCIe发送器中会进行编码操作,使0和1的数量更加均衡,以防止总线时钟丢失。即使在正常数据传输过程中,也可能发生失锁。此外,总线处于空闲状态时,也会持续传输时钟对齐码流,以防止时钟丢失,确保数据到来时能够正确识别。

同理,符号锁定(symbol lock)表示PCIe链路上获取开始训练的标记符COM字符的过程。每个lane的bit lock,即每个lane完成了时钟恢复。bit lock指的是CDR锁定,此时只是锁到bit,但不知道哪个是bit0。

了解了PCIe总线上传输数据和时钟的基本原理后,我们再来看看100MHz时钟的作用。通常,PCIe设备需要100MHz的参考时钟,不论是根设备、交换机还是终端设备,这个时钟称为参考时钟,而不是同步时钟。PCIe控制器内部电路运行需要时钟,100MHz参考时钟即是提供给控制器使用的时钟,与其他电路系统需要时钟的概念相同。100MHz时钟输入控制器后,经内部PLL进行倍频再分给各部分电路使用。随着PCIe总线的不断升级,PLL倍频的最大值也在不断提升,但具体的机制因厂家而异。100MHz时钟主要用于控制器内部,而不是用于同步差分信号,因此,PCIe总线两端的设备可以独立使用100MHz时钟源,这种架构称为独立时钟架构。

在进行PCIe架构设计时,常使用同源时钟架构,即PCIe的根设备和终端设备都使用同一个源头的100MHz参考时钟。在这种架构中,对时钟走线长度和收发链路的时钟延迟有严格限制。这些限制的依据是什么?要解决的问题是什么?本文将详细分析这些问题。

首先,PCIe接收器接收到的数据是基于总线上恢复的时钟(使用CDR恢复的时钟),那么100MHz参考时钟的作用是什么?为什么需要对100MHz时钟进行限制?这里涉及接收器内部的工作机制,其中一个关键部件是弹性缓冲(Elastic Buffer)。弹性缓冲的作用是在将CDR恢复时钟采样得到的数据传输到后续电路时,进行一个过渡。因为后续电路采用的时钟是接收器使用100MHz参考时钟进行倍频得到的时钟,存在两个时钟域。尽管前后时钟被处理到同一频率,但频率和相位不可能完全一致。这种差异是否会影响数据从一个时钟域传输到另一个时钟域?

在其他信号传输过程中也会遇到类似的问题,例如CPU处理频率极高,而机械硬盘存取数据的速率远低于CPU处理数据的速率。为了解决这一问题,通常通过高带宽总线将数据从硬盘传输到内存,再由CPU处理。这种方法称为缓存。但在PCIe接收器内部,两个时钟的差异较小,设计上希望频率完全一致,因此不需要缓存。

弹性缓冲的工作原理如图所示(图片摘自《Elastic Buffer Implementations in PCI Express Device》Joe Winkles)。缓冲区左侧数据进入时使用CDR恢复的时钟采样,属于恢复时钟域;缓冲区右侧数据取出时使用控制器使用100MHz参考时钟倍频后的本地时钟,属于本地时钟域。两个时钟由于各种不可控因素会存在微小的频率和相位差异,弹性缓冲是一个先进先出的缓冲空间,数据从左边进,按顺序从右边出。入口和出口的差异使用SKP序列进行处理。

SKP序列是PCIe总线专门用于补偿时钟差异的特殊序列(下图摘自《PCIe 5.0 Base Specification》PIG-SIG),不传输有效数据信息,主要用于占位。SKP序列会在总线上定期插入数据序列中,具体占位大小因PCIe版本而异。当SKP序列和有效数据序列一起被接收器采样进入弹性缓冲后,也会占用弹性缓冲的若干位置。

SKP序列发挥作用的方式很简单:当数据进入的时钟频率(CDR恢复的时钟频率)大于数据出的时钟频率(本地时钟频率)时,数据进入速度比离开速度快,可能导致缓冲区数据累积过多,甚至溢出。在这种情况下,从缓冲区中抽出几个SKP,释放位置,避免数据溢出。当数据进入的时钟频率小于数据出的时钟频率时,数据离开速度比进入速度快,可能导致缓冲区数据减少,甚至为空。在这种情况下,向缓冲区中插入几个SKP,填充缓冲区。

通过抽走和插入SKP序列的方式,可以解决两个时钟频率差异的问题。弹性缓冲自身具有状态检测功能,能够不断监测缓冲区内的数据量,从而做出相应操作。具体操作的SKP数量因不同厂家的控制器设计而异。

从弹性缓冲的工作原理可以看出,其对时钟差异的补偿量级有限,仅能操作的SKP数量对应的时间较短。一个SKP序列在PCIe 5.0中只有16bit数据,对应的时间极短,因此弹性缓冲能够补偿的时间也很短。如果缓冲区两侧的时钟差异较大,弹性缓冲将无法有效补偿,因此需要对时钟进行限制。


推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 解析链接脚本与可执行文件的关系
    本文详细探讨了链接脚本和可执行文件的基本概念及其在嵌入式系统中的应用,特别是S32K144芯片的具体实现。 ... [详细]
  • 英特尔推出第三代至强可扩展处理器及傲腾持久内存,AI性能显著提升
    英特尔在数据创新峰会上发布了第三代至强可扩展处理器和第二代傲腾持久内存,全面增强AI能力和系统性能。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 使用System.getProperty()获取系统属性
    本文详细介绍了如何使用System.getProperty()方法获取Java运行时环境中的各种系统属性,包括Java版本、操作系统信息等。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 自动驾驶中的9种传感器融合算法
    来源丨AI修炼之路在自动驾驶汽车中,传感器融合是融合来自多个传感器数据的过程。该步骤在机器人技术中是强制性的,因为它提供了更高的可靠性、冗余性以及最终的 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
明天会更好--好过_652
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有