热门标签 | 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数据,对应的时间极短,因此弹性缓冲能够补偿的时间也很短。如果缓冲区两侧的时钟差异较大,弹性缓冲将无法有效补偿,因此需要对时钟进行限制。


推荐阅读
  • 本文探讨了前端包管理器的核心功能,包括注册机制、文件存储、上传下载、以及依赖分析等关键特性,并介绍了几种流行的前端包管理工具。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • Spring Boot 入门指南
    本文介绍了Spring Boot的基本概念及其在现代Java应用程序开发中的作用。Spring Boot旨在简化Spring应用的初始设置和开发过程,通过自动配置和约定优于配置的原则,帮助开发者快速构建基于Spring框架的应用。 ... [详细]
  • 微信小程序实现拍照与图片上传功能
    本文介绍如何在微信小程序中实现用户通过拍照或从相册选择图片,并将图片上传至服务器的功能,包括调用相关API和处理上传响应。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 本文将详细介绍如何封装一个多功能的PickerView组件,包括文本选择、日期选择和地理位置选择等功能,旨在提供一个更加灵活和易于使用的PickerView解决方案。 ... [详细]
  • VMware Horizon View 5.0桌面虚拟化部署实践与心得
    在近期的研究中,我花费了大约两天时间成功部署了桌面虚拟化环境,并在此过程中积累了一些宝贵的经验。本文将分享这些经验和部署细节,希望能对同样关注桌面虚拟化的同行有所帮助。 ... [详细]
  • 在服务器虚拟化领域,用户面临多种选择,尤其是来自同一供应商的不同产品。正确评估这些选项对于项目的成功至关重要。本文将深入探讨VMware提供的两款主要虚拟化平台——免费的VMware Server和付费的ESX Server之间的区别,旨在为决策提供专业指导。 ... [详细]
  • 本文探讨如何使用 PHP 进行字符串处理,特别是如何检测一个字符串是否存在于另一个字符串中,并确定其具体位置。通过实例代码展示,帮助读者掌握这一常用功能。 ... [详细]
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社区 版权所有