64b66b
背景
64b/66b编码技术是IEEE 802.3工作组为10G以太网提出的,主要是减少编码开销,降低硬件的复杂性,并作为8b/10b编码的另一种选择,以支持新的程序和数据。可以参考64B/66B编码技术。本文基于2000年IEEE 802.3工作组提出的10G Ethernet编码规则64b/66b coding update。64b/66b编码仅有一个码表,其编码逻辑如下图所示:
原理分析
编码
64b/66b编码技术将64bit的数据编码为66bit的块来传输,根据不同的传输方式,块格式分为两种:
-
数据块
数据块类似
8b10b编码中的数据码,用于单纯的传递数据。 -
控制块
控制块类似
8b10b编码中的控制码,用于码流控制。- 与
8b10b编码相同的是,控制块可以作为起始、结尾、分隔 - 与
8b10b编码不同的是,控制块不实现链路同步
- 与
同步头
64b/66b编码技术的链路同步通过前2bit的同步头(Sync Header)实现。两种66bit的块对应不同的同步头。
| 同步头 | 含义 |
|---|---|
| 00 | 编码错误 |
| 01 | 数据块(纯数据) |
| 10 | 控制块(混合数据/控制信息) |
| 11 | 编码错误 |
因此,按照同步机制,每66bit的数据至少会出现一次01或者10的转换。
数据块
单纯传递数据的块即数据块。
数据块一共传递8byte=8*8bit=64 bit的数据。
控制块
包含控制信息传递的块即控制块。控制块可以同时传递数据。
注意在控制块中,数据字(D0~D7)依旧是byte(8bit)为单位,而其控制字(Z0~Z7orC0~C7)是按照7bit为单位的,因此在某些情况下会存在空闲的位置(即表中标黄的部分)。
64b/66b对应8b/10b编码的控制字如下表所示(参考资料[1]):
而其实现在使用的64b/66b编码技术也扩展了其他控制字(参考64b/66b line code - IEEE 802,包含XGMII控制码-8b/10b控制码-10GBASE-R的对应关系):
| 控制字符 | 符号 | XGMII控制码 | 10GBASE-R 控制码 | 10GBASE-R 0码 | 8b/10b码 | 备注 |
|---|---|---|---|---|---|---|
| 空闲 | /I/ | 0x07 | 0x00 | K28.0或K28.3或K28.5 | ||
| 开始 | /S/ | 0xfb | 由块类型字段编码 | K27.7 | 默认0x00 | |
| 终止 | /T/ | 0xfd | 由块类型字段编码 | K29.7 | 默认0x00 | |
| 错误 | /E/ | 0xfe | 0x1e | K30.7 | ||
| 序列有序集 | /Q/ | 0x9c | 由块类型字段编码加上O模式编码 | 0x0 | K28.4 | 10GbE LSS 有序集 |
| 保留0 | /R/ | 0x1c | 0x2d | K28.0 | ||
| 保留1 | 0x3c | 0x33 | K28.1 | |||
| 保留2 | /N/ | 0x7c | 0x4b | K28.3 | ||
| 保留3 | /K/ | 0xbc | 0x55 | K28.5 | ||
| 保留4 | 0xdc | 0x66 | K28.6 | |||
| 保留5 | 0xf7 | 0x78 | K23.7 | |||
| 信号有序集 | /Fsig/ | 0x5c | 由块类型字段编码加上O模式编码 | 0xf | K28.2 | FC 有序集 |
起始字
控制块中起始字共2种,根据数据起始需要至少3字节或7字节:
- 以
0x78作为块类型字段,跟7字节(56bit)数据; - 以
0x33作为块类型字段,跟4个控制字(28bit)+空闲(4bit)+3个字节(24bit)数据。
终止字
控制块中终止字共8种,根据数据在不同位置终止采用不同块类型:
-
以
0x87作为块类型字段,跟0字节(0bit)数据+空闲(7bit)+7个控制字(49bit); -
以
0x99作为块类型字段,跟1字节(8bit)数据+空闲(6bit)+6个控制字(42bit); -
以
0xaa作为块类型字段,跟2字节(16bit)数据+空闲(5bit)+5个控制字(35bit); -
以
0xb4作为块类型字段,跟3字节(24bit)数据+空闲(4bit)+4个控制字(28bit); -
以
0xcc作为块类型字段,跟4字节(32bit)数据+空闲(3bit)+3个控制字(21bit); -
以
0xd2作为块类型字段,跟5字节(40bit)数据+空闲(2bit)+2个控制字(14bit); -
以
0xe1作为块类型字段,跟6字节(48bit)数据+空闲(1bit)+1个控制字(7bit); -
以
0xff作为块类型字段,跟7字节(56bit)数据+空闲(0bit)+0个控制字(0bit)。
其他控制字
通过块类型也可以编码出其他控制字,举例如下:
- 以
0x1e作为块类型字段,代表错误字K30.5 - 以
0x55作为块类型字段,代表控制字K28.5 - 以
0x78作为块类型字段,代表控制字K23.7
通过块类型和7bit line code也可以编码出其他控制字,举例如下:
- 以
0x55作为块类型字段+O模式,代表控制字有序集 - 以
0x66作为块类型字段+O模式,代表控制字有序集
扰码
扰码技术是一种对数据进行变换的方法,目的是使数据中的0和1平衡比例(各50%),影响高速传输的质量
- 加扰(
Scramble) - 解扰(
Descramble)
实际操作就是把数据流与特定模式序列 (pattern) 进行异或 (XOR),使发送数据变随机,特定模式序列用 LFSR (Linear Feedback Shift Register,线性反馈移位寄存器) 产生。64b/66b采用的生成多项式是X58+X19+1=0。
这里插入一个问题:
扰码和8b/10b编解码的功能是重复的吗?都做0/1的平衡?
个人理解:
- 在直流平衡方面,
8b/10b做的是比随机化序列更严格的直流平衡。8b/10b不仅保证码流总体的0/1数量相等,同时保证码流一定不会出现连续超过5个0/1。同时,8b/10b代价就是其编码效率不高。 - 在频谱分析、减少串扰方面,扰码能起到作用。
示例
示例来自参考资料[3]。
-
Original Data(原始码,以64字节为例)byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7 55 55 55 55 55 55 d5 08 00 20 77 05 38 0e 8b 00 00 00 00 08 00 45 00 00 28 1c 66 00 00 1b 06 9e d7 00 0 59 4d 00 00 68 d1 39 28 4a eb 00 00 30 77 00 0 7a 0c 50 12 1e d2 62 84 00 00 00 00 00 00 00 00 93 eb f7 79 -
XGMII(Add SOP,EOP,IDLES and convert to RS indications)07,1 07,1 07,1 07,1 07,1 07,1 07,1 07,1 (IDLE /I/) fb,1 55,0 55,0 55,0 55,0 55,0 55,0 d5,0 (START /S/) Data 08,0 00,0 20,0 77,0 05,0 38,0 0e,0 8b,0 Data 00,0 00,0 00,0 00,0 08,0 00,0 45,0 00,0 Data 00,0 28,0 1c,0 66,0 00,0 00,0 1b,0 06,0 Data 9e,0 d7,0 00,0 00,0 59,0 4d,0 00,0 00,0 Data 68,0 d1,0 39,0 28,0 4a,0 eb,0 00,0 00,0 Data 30,0 77,0 00,0 00,0 7a,0 0c,0 50,0 12,0 Data 1e,0 d2,0 62,0 84,0 00,0 00,0 00,0 00,0 Data 00,0 00,0 00,0 00,0 93,0 eb,0 f7,0 79,0 Data fd,1 07,1 07,1 07,1 07,1 07,1 07,1 07,1 (Terminate /T/) (IDLE /I/) -
10GBASE-R(Arrange into frames with type indicators and sync bit)sync byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7 “10” 1e 00 00 00 00 00 00 00 (IDLE /I/) “10” 78 55 55 55 55 55 55 d5 (START /S/) Data “01” 08 00 20 77 05 38 0e 8b Data “01” 00 00 00 00 08 00 45 00 Data “01” 00 28 1c 66 00 00 1b 06 Data “01” 9e d7 00 00 59 4d 00 00 Data “01” 68 d1 39 28 4a eb 00 00 Data “01” 30 77 00 00 7a 0c 50 12 Data “01” 1e d2 62 84 00 00 00 00 Data “01” 00 00 00 00 93 eb f7 79 Data “10” 87 00 00 00 00 00 00 00 (Terminate /T/) (IDLE /I/) -
Scrambler(Scramble and transmit left-to-right, lsb first)sync byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7 “10” 1e 00 00 00 80 f0 ff 7b (IDLE /I/) “10” 78 15 ad aa aa 16 30 62 (START /S/) Data “01” 08 e1 81 c5 6e 7c 76 6a Data “01” e6 30 28 80 cc aa f4 8d Data “01” 83 ee 49 ae 6d 93 db 2c Data “01” f3 46 70 db 82 5a 90 74 Data “01” 1e 51 79 6b 1a 25 7a c5 Data “01” 41 1f bf d4 0c 44 ca 4a Data “01” 09 28 12 d2 b5 2d 3f 2c Data “01” 49 92 de c8 b3 33 0e 32 Data “10” 2a a3 3a c8 d7 ad 99 b5 (Terminate /T/) (IDLE /I/)
注:以上扰码器假定初始值为全
1,非全0
根据上述扰码结果可计算0/1个数分别为326/378,大致是均衡的。
编码器
解码器
扰码器 & 解扰器
串行扰码
并行扰码
未完待续…长期施工…
参考资料
[1] IEEE 802.3ae 10Gb/s Task Force : walker_1_0300(64B66B-coding)
[2] P802.3bn EPoC PHY Task Force : hajduczenia_3bn_04_0313(64B66B-linecode)
[3] IEEE 802.3ae 10Gb/s Task Force : walker_1_0700(64b/66b coding update)
[4] 高速接口_(10Gbps )万兆网络中物理编码层 64B66B 编码解码实现 - 李白的白 - 博客园 (cnblogs.com)













