和大家分享一下关于8b/10b编码的知识点,如有什么错误之处或大家有什么额外的见解欢迎大家公众号后台留言!
在传统的源同步传输中,数据和时钟分离,在速率较低(<1000M)时问题不大,关于M?推测单位应该是Mbps。
在传输速率越来越高时,由于传输线的时延和抖动存在(个人理解为时序约束中的routing布线延迟和时钟Jitter--也就是时钟周期差异),导致接收端不能正确的采样数据,时钟边沿无法与数据中心对齐。
为了解决该问题,可以将数据从时钟中恢复(CDR技术,Clock Data Recovery),这样就不会存在延迟不一致的情况,有轻微Jitter也不会影响采样(恢复的时钟随着数据一起抖动)。
But!but!but!将数据和时钟混合,接收端从接收数据中恢复出时钟的话,那么数据接收方要和数据发送方共地。
这样的话就会增加接口线路,且往往很难实现,所以数据传输采用差分传输,抗共模噪声。
那么问题又来了,差分传输的话,由于电压的绝对值较大,变化速率更快(斜率更大),数据接收端的电流会存在过大问题,在接收端使用交流耦合电容进行交流耦合,隔直流通交流(链路交流耦合)。
如下图所示,直流平衡时,数据流中的0和1交替出现,可以认为是交流信号,可以顺利通过耦合电容,DC不平衡时,数据流中出现多个连续的0或者1,可认为这段时间内的信号是直流,通过电容时会产生传输错误,所以就有了8b/10b(64b/66b)编码,高速串行总线采用编码技术的目的是平衡数据流中的0和1,从而实现DC平衡。
Clock Data Recovery时钟恢复电路一般是通过PLL电路(鉴相器PD、环路滤波器LF、压控振荡器VCO)实现,其作用是从数据流中准确的恢复出时钟和数据信息。
参考时钟输入到鉴相器(PD),鉴相器比较的是两个相位,一个是参考时钟,一个是数据恢复时钟,两个时钟之间存在两种差异,一种是频率差,另一种是相位差,当恢复时钟相位与参考时钟相位之间存在差异的话会产生一个对应比例的积分值,根据积分值的大小,控制数据时钟提取电路的时钟进行偏移,从而使得数据恢复时钟和参考时钟相位进行对齐,此时认为输出时钟锁定,即所向为认为时钟已经锁定到了所需要的相位或者频点上,就可以作为一个可以使用的时钟。
在serdes上的高速串行数据流在接收端需要重新串并转换成多个字节的并行数据,如何有效的识别32bit数据边界?这就需要一个特殊的序列,即为Comma码。在任意数据组合中,Comma码只作为控制字符出现,在数据负荷部分不会出现,所以使用comma码字符只是帧的开始和结束标志,或者修正和数据流对齐的控制字符。
接收器在输入数据流中扫描搜寻特定的比特序列(comma),如果找到序列,解串器调整字符边界以匹配检测到的Comma字符序列。
SATA应用中使用K28.5(Align原语的第一个字节)作为comma字符
K码有多个,比如K28.0、K28.1、K28.5等,K码标志帧开始、帧结束、时钟修正和数据对其等功能,K指的是Comma码,K和小数点之间的数字指的是8位数据的后5位,小数点后面的数字指的是8位数据的前3位【K码格式,好重要的,在PCIe部分这个K码搞了好久才理解】。
以K28.5为例:
28表示8位数据的后五位为27,即5’b1_1100
5表示的8位数据的前三位为5,即3’b101
故K28.5的二进制形式为:8’b1011_1100,即8’hBC
K28.5字符用于识别一帧数据的开始,数据发送时以字为单位传输,在接口处数据是32位,用于字节对齐与数据同步。检测到帧同步信号(K28.5)时,根据所处的位置将同步字符提取出来删掉,剩余部分为有效数据,比如:
接收到的数据是32’h08bc0706,此时帧同步信号为4’h4==4’b0100,即表示K字符位于第三byte,一共4个字节,byte0~3,需要将byte2去掉。
K码表:
其中K28.1,K28.5,K28.7可以作为分隔码,也叫comma码,用于接收端在串行的数据流中找到字节边界。常用的K28.5即0xBC。
祝大家521快乐,到了学校一堆事要做,可能以后不能天天更新了,请理解~~~~
~~~~感谢阅读~~~~谢谢!
联系客服