8B/10B,也叫做8字節/10字節或8B10B。8B/10B方式最初由IBM公司於1983年發明並應用於ESCON(200M互連系統),由Al Widmer和Peter Franaszek在IBM的刊物“研究與開發”上描述。
8b/10b編碼的特性之一是保證DC 平衡,采用8b/10b編碼方式,可使得發送的“0”、“1”數量保持基本一致,連續的“1”或“0”不超過5位,即每5個連續的“1”或“0”后必須插入一位“0”或“1”,從而保證信號DC平衡,它就是說,在鏈路超時時不致發生DC失調。通過8b/10b編碼,可以保證傳輸的數據串在接收端能夠被正確復原,除此之外,利用一些特殊的代碼( 在PCI-Express總線中為K碼) ,可以幫助接收端進行還原的工作,並且可以在早期發現數據位的傳輸錯誤,抑制錯誤繼續發生。
8b/10b編碼是將一組連續的8位數據分解成兩組數據,一組3位,一組5位,經過編碼后分別成為一組4位的代碼和一組6位的代碼,從而組成一組10位的數據發送出去。相反,解碼是將1組10位的輸入數據經過變換得到8位數據位。數據值可以統一的表示為DX.Y或KX.Y,其中D表示為數據代碼,K表示為特殊的命令代碼,X表示輸入的原始數據的低5位EDCBA,Y 表示輸入的原始數據的高3位HGF。
8b/10b編碼是目前許多高速串行總線采用的編碼機制,如 USB3.0、1394b、Serial ATA、PCI Express、Infini-band、Fiber Channel、RapidIO等總線或網絡等。
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序列不允許被同時使用,它將導致不可探測的逗號序列。