在光前万兆网PCS之层中为了提高传输效率采用了64b/66b编码,编码效率为96.7%,实际由64b/66b编码引起的开销为3.125%,比8b/10b编码的效率80%高出很多,开销由25%降低到3.125%,因此64b/66b编码是一种高效编码。这种编码结构在10Ge,40Ge,100Ge的以太网中得到广泛应用。在USB3.1中采用了128b/132B 的结构,编码效率与64b/66b相同,但编码结构的容错率略高。在PCIe3.0的通信协议中采样128b/130b的结构,编码效率又提高了1%左右,开销降低了一半。下面就这几种编码格式进行介绍,并将64b/66b在光纤万兆网方面的应用做详细介绍。
1. 64b/66b编码
在光纤数据通信之前一般会把数据按照64b(8-byte)的方式组织,在64b的左边添加2-bit组成66b,额外添加的2-bit,一般称为64b/66b的前导字。前导字2-bit只有01和10有效,而11,00是无效位,当接收端收到11或00判定接收出错。其中
- 01后面的64-bit为数据,
- 10后面的64-bit为控制,
如表1所示。
| 前导字(preamble) | 字节顺序 | 描述 | |||||||
| 01 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 数据 |
| 10 | T/C/D | 由类型、控制或数据组成 | |||||||
| 00 | NA | 无效 | |||||||
| 11 | NA | 无效 | |||||||
表1 64b/66b
表1中,如果前导字为10时,该64-bit由block类型(这里的block是指64-bit的结构),引导后面可能是控制字或数据,详细内容请参照本文后续内容(万兆网PCS编码结构)。
64b/66b编码结构中,如果前导字发生1-bit错误,可以检错但不能纠错,如01有1-bit发生错误将变成00或11,因此可以及时发现错误,但由于10如果发生错误得到的结果相同,也是11或00,无法判断当前导字变成00,11时是由01出错还是10出错,因此无法纠错。
2. 128b/132b编码
128b/132b编码方式与64b/66b的方式非常类似,只是前导字由2-bit变成4-bit,其中只有0011与1100有效,细节见表2。
| 前导字(preamble) | 字节顺序 | 描述 |
| 0011 | D0–D15 | 数据 |
| 1100 | 控制 | 由类型、控制或数据组成 |
| 其它 | NA | 无效 |
表2 128b/132b
表2描述了128b/132b的基本结构,与64b/66b结构相比,由于128b之后才会出现0011或1100因此相对于时钟信息和直流平衡的时间间隔加长一倍,但132b比66-bit的检错效果明显加强。如果0011或1100由一个位发生错误,不仅可以检错还可以纠错。如果有2或3个bit发生错误也能检测出来。该编码被USB3.1所采用。详细内容请参照USB3.1协议。
3. 128b/130b编码
128b/130b的编码是最高效的编码方式,目前在PCIe3.0及以上使用, 前导10表示其后的128b为数据,01表示命令集。关于PCIe3.0的协议部分将在后续课程中讲解。
-
64b/66b在10Ge光纤通信中的编码结构
64b/66b在10Ge光纤通信中的编码结构有两种,一种是XGMII接口编码控制方式,另一种为64b/66b结构的编码控制方式。下面就两种结构分别介绍。
-
XGMII编码方式
XGMII中的X是罗马数字的10,因此XGMII是10Ge的GMII接口。XGMII采用72- bit结构,详细内容可以参照802.3 clause 46。其中最左边的一个byte为控制字表示在其后的64-bit(8个byte)对应的是数据还是控制字符。控制byte中的每个bit与8个byte一一对应,bit为0表示对应的byte为数据,bit为1表示对应的byte为控制字符。如表3
| 控制位(bit) | 对应的byte的含义 |
| 0 | 数据 |
| 1 | 控制码 |
表3
XGMII的控制字符(控制码)有4种,分别为07,FB,FD,FE 。控制码的含义如表4所示。
| 控制位(bit) | 对应的byte | 含义 |
| 0 | 0x?? (8’h??) | D数据,可以为0-255的任何值 |
| 1 | 0x07 (8’h07) | I空闲(idle) |
| 1 | 0xFB (8’hFB) | S帧起始(start of packect) |
| 1 | 0xFD (8’hFD) | T帧结束(end of packect) |
| 1 | 0xFE (8’hFE) | E接收错误,或转发时指示该帧有数据错误 |
表4
XGMII数据包按72-bit结构如表5,其中ZZ表示数据字节,FB表示帧起始,FD表示帧结束。同时可以看出XGMII在帧起始中对MAC层的前导字(preamble)做了压缩,将7个0x55压缩成6个0x55。帧结束分成L0–L7共8个类型用于容纳整个数据包在按照8-byte传输后剩余的字节。如L3对应的控制字节为00011111b,表示在按照8-byte结构传输后还有3-byte的剩余数据要安排在本72-bit的结构中,紧接着为控制字符0xFD表示帧结束, 之后由空闲字符0x07填充。

表 5
在接收端可能不像表5控制字节与数据或控制字符对应那么整齐,在调试时可能如图1所示,在FPGA编程中可以利用Verilog RTL根据控制字节中的位进行调整和对齐。

图1
在10Ge 64b/66b的结构中可以根据XGMII的72-bit的组织方式转换到66-bit组织方式。如表6所示。

表6
在表6中如果同步字(前导)为01,其后的8个byte都是数据,如果同步字为10,第一个byte为类型(Block Type)。Block Type的各个字节含义如下,0x1e表示空闲,其中将XGMII中的0x07(二进制为0000_0111)由8位变成7位(000_0111)然后组合起来,8 * 7-bit=56-bit可以用7个byte表示。
因此IDLE字节流为0x1e0e1c3870e1c387。
0x78是帧起始,其后跟55-55-55-55-55-55-D5
0x87是帧结束,而且是8-byte对齐的帧结束,即在控制位(同步位)为01时将整个数据包完整的传输到Phy层。因此在帧结束时不需要携带剩余的数据字节。
其它的类型都是数据与控制字符的混合传输模式。比如类型为0xb4时,在8-byte整块数据传输时尚有3-byte数据没有传输,在本次的66-bit的传输中要携带3-byte数据加上控制字符。
因此编码如下:B4-zz-zz-zz-(000_0111)-(000_0111)-(000-0111)-(000_0111)-(000_0111)–> B4-zz-zz-zz-(000)-(0111_0000)-(0111_0001)-(1100_0011)-(1000_0111),经过从右到左补齐4个字节后,剩余的三个bit(000)丢弃即可,最终的编码是B4zzzzzz70e1c387。
其它的编码如表7所示,

表7
经过XGMII到64/66的编码格式转换,可以很好的使用XGMII,64b/66b光纤万兆网的编码与调试。对于编写XGMII,64b/66b的MAC接口的IP开发与调试有指导意义。对于FPGA而言,如果利用SERDES实现PHY, 也可以将MAC 与PHY合二为一实现一个完整的IP。关于XAUI,RAUI的相关内容将在后续文章中介绍。