8B/10B編碼是目前高速串列通訊中經常用到的一種編碼方式。直觀的理解就是把8bit資料編碼成10bit來傳輸,為什麼要引入這種機制呢?其根本目的是“直流平衡(DC Balance)”。當高速串列流的邏輯1或邏輯0有多個位沒有產生變化時,訊號的轉換就會因為電壓位階的關係而造成訊號錯誤,直流平衡的最大好處便是可以克服以上問題。
將8bit編碼成10bit後,10B中0和1的位元只可能出現3種情況:
1.有5個0和5個1
2.有6個0和4個1
3.有4個0和6個1
這樣引出了一個新術語“不均等性(Disparity)”,就是1的位元和0的位元的差值,根據上面3種情況就有對應的3個Disparity 0、-2、+2。
工作原理
8bit未經處理資料會分成兩部分,其低5位會進行5B/6B編碼,高3位則進行3B/4B編碼,這兩種映射關係在當時已經成為了一個標準化的表格。人們喜歡把8bit資料表示成Dx.y的形式,其x=5LSB(least significant bit最低有效位),y=3MSB(most significant bit最高有效位)。
例如一個8bit資料101 10101,x=10101(21) y="101"(5),現在我們就把這8bit資料寫成D21.5,明白了吧!
Dx.y形式在進行5B/6B和3B/4B編碼中表示更直觀,下面我們來看看兩張編碼錶:
對於8bit資料,它在表中的位序為HGFEDCBA,即H為最高位,A為最低位,EDCBA經過5B/6B編碼為abcdei,HGF經過3B/4B編碼為fghj。傳送10bit編碼的順序為abcdeifghj。
3B/4B使用K.x.7
對於D.x.7,當和5B/6B組合時D.x.P7和D.x.A7編碼必須選擇一個來避免連續的5個0或1。遇上連續5個0或1的情況下使用“逗號碼”來進行校準。D.x.A7用在x=17 x="18" x="20當RD"=-1時,x=11 x="13" x="14" 當RD=+1時。當x=23 x="27" x="29" x="30時",使用K.x.7進行編碼。其他情況下x.A7碼不能被使用,他將會導致和其他“逗號序列”產生衝突。
候補編碼K.x.y允許K.28.1 K.28.5 K.28.7作為“逗號碼”來保證資料流中的唯一性。
你們也許注意到了表中有個RD標誌,它是Running Disparity的縮寫,它的目的就是保持8B/10B編碼中的直流平衡。它跟上面提到的Disparity其實是一樣的意思,+1用來表示1比0多,-1用來表示0比1多,-1是它的初始化狀態。下面我們來看一張表來加深理解:
上面我們提到的“逗號碼”和“逗號序列”,其實都是當初在規劃8B/10B編碼機制的時候,所謂的控制碼(Control Characters)的其中之一。8B/10B標準中使用了12個特殊的控制碼,他們能在資料中被發送,還可以組合成各種“原語”。
在控制碼中,K.28.1 K.28.5 K.28.7 是逗號序列,逗號序列是用來校準用的,如果K.28.7沒有被使用,序列0011111 或者 1100000 是不會出現在任何編碼中的。
在實際編碼中如果K.28.7可以被使用,一種更複雜的校準規範需要?被使用,它們能組合成各種“原語”,在任何情況下多個K.28.7序列不允許被同時使用,它將導致不可探測的逗號序列。
(轉自:http://en.wikipedia.org/wiki/8B10B)