01signal.com

简单介绍一下 8b/10b encoding, 64b/66b, 128b/130b 等。

此页是介绍 Multi-Gigabit Transceiver (MGT)的系列页面中的第三页。

介绍

应用逻辑的数据流几乎从来不会原封不动地在物理通道上传输。这样做很可能会导致 MGT 出现故障,原因如前所述。在几乎所有的应用中, MGT 或应用逻辑都会对数据流应用编码,以确保物理通道能够正常运行。这种编码还有助于发射器和接收器之间的同步。

本页介绍了最常用的编码技术的基础知识。上一页的协议(protocols)列表将这些编码与 FPGAs之间使用的协议联系起来。

8b/10b 编码

8b/10b 编码被多个协议(protocols)使用,例如 PCIe、 Gigabit Ethernet、 SATA、 Displayport 和 SuperSpeed USB的某些版本。所有 FPGA MGTs 都内置有 8b/10b 编码器和解码器,尽管此编码器也可以在逻辑阵列(logic fabric)中实现。

这种编码将每个字节(8 比特) 转换为由 10 比特组成的字。这种转换的主要目的是创建一个比特(bits)序列,该序列平均具有相同数量的“0”和“1”。换句话说,编码数据流中的比特(bits)是 DC 平衡的。另一个优点是,这种编码确保数据流中“0”和“1”之间有足够的转换,以便CDR (时钟 Data Recovery(Clock Data Recovery)) 机制可以正常工作。

但请注意, 8b/10b 编码不会使数据流随机化。具体而言,如果使用均衡器(equalizer),仅使用 8b/10b 编码是不够的,而均衡器要求数据流在统计上是随机的。

为了实现 DC 平衡目标,可以将一些 8 位字编码为两个可能的候选。例如,8 位字 0x20 (00100000,表示为 D0.1)可以编码为 1001111001 或 0110001001。两种替代方案都解码回 0x20。请注意,第一个替代方案有四个 '0' 比特和六个 '1' 比特。第二个替代方案有六个 '0' 比特和四个 '1' 比特。这是 8b/10b 编码的整体思路: 编码器有两种方案,一种方案中 '0' 多于 '1',第二种方案中相反。

编码器利用这一特性来长期保证 '0' 和 '1' 之间的平衡: 它会记住到目前为止数据流中是否有过多的 '0' 或过多的 '1' 。这种不平衡称为 Running Disparity。编码器选择有助于减少这种不平衡的 10 位字。

并非所有 8 位字都有两个 10 位候选。例如,8 位字 0x23 (00100011,表示为 D3.1)总是被编码成 1100011001。此编码字具有与 '0' 和 '1'相同的数量,因此它不会影响 Running Disparity。

这种编码最早于 1983 年发布,在大约 2010 年推出的协议中非常流行。它在最近发布的协议中不太流行。主要原因是 scrambler 通常也是协议的一部分。因此,使用 scrambler可以保证数据流的 DC 平衡,因此无需为此目的使用 8b/10b 编码。 scrambler 还确保 '0' 和 '1' 之间的转换足够频繁地发生。另一方面, 8b/10b 编码增加了 25% 的比特用于传输到物理通道。这些额外的比特可用于传输有用的数据。

话虽如此,一些使用 scrambler 的成功协议也使用 8b/10b。例如,所有版本的 PCIe 都需要使用 scrambler,但是 8b/10b 编码也用于 3.0以下的 PCIe 版本。因此 8b/10b 编码显然还有其他一些好处。这将我们引向下一个话题: K-symbols。

K-symbols

事实上, 8b/10b 编码器会从其编码的每个 8 比特生成 10 比特,这意味着编码后的字有 1024 种可能的组合,而原始字有 256 种可能的组合。即使我们假设每个原始字有两个可能的编码字,这也将涵盖 512 种可能性。如前所述,一些 8 位字只有一个 10 位字候选用于翻译,因此 10 位字的可能性少于 512 种。因此,结论是,至少 512 种 10 位字的可能性没有对应的 8 位字。

因此, 8b/10b 编码能够通过检测非法的 10 位字来检测物理链路上的位错误。 FPGA MGTs 具有输出端口(output ports),用于在检测到非法 10 位字时通知应用逻辑。但是,这种错误检测机制并不是很有价值,因为它不能检测到所有错误。

8b/10b 编码的真正有价值的特性是 K-symbols。 K-symbol 被编码并传输,而不是8 位字。解码器能够区分常规数据字和 K-symbol,并且总有一种方法可以在 K-symbol 到达时通知应用逻辑。

因此, 8b/10b 编码允许发送方以不会与常规数据混淆的方式在数据通道上发送额外信息。协议经常使用此功能来帮助接收方与发送方的数据流同步。

K-symbols 的含义取决于协议。不过,许多协议都使用两 K-symbols ,它们的含义相同:

下面将对这两者进行更详细的解释。

当 FPGA MGTs上启用 8b/10b 时,与应用逻辑的接口对于每个字节数据都有一个单独的线(wire)。此线指示数据是常规数据字节还是 K-symbol。换句话说,用于传输数据的接口允许选择每个传输的字是常规数据还是 K-symbol。也就是说,当数据字被标记为 K-symbol时,8 位数据字仅限于以下选项:

字节值(hex) K-Symbol
1C K28.0
3C K28.1
5C K28.2
7C K28.3
9C K28.4
BC K28.5
DC K28.6
FC K28.7
F7 K23.7
FB K27.7
FD K29.7
FE K30.7

同样,对于 MGT 接收器,在与应用逻辑的接口中,每个接收字节都有一个单独的线。每个这样的线的值指示是否应将相关的字节解释为纯数据或 K-symbol。接收器还具有以特殊方式处理 K28.5 (Comma Symbol、 COM)和 K28.0 (Skip symbol、 SKP)的特殊功能。接下来将讨论这两 K-symbols 。

Comma symbol (K28.5)

K28.5 的 10 位表示是 0011111010 或 1100000101。这个字特别有用,因为比特的这个序列只能在传输 K28.5后出现在物理通道上。接收器不需要与发射器同步即可检测到 K28.5: 只要收到的最后 10 比特与这两个字中的一个匹配就足够了。

这使得 K28.5 成为同步接收器的绝佳工具。一旦检测到这 K-symbol ,就可以知道其他 10 位字的边界。

FPGA MGTs 能够自动对齐到达的数据流以响应 K28.5 symbol的到达。通常,也可以请求根据更大的边界进行对齐。例如, MGT 可以配置为将到达的 K28.5 与 32 位字的开头对齐。

除了对准接收器之外, K28.5 symbol 还可用于对准需要同步的其他功能单元。例如,协议可以请求重置 scrambler 以响应此 K-symbol的到达。

由于这些可能性,协议通常需要定期传输 K28.5 ,以便同步接收器。通过握手建立连接的协议通常使用 K28.5 作为链路建立的一部分。无论哪种方式, K28.5 符号通常都会简化协议的设计,以证明在物理通道上传输的 25% 额外比特是合理的。

Skip symbol (K28.0)

在大多数实际情况下,发射器和接收器的时钟频率之间存在差异。这可能会导致问题: 通常, MGT 和应用逻辑之间的接口与接收器自己的本地时钟同步。因此数据根据发送器的时钟到达,但根据接收器的时钟传递到应用逻辑。

换句话说, MGT 接收数据的速度由对方决定。但本地时钟决定数据消耗的速度。

如果发送器的时钟频率较高,则会导致应用逻辑从 MGT 获取数据的速度太慢。多余的数据最终会累积起来,溢出(overflow)就会在 MGT内部的某个地方发生。另一方面,如果发送器的时钟频率较低,则应用逻辑想要获取数据的速度会比数据到达的速度快。这也是一个问题。

解决此问题的一个简单方法是添加“skip symbols”。例如, SuperSpeed USB 协议将“SKP Ordered Set”定义为两个连续的 K28.0 symbols。协议要求每 354 个常规数据字传输一次这两 K28.0 。接收器 MGT 可以丢弃这些 K28.0 符号,而不是将它们呈现给应用逻辑。这解决了当发送器的时钟比接收器的时钟更快时数据过剩的问题: 当接收器 MGT 由于时钟频率差异而开始累积数据时,它会跳过到达的 K28.0 符号。

使用此机制,发送器可以在接收器的应用逻辑仅获取 354 个字的同时传输 356 个字。通过计算 356 / 354 ≈ 1.00565,可以得出此机制可以弥补两个时钟之间高达 ~0.565% 的频率差异。当然,这超过了协议的规格允许的范围。

接收器的 MGT 还可以将 K28.0 symbols 添加到现有的“SKP Ordered Set”。当发射器的时钟较慢时,这会有所帮助。这意味着接收端的应用逻辑试图以比数据到达更快的速度获取数据。因此, MGT 可以用 K28.0 symbols填充缺失的数据槽: 无论如何,应用逻辑预计会忽略所有 K28.0 symbols 。

PCIe 协议使用与 Skip Symbol 类似的方式。 PCIe的 SKP Ordered Set 格式有所不同,它由四 K-symbols组成: 首先是 K28.5 (Comma),然后是三 K28.0 symbols。不过使用 skip symbol 的原理是一样的。

64b/66b 编码

如前所述, 8b/10b 编码对物理通道的使用效率很低,而且在使用 scrambler 时,这种编码的主要目的(DC 平衡和确保 '0' 与 '1'之间的转换)就不再需要了。这就是为什么较新的协议依赖于 64b/66b 编码和类似方法的原因。但需要注意的是, 64b/66b 并不是真正的编码方法。相反,它是一种组织数据流和控制字的方法。数据不会被编码成不同的表示形式。所发生的一切就是将数据组织成段,并插入额外的比特以允许同步和跨通道发送控制信息。

请注意, K-symbols 仅是 8b/10b 编码的一部分,在任何其他编码格式中均不可用。

64b/66b 编码被多种协议所使用,例如 10G/100G Ethernet。值得注意的是, PCIe 和 USB 的高级版本基于其他方法,如下所述。

64b/66b 编码将数据流划分为 64 位段,并在每个这样的段的开头添加两个比特。因此,每个段在物理通道上的长度为 66 比特。这两个比特附加值具有以下两个可能值之一: “01”或“10”。如果这两个比特是“01”,则后面的 64 位字包含八个字节数据。如果这些比特是“10”,则下一个字节包含一个代码,该代码定义 56 比特其余部分包含的内容: 有多少个数据字和多少个控制字。

控制字特别用于指示帧(数据包)的开始和结束,但也用于插入空闲字以补偿时钟频率差异(类似于 8b/10b的 skip symbols)。还可以定义特定于协议的控制字。

前面已经提到,如果前两个比特是“10”,那么剩下的 64 比特就被分成两部分: 8 位代码字和 56 比特由数据字和控制字组合而成。56 位段内数据字和控制字的组织相当复杂,主要是因为每个控制字长 7 位。这种特性对于允许在剩余的 56 位中插入八个控制字是必要的。

此外,使用此编码的协议还使用 scrambler 来处理数据,以确保数据的 DC 平衡和随机性。这种随机性不仅仅是为了均衡器的缘故: 接收器也需要它来找到到达数据流中 66 位段的开头。这是通过检查 66 比特的每个段中的前两个比特来完成的。如果这对两个比特仅具有重复的值“01”或“10”,则接收器已同步。否则,它需要尝试不同的位置。 scrambler 确保其他比特是随机的,因此如果接收器未对齐,则很快就会出现“00”或“11”而不是合法组合。

总而言之, 64b/66b 更好地利用了底层物理通道,但使用此方法的协议更难实现。特别是,需要以不同的方式处理每个段(取决于前两个比特,也可能取决于后面的八个比特),这增加了实现的复杂性。不同的 FPGA MGTs 在这方面提供不同程度的帮助。特别是,一些 MGTs 具有内置机制,可自动将接收器与到达数据的 66 位段对齐。然而,应用逻辑负责更困难的任务,即解压包含数据和控制字组合的 66 位段。

FPGA MGT 可能内置有位宽转换器(gearbox),用于从 66 位段流中提取 64 位字。本系列的下一页将进一步讨论位宽转换器。

64b/67b、 128b/130b 和 128b/132b

尽管 64b/66b 更好地利用了物理通道,但这种方法实施起来很复杂。这可能是协议在脱离 8b/10b时为 PCIe 和 SuperSpeed USB 选择了不同路径的原因。

这两个协议都保留了数据流被划分为段的思想。这些协议不是基于 64 位段,而是基于 128 比特。

PCIe 3.0 及更高版本基于 128b/130b。与 64b/66b 编码类似,此协议的每个 128 位段都以“01”或“10”开头,以区分数据和控制代码。 SuperSpeed USB Gen 2 基于 128b/132b。其每个 128 位段都以“0011”或“1100”开头,目的相同。唯一的区别是 USB 协议分配了四个比特而不是两个,以更好地防止位错误。

与 64b/66b 编码类似,每个段的 128 位部分都使用 scrambler ,以确保数据流的 DC 平衡和随机化。但 64b/66b 的相似之处仅此而已: 两个协议都根据协议本身的结构来定义128bit部分内容的含义,因此 128b/130b 和 128b/132b 只是代表数据流的分段,在有数据的部分添加多少个比特,其余部分都是每个协议特有的。

64b/67b 编码的工作方式类似。不同之处在于,在 64 比特的每个段中添加了三个比特,目的相同。此编码主要由 Interlaken 协议使用。

无编码

无需上述任何编码方法即可实现通信链路。协议的一个示例是 xillyp2p,它每 223 比特使用一个同步字,以便对齐和同步接收器与发射器。对于此协议, MGT 只是一 SERDES。此策略的主要优点是协议完全不依赖 MGT的其他功能。这简化了在各种 MGTs上实施协议的过程。

缺点是 FPGA logic 资源可以完成一些在 MGT内部就可以完成的事情。

当协议满足编码可能帮助的所有需求时,这种方法是有效的: 直流平衡、随机化(需要时)、同步和字对齐以及数据和控制信息之间的区分。

概括

如上所示,对应用逻辑的数据流进行编码的方法有很多种,也可以根本不使用任何编码。对于大多数应用程序来说, 8b/10b 编码是最容易使用的,但这种编码相对于物理通道的数据流来说是一种浪费。这就是为什么最近的协议采用了其他更高效但更难使用的编码方法。

至此,本系列关于 MGTs的第三页就结束了。下一页将介绍 PCS的部分部件,其中包括实现此处提到的编码的部件。

此页面由英文自动翻译。 如果有不清楚的地方,请参考原始页面
Copyright © 2021-2024. All rights reserved. (b4b9813f)