8B/10B編碼解析或者說是理解


 

8B10B編碼表可以查看鏈接:https://blog.csdn.net/weixin_36590806/article/details/109822204

本文就說下我自己對8B/10B的理解;

 

8b/10b最常見的是應用於光纖通訊和LVDS信號的。由於光模塊光模塊只能發送亮或者不亮,也就是0或者1這兩種狀態這種單極性碼,那么這會存在一個問題,如果傳輸中出現較長的連0或者連1(例如111111100000000),那么接收端將沒有辦法正確的采樣識別信號,另外還會由於單極性碼含有直流分量,這種直流成分會隨數據中1和0的隨機變化也呈現隨機性,這會引起接收端的基線漂移導致接收端誤判。LVDS信號一樣會存在這個問題,隨着線路上的信號頻率越來越高,如果線路上的0和1數量不均衡(直流不平衡)那么線路上的基電壓會出現偏移,一樣會導致解碼錯誤。

總之一句話,8b/10b是為了解決直流平衡而推出的。

8B/10B編碼是加擾二進制碼的一種,在此之前這種技術已得到應用,只是沒有像8B10B那么普遍。目前采用8b/10b編碼的串行高速接口總線有IEEE 1394b、SATA、PCI Express、Infini-band、Fiber Channel、RapidIO、USB3.0、MIPI M-phy 等。

 

8b/10b編碼方式詳解

8b/10b編碼的位域映射關系

編碼前的原始數據以字節為單位,每字節數據從高到低位用HGFEDCBA表示,首先將8b拆為高3位HGF,低5位EDCBA,然后將HGF從3bit編碼成4bit,編碼后的4bit用jhgf表示,將EDCBA從5bit編碼為6bit, 編碼后后的6bit為iedcba, 將編碼的4bit和6bit拼在一起即為10bit jhgfiedcba,發送時由於是小端模式,因為表示為abcdeifghj,如圖下:


通常人們會將編碼前低位的5bit EDCBA按其十進字數值計為X,高位的3bit HGF按其十進制數值為計Y,把這8bit數據計為D.x.y。在進行傳輸時我們除了傳輸數據本身,我們還需要嵌入一些控制信號,控制信號則依上面的規則計為K.x.y(稱之為“comma”)。這里會有一個疑問,D.x.y中的x最多到D.31.y,y最多到D.x.7,xy都被數據占完了,還用什么表示控制碼的K.x,y,下面一一道來。

3b/4b和5b/6b碼表

8bit原始數據有256個碼,而編碼后的10b數據有1024碼,這里面肯定有很多是用不着的,那么具體到一個8bit的數據編碼到什么樣的10bit數據能夠盡可能的做到直流平衡?這個可以自己去推導,也可以直接查表。

symbol列表示可讀命名, EDCBA是原始5b,abcdei是編碼后的6b, HGF是原始3b, fghj是編碼后4b。這個表中Symbol列以D開頭的行是數據的編碼,以k開頭的是控制符號的編碼。看到這里應該就明白了用什么表示k.x.y,因為5b6b碼表中除了K28.y外其它幾個碼值的K和D的x碼值是共用的,如D.K/23,這種情況下用以區分數據和控制符的其實是在3b4b碼表的D.x.7,D.x.7有兩個編碼一個是主編碼D.x.P7,另一個是D.x.A7。關於控制碼也有一個專門的碼表,如下:

從控制符碼表可以看到k.28.y本身的K.28跟D.28是不同的碼值。K27.y, K29.y,K30.y的編碼由於y=7存在兩種編碼,也不沖突。

但上面的碼表有個疑問表上的RD表示什么呢?從碼表上可以看到在4bit的子分組中,16種編碼中只有6 種是完美平衡(0,1個數相等)的,這對於3bit的8種編碼值是不夠的。 同時,在6bit的子分組中也只有20種編碼是完美平衡的,對於5bit的32種編碼值也是不夠的。RD( running disparity)極性偏差就是用來表示0,1的不平衡性的,

編碼時,數據不斷地進入8b10b編碼器生成10b數據,前面所有已編碼的10b數據不一致性累積產生的狀態就是運行不一致性(Runing Disparity)就是RD。RD僅會出現+1與-1兩種狀態,分別代表位”1”比位”0”多或位”0”比位”1”多,其初始值是-1。根據Current RD的值來決定5B/4B和 3B/4B編碼映射。

這樣,經過8B/10B編碼以后,連續的“1”和“0”基本上不會超過5bit,只有在使用comma時,才會出現連續的5個0或1。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM