一、基本概念
??8B/10B編碼(8-bit to 10-bit encoding)是一種將8位數據(包括數據字符和控制字符)轉換為10位符號(Symbol)的編碼技術,由IBM工程師Al Widmer和Peter Franaszek于1983年提出。其核心思想是通過引入冗余位(2位/8位,編碼效率80%),實現直流平衡、時鐘同步,廣泛應用于高速數據傳輸場景。
??直流平衡(DC Balance)的意思是確保傳輸信號中“0”和“1”的數量盡可能相等,避免直流偏置(DC Offset)導致的信號失真和傳輸損耗。還有通過冗余位調整符號的“偏置值”(Disparity),使連續傳輸的符號整體保持0和1的平衡。
??還有通過8B/10B編碼可以避免長串連續的0或1(如全0或全1),保證接收端能從數據流中提取穩定的時鐘信號。
二、編碼原理
??8B/10B將8位輸入分為兩部分:
? 高5位(5B):從8位中取高5位,編碼為6位符號(5B/6B編碼)。
? 低3位(3B):剩余低3位,編碼為4位符號(3B/4B編碼)。
??最終將6位和4位合并為10位符號。
??8B/10B編碼后的符號分為兩種:
(1) 數據符號(D碼): 8bit數據(0x00~0xFF)可映射到10bit符號中的512個,正負各256個。如下圖部分符號示例,參考Xilinx的ug196_Virtex-5 FPGA RocketIO GTP Transceiver用戶手冊。
(2) 控制符號(K碼):編碼特殊控制字符(如K28.5用于幀同步)。如下圖示例。
??為什么10bit符號會有正負之分?這里涉及到偏置值概念,也稱為運行不一致性(Running Disparity,RD)。
??偏置值表示當前符號中“1”與“0”的數量差。
? 若碼字有6個1和4個0,偏置值為+2;
? 若碼字有4個1和6個0,偏置值為-2;
??編碼器維護一個全局偏置狀態,根據前一個符號的偏置值,選擇當前符號的兩種可能編碼中偏置相反的版本,以保持整體平衡。
例:若前一個符號偏置為+1,當前符號優先選擇偏置為-1的編碼,使總偏置趨近于0。
三、應用場景
??8B/10B編碼是高速串行通信的經典方案,常見于:
- 光纖通道(Fibre Channel)
- 千兆以太網(Gigabit Ethernet)
- PCI Express(PCIe)1.0/2.0
- Serial ATA(SATA)
- InfiniBand
- USB 3.0(部分變體,如64B/66B為改進版)
四、K碼符號
??上表中8B/10B編碼中的K碼有12個,原表中沒有列出哪個是高位,哪個是低位,所以這里指示一下高低位。
K28_0 = 8'h1C; // (10b-)10'h0BC, (10b+)10'h343
K28_1 = 8'h3C; // (10b-)10'h27C, (10b+)10'h183
K28_2 = 8'h5C; // (10b-)10'h2BC, (10b+)10'h143
K28_3 = 8'h7C; // (10b-)10'h33C, (10b+)10'h0C3
K28_4 = 8'h9C; // (10b-)10'h13C, (10b+)10'h2C3
K28_5 = 8'hBC; // (10b-)10'h17C, (10b+)10'h283
K28_6 = 8'hDC; // (10b-)10'h1BC, (10b+)10'h243
K28_7 = 8'hFC; // (10b-)10'h07C, (10b+)10'h383
K23_7 = 8'hF7; // (10b-)10'h057, (10b+)10'h3A8
K27_7 = 8'hFB; // (10b-)10'h05B, (10b+)10'h3A4
K29_7 = 8'hFD; // (10b-)10'h05D, (10b+)10'h3A2
K30_7 = 8'hFE; // (10b-)10'h05E, (10b+)10'h3A1
??K碼所對應的8bit數據只有配置K碼指示信號時才按K碼編碼,否則沒有K碼指示信號則只是普通D碼數據。
五、8B/10B編解碼仿真
??仿真工程可以去如下地址下載https://download.csdn.net/download/cjie221/90714799
??仿真框圖如下,用計數器產生0~255的數據,用k_valid為1來指示K碼數據。經encoder_8B10B測試單元編碼生成10bit符號,再經decoder_8B10B測試單元解碼恢復原始8bit數據和k_out指示信號。
??仿真波形如下,encoder_8B10B和decoder_8B10B模塊數據輸出都比輸入數據延時2拍。