一、故事前传
我们上回说到Link layer的结构,link layer的作用大致可以包括以下几点:
- Frame flow control
- CRC的生成与检测
- 对数据与控制字符的Scrmable/Descramble
- 8b/10b编解码
- 将传输层进来的数据转为Frame
二、8b/10b编解码
8b/10b编码是目前高速串行通信中经常用到的一种编码方式,直观的理解就是把8bit数据编码成10bit来传输。
为什么要引入这种机制呢?其根本目的是“直流平衡”。当高速串行流动逻辑1或逻辑0有多个位没有产生变化时,信号的转换就会因为电压位阶段关系而造成信号错误,直流平衡的最大好处便是可以克服以上问题。
将8bit编码成10bit后,连续的1或者0不能超过5位,所以10b中0和1的位数只可能出现3中情况:
- 有5个0和5个1
- 有6个0和4个1
- 有4个0和6个1
这样引出了一个新术语“不均等性”(Disparity),就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity0、-2、+2.
在SATA协议中资料值可以统一的表示为Dx.y或Kx.y,其中D表示资料字元,K表示特殊的控制字元, x表示输入的原始资料的低5位元,y表示输入的原始资料的高3位元。 通俗的讲,也就是8bit原始数据会分成两部分,其低5位进行5B/6B编码,高3位则进行3B/4B编码。
对K控制字元的编码方式和D资料字元编码方式一样。
协定中只使用了两个控制字元K28.3和K28.5
- K28.5只用在Primitive基元ALIGNp byte0,
- K28.3用在除ALIGNp之外的其他任何Primitive基元的byte0.
举个栗子:例如一个8bit数据10110101,x=10101(十进制为21) y=101(十进制为5),我们就把这8bit数据写成D21.5。对照5B/6B以及3B/4B加密对照表(如下表),可以得到10bit数据为1010101010