USB3.0的8B/10B编码、AC耦合以及为什么要进行硬件编码
在USB2.0时代,USB的差分信号采用的是D+/D-进行传输,使用的编码是NRZI编码。对原始数据的编码就是:当数据为0时,电平翻转;数据为1时,电平不翻转。所以总线当数据为连续的0时,数据会是一个不停翻转的波形,电压呈交流形式,而当原始数据为1时,电平会由于NIZI的编码规则,呈现短暂的直流形式,即会出现一段时间电平不再变化。
对于上面的连续的电平不再变化,NRZI编码给的的解决方案是当原始数据中出现连续的7个1时,强行插入一个原始数据0,实现编码后的电来翻转。这样做的好出就是减少发送端与收入端的时钟误差而导致数据的接收错误。
所以从上面来看,对于串行接口数据的发送,尽可能多的发送交流数据,而不是直流数据。即尽量实现电平的翻转,发送方波信号。
当然以上的设计原则,也体现在硬件电路设计上。对于高速接口,如USB3.0的8B/10B编码,也是如此。相同于PCIE接口,也是如此。
无论是USB3.0还是PCIE的差分信号传输,差分信号电气规范要求其发送端串接一个电容CTX,以进行AC耦合。该电容也被称为AC耦合电容。
而实际的如PCIE的硬件原理图如下:
可以看到,对于高速输出接口,都有一个AC耦合电容,该电源的功能就是去除直流成份,而通过交流分量。
因为这个电容的存在,当链路上连续出现多个0或者1的时候,“隔直”效应发生了,接收端的电压会下降,信号变得无法正确识别。故交流耦合信号传输中需要尽量做到直流平衡(DC Balance),直流平衡的意思是指在一组信号中0和1的个数相等,尽量避免连续多个1或者连续多个0,比如连续三个1/0之后,一定要插入一个0/1。
所以为了达成直流平衡,USB3.0 spec对数据进行了特别的编码,也就是8/10b编码和以后的128/130b编码。所谓的编码,直观理解就是把8b(128b)的数据编码成10b(130b)来传输,使得发送的“0”、“1”数量保持基本一致。接收端按照同样的编码规则,解析出8b(128b)原始数据即可。事实上很多其他高速信号传输也用到类似的编码方式。
总结:
由于高速串行信号的数据帧率很高,并且没有像并行接口或者低速信号有专门的时钟信号(就算有,也由于帧率过高,导致PCB布板时的信号完整性如延迟问题很难做到同步),所以使用信号本身的交流成份来进行时钟同步(所以差分信号要做到等长布线)。而在实际的数据传输过程中,会由于原始数据的原因会导致直流成份出现,故需要进行硬件编码。