【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
0810逻辑总览 The 8B/10B coding map
- 图 1 展示了一个通信适配器接口,它由八条数据线 A、B、C、D、E、F、G、H(注意:使用大写字母表示)、一条控制线 K,以及一条以字节速率运行的时钟线 BYTECLK 组成。控制线 K 用于指示 A 到 H 这些线是表示数据信息还是控制信息。
-
为了编码目的,每个输入字节被划分为两个子块:
-
- 五条二进制数据线 ABCDE 被编码成六条二进制数据线 abcdei(注意:使用小写字母表示),遵循 5B/6B 逻辑函数 和 失衡控制 的指示。
-
- 同样,三个位 FGH 被编码成 fghj。
-
- 注:数据块的失衡是指该块中 1 和 0 的数量之差;正失衡和 负失衡分别表示 1 和 0 的过剩。对于 6B = abcdei 和 4B = fghj 子块,允许的失衡值为 0、+2 或 -2。
-
- 注:编码规则要求非零失衡块的极性必须交替。同时,6B 子块和 4B 子块之间不做区分;也就是说,在 6B 块中多出的两个 1 可以通过在 6B 或 4B 块中多出的两个 0 来补偿,反之亦然。
-
非零失衡的编码点以互补对的形式分配给单一的源数据点。编码函数生成其中一个编码点;如果该编码点违反了交替极性规则,则在编码切换中会对整个子块进行反转。6B 编码器中失衡和极性的确定之后,会进行相应的 4B 编码器操作,接着将运行失衡参数传递给下一字节的编码。大多数编码后的子块是零失衡,并且在大多数情况下,它们与运行失衡无关;即,它们没有互补。
-
这十条编码后的数据线 abcdeifghj 通常与串行接口;其中,a 位必须首先传输,而 j 位最后传输。
编码定义
8B/10B 编码通过将输入字节的 ABCDE 位 编码到 5B/6B 编码器中的数据线 abcdei 来完成,遵循 表 3 中的编码计划和规则;而 FGH 位 则在 3B/4B 编码器中编码为数据线 fghj,如 表 4 所示。
5B/6B encoding
-
表 3 中的第一列,标题为 “Name”,列出了 ABCDE 输入线 的 32 个十进制等效值,假设 A 是最低有效位,E 是最高有效位。对于常规数据(D.x),K 线必须保持为 0;为了编码特殊字符,K 线必须为 1;少数编码点可以是特殊字符的一部分,这些特殊字符可以被识别为非数据字符;这些编码点被命名为 D/K.x 或 K.x,并且在 K 列中标有 x。
-
在 “classification” 列中,L04 表示在 ABCD 中没有 1,只有四个 0;L13 表示在 ABCD 中有一个 1 和三个 0,以此类推。字母 L 表示该逻辑函数或分类是 5B/6B 编码器的一部分。类似的功能标记为 P,用于解码(见表 6)。符号右侧的重音符号用于表示互补;例如 E’ 表示 E 的互补;点( • )表示逻辑与(AND)运算。
-
在左侧 “abcdei” 标题下的列中,列出了所有直接由 5B/6B 逻辑函数 从 ABCDE 输入 生成的编码点。编码表的设计目标是使通过编码器时,必须改变的比特数量最小,并且所需的改变可以分类为几个适用于多个编码点的组(table was designed so that a minimal number of bits must be changed on passing through the encoder, and so that the changes which are required can be classified into a few groups applicable to several code points )。表 3 中所有需要 5B/6B 逻辑函数 操作的比特(除去整个子块的互补,(other than complementation of the complete subblock)均以粗体显示,假设添加了额外的数字 “i”,其正常值为 0。
-
当输入满足左侧 “bit encoding” 中列出的逻辑条件时(就是classification列的左下侧那列),粗体的比特将更改为 左侧 “abcdei” 列中所示的值;例如,如果 L04 条件成立,则 b 和 c 位被强制为 1,如 D.O 和 D.16 所示。在 D.16(104 • E)和 D.31(L40 • E)的 “bit encoding” 列中的第二个条目适用于 (•-digit)。此外,对于没有分类条目的行,ABCDE 位将不变地转换为 abcde,并且新增的 bit 为 0。
-
表 3 最右侧的 “abcdei alternate” 列显示了那些具有交替编码点的 ABCDE 输入 的互补。每个单独的 6B(4B同理)子块会根据失衡规则进行互补。在所有子块边界处,运行的失衡 要么是 +1,要么是 -1,绝不会是 0(见图 2)。
-
“D—1” 列表示进入右侧相邻子块所需的运行失衡(running disparity)。“D - 1” 列中的 x 表示 (D - 1) 可以是 +1 或 -1。
在此编码中,子块边界处的运行失衡极性与最近的 非零失衡块 的极性相同。 -
如表 3 中的第一行 D.O :
如果运行失衡匹配 (D - 1) = +,则编码器的输出将是 011000;否则,整个子块将被互补为 100111。 -
“DO” 列表示左侧编码子块的失衡值,值为 0、+2 或 -2。表 3 和表 4 右侧的交替编码点的失衡值是左侧对应值的精确互补,因此不再显示。
-
与比特编码相似,编码器硬件直接从 ABCDE 和 K 输入 中确定子块的失衡值。根据失衡要求对编码词进行分类的相应逻辑函数显示在表 3 的单独一列中。
-
在表 3 中,D.7 行,一对零失衡的 6B 子块(111000 和 000111)被分配给单个数据点,并具有类似于适用于非零失衡子块的失衡约束。这个编码特性将最大数字和变化(DSV)从 8 降低到 6,并结合表 4 中 3B/4B 编码器 对 D/K.X.3(1100 和 0011)的类似规则,消除了所有 运行长度为 6 的序列,以及大多数 运行长度为 5 的序列。
-
将一对互补的零失衡子块分配给单个编码点的技术,也统一应用于所有作为特殊字符一部分的 4B 子块,如表 4 和表 5 中对于 K.28.1、K.28.2、K.28.3、K.28.5 和 K.28.6 所示。
3B/4B encoding
-
Table 4 follows the conventions and notations of Table 3. In Table 4 some lines have two entries in the
column for the classification of disparity; the left classification refers to the entry disparity D - I, and the right one to DO. -
D.x.P7(主7)和 D/K.y.A7(备用7)的编码需要解释。引入 D/K.y.A7 编码点是为了消除 eifgh 中的运行长度为 5 的序列。每当需要时,A7 编码会替换 P7 编码。
-
请注意,每当 K = 1 时,FGH = 111 始终被转换为 fghi = 0111 01 或其互补。
-
D/K.y.A7 编码可以在 ghjab 位的尾部字符边界生成一个 **运行长度 (run length,RL) ** 为5的序列;然而,这个序列之前只有 1 的运行长度,在 f 位上,只有一个例外。如果前导字符是特殊字符 K.28.7,那么尾部字符边界的 RL 5 序列之前会有另一个 RL 5 序列出现在 cdeif 中。有关这些区别的意义,请参见特殊字符部分。
-
K.28.1、K.28.2、K.28.5 和 K.28.6 的零失衡 4B 子块 处理方式与 D/K.x.3 类似,都是通过互补来生成具有字节同步或逗号特性的特殊字符。
Special characters
- 特殊字符在此定义为超出编码一个数据字节所需的 256 个编码点。它们通常用于建立字节同步、标记数据包的开始和结束,有时也用于信号控制功能,如 ABORT、RESET、SHUT-OFF、IDLE 和链路诊断。表 5 中显示的十二个特殊字符可以通过表 3 和表 4 中定义的编码规则生成。它们都符合一般编码约束,即最大运行长度为 5 和最大数字和变化为 6。
-
表 5 中的第一组八个特殊字符 K.28.x 可以通过观察 abcdei = 001111 或 abcdei = 110000 来识别为数据之外的字符。在数据中,我们从不出现 c = d = e = f。
-
表 5 中的第二组四个特殊字符 K.x.7 的特征是 eifghj = 101000 或 eifghj = 010111。它们与普通数据的区别在于 FGH 被编码为 0111 或 1000,在普通数据编码中则会使用 1110 或 0001。
Commas and packet delimiters 逗号和数据包分隔符
-
逗号[14] 表示正确的字节边界,并可用于即时获取或验证字节同步。为了具有实际意义,逗号序列必须是唯一的,并且必须以一致的对齐方式出现在字节边界上。在没有错误的情况下,逗号不能出现在其他任何比特位置上(无论是在字符内部还是跨字符重叠的比特中)。
在该编码中,有三个字符(K.28.1、K.28.5、K.28.7)具有逗号特性。它们在表 5 中以星号标记,并用粗体字突出显示其唯一的逗号序列。这三个字符也是最适合作为信息包起始和结束标记的分隔符。 -
该编码中的唯一逗号序列是:一个以比特 b 结尾的、长度为 2 或更长的连续相同位(RL ≥ 2)序列,紧接着是比特 cdeif 中的一个长度为 5 的连续相同位(RL = 5)序列。其中,第二个 RL=5 序列不得是另一个逗号序列中允许的 RL≥2/RL=5 模式。
换句话说,如果两个或三个这类 “RL≥2 / RL=5” 序列发生重叠时,只有第一个和第三个序列会被识别为逗号。
之所以有此规则,是因为在某些情况下,K.28.7 逗号后面可能会紧跟另一个位于字段 ghjab 的 RL=5 序列。为了避免误判,需要限制哪些序列能被识别为逗号。 -
一串连续的 K.28.7 字符会生成交替的全为 1 或全为 0 的 长度为 5 的连续位(RL 5)序列,这种模式既不利于字符同步,也不利于位时钟同步。因此,不允许出现相邻的 K.28.7 字符。
尽管有此限制,K.28.7 逗号仍常被优先使用,因为在同步状态下,任意单比特错误都不会把普通数据误解码为有效的 K.28.7 字符。
空闲序列(Idle sequence)
-
我们需要区分两类通信链路:一类是在数据包之间保持字节同步的链路,另一类则不保持字节同步。
为了便于接收端时钟获取位同步(bit synchronism),在空闲状态下,维持较高的电平跳变密度(即 0 和 1 频繁交替)是非常重要的。
因此,当数据包之间不保持字节同步时,适合使用0 和 1 交替的序列,这类序列可以通过向编码器输入 D.21.5 或 D.10.2 来生成。 -
为了实现1 和 0 的精确平衡,需要将结束时的数字不平衡值(disparity)传递到下一数据包,并且新数据包应该从偶数位编码数字之后开始。
然而,如果从奇数位编码数字开始新数据包,对噪声裕度的影响可以忽略不计,前提是:
- 数据包本身足够长(有几个字节以上),以及
- 空闲序列的运行不平衡度(running disparity)被限制在 –1、0 或 +1 之间。
这可以通过让空闲序列从一个 0
或一个 1
开始来实现,具体取决于前一个数据包结束时的不平衡情况(正或负)。详见图 2。
- 如果字节同步能够从一个数据包延续到下一个数据包,那么在两个数据包之间的间隙中填充非数据字符是有用的。
例如,连续发送 K.23.7、K.27.7 或 K.29.7 字符会在每 100 位编码数字中产生 60 个电平转换。
这些字符都能被识别为“非数据”,但仅靠这种空闲序列,接收端无法获取字节同步,除非偶尔插入一个逗号(comma)字符。
作为替代方法,发送一串连续的 K.28.5 逗号字符也可以作为空闲序列,其在一半(50%)的位上产生转换。