8bit/10bit线路编码简介
8bit/10bit線路編碼簡介
線路編碼:
?????? 線路/信道:
特指在數據(信息)傳輸中,信號傳輸的物理通道。本質上信道不局限于有線/無線,也不局限于具體的載體材質,可以是銅線、光信號、甚至是無介質空間中的電磁場。在本文中,主要針對有線通訊和光通訊應用的場景來具體討論和展開。
每一種信道都有自己的特性,這些特性限制了最高的傳輸頻率,更高頻率的傳輸,會導致前后兩個信息之間難以分辨,產生信號的交疊。
在數字電路系統中,需要傳輸的最高頻率的信息就時鐘信息。時鐘頻率要低于信道允許傳輸的最高頻率。
任何信道都會受到所處環境的干擾。持續存在的干擾可以等同于基底噪聲。突發的干擾則會引起信道的短暫不可靠,甚至造成傳輸錯誤。
????????????? 總體來說,就是信道要保證傳輸的數據易于被接收端接收(采樣)、分辨、恢復。
線路/信道編碼:
?????? 線路/信道編碼就是將原始需要傳輸的信息,經過一定的變換,使其更適合其所要使用的傳輸信道。通常要考慮如下因素:
沒有哪種信道編碼可以100%利用信道的傳輸資源,但是要盡量減少信道編碼的開銷。
為了便于接收端的時鐘恢復電路,必須充分傳遞時鐘信息(控制連續的0和連續的1的個數)。
字節的劃分、信道間的數據對齊等
誤碼檢測、誤碼糾錯等
直流平衡等
8b-10b編碼簡介:
8b/10bB編碼是1983年由IBM公司的Al Widmer和PeterFranaszek所提出的數據傳輸編碼標準,目前已經被廣泛應用到高速串行總線,如IEEE1394b、SATA、PCI-Express、Infini-band、FiberChannel、XAUI、RapidIO、USB 3.0等。
- 8b/10b編碼,實際上是3b/4b 和 5b/6b兩個編碼的組合。
- 輸入的8bit原始數據,被拆分成高3bit(記作y),和低5bit(記作x)兩部分
- 拆分后的兩部分,分別做3b/4b 和 5b/6b編碼。生成10bit數據(4bit + 6bit)
- 最后生成的10bit數,按照LSB的順序,從最低位逐bit發送。
3b/4b 和 5b/6b編碼表
| ?????? Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
| data | EDCBA | iedcba | data | EDCBA | iedcba | |||
| D.00 | 00000 | 111001 | 000110 | D.16 | 10000 | 110110 | 001001 | |
| D.01 | 00001 | 101110 | 010001 | D.17 | 10001 | 110001 | ||
| D.02 | 00010 | 101101 | 010010 | D.18 | 10010 | 110010 | ||
| D.03 | 00011 | 100011 | D.19 | 10011 | 010011 | |||
| D.04 | 00100 | 101011 | 010100 | D.20 | 10100 | 110100 | ||
| D.05 | 00101 | 100101 | D.21 | 10101 | 010101 | |||
| D.06 | 00110 | 100110 | D.22 | 10110 | 010110 | |||
| D.07 | 00111 | 000111 | 111000 | D.23 | 10111 | 010111 | 101000 | |
| D.08 | 01000 | 100111 | 011000 | D.24 | 11000 | 110011 | 001100 | |
| D.09 | 01001 | 101001 | D.25 | 11001 | 011001 | |||
| D.10 | 01010 | 101010 | D.26 | 11010 | 011010 | |||
| D.11 | 01011 | 001011 | D.27 | 11011 | 011011 | 100100 | ||
| D.12 | 01100 | 101100 | D.28 | 11100 | 011100 | |||
| D.13 | 01101 | 001101 | D.29 | 11101 | 011101 | 100010 | ||
| D.14 | 01110 | 001110 | D.30 | 11110 | 011110 | 100001 | ||
| D.15 | 01111 | 111010 | 000101 | D.31 | 11111 | 110101 | 001010 | |
| K.28 | 11100 | 111100 | 000011 | |||||
?? 理論上分析:
- 5bit碼共有32個碼字,6bit碼共有64個碼字。因此5b/6b編碼中,6bit碼字只需要用一半。
- 為了去除連0和連1,自然會想到用64個碼字中0/1比較平衡的碼字。
- 6bit碼字中,0和1個數相等(3個0和3個1)的碼字共有C63=20個
0和1的個數相差2的有:2*C62=30個
0和1的個數相差4的有:2*C61=12個
0和1的個數相差6(全0或全1)的有:2*C60=2個
- 理論上,我們選擇上述的前兩種(0和1個數差小于等于2)碼字就夠了。
編碼方式:
- 5bit碼字中0和1的個數相差為1、3、5(0和1的個數不可能相等)
- 0比1多一個的碼字有10個:
D.03(00011) ?????? RD-/+ (100011)
D.05(00101)??????????? RD-/+ (100101)
D.06(00110)???????????? RD-/+ (100110)
D.09(01001)??????????? RD-/+ (101001)
D.10(01010)??????????? RD-/+ (101010)
D.12(01100)???????????? RD-/+ (101100)
D.17(10001)??????????? RD-/+ (110001)
D.18(10010)??????????? RD-/+ (110010)
D.20(10100)??????????? RD-/+ (110100)
D.24(11000)???????????? RD- ?? (110011) ??RD+ (001100)
從上面可以看到,5bit碼字中當0比1多一個時,直接在前面添加1,編程6bit碼字。這時的6bit碼字0和1個數相等。
但是D.24比較特殊,按照上述規則,D.24編碼后應該是111000,但是由于D.07,占用了相應的碼字,因此D.24采用了其特殊的映射編碼方式。
- 1比0多一個的碼字也有10個(其實就是0/1翻轉一下,碼字翻轉也等同于用31去減一下):
D.28(11100) ?????? RD-/+ (011100)
D.26(11010)???????????? RD-/+ (011010)
D.25(11001)???????????? RD-/+ (011001)
D.22(10110)???????????? RD-/+ (010110)
D.21(10101)??????????? RD-/+ (010101)
D.19(10011)???????????? RD-/+ (010011)
D.14(01110)???????????? RD-/+ (001110)
D.13(01101)???????????? RD-/+ (001101)
D.11(01011)???????????? RD-/+ (001011)
D.07(00111)???????????? RD- ?? (000111) ??RD+ (111000)
從上面可以看到,5bit碼字中當0比1多一個時,直接在前面添加1,編程6bit碼字。這是的6bit碼字0和1個數相等。
由于D.07占用了2個1/0個數相等的6bit碼字,因此D.24使用了其他的碼字。到此,20個0/1平衡的6bit碼字全部用完了。
但是D.07比較特殊,在5’b00111前加一個0編程6’b000111后,此碼字僅作為RD-,同時還編碼了RD+ 6’b111000,這個碼字剛好占用了D.24對應的碼字,因此才導致了D.24使用了兩個1/0差為2的碼字。 這樣做,主要是因為碼字000111和111000的前后邊界都是3連0/1,這很容易和前后的其他碼字形成多個連續的0/1,因此編碼時就必須考慮其他碼字情況來做適當的選擇,以避免過多的連0/1。
- 1和0個數相差3的碼表
| Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
| data | EDCBA | iedcba | data | EDCBA | iedcba | |||
| D.01 | 00001 | 101110 | 010001 | D.23 | 10111 | 010111 | 101000 | |
| D.02 | 00010 | 101101 | 010010 | D.27 | 11011 | 011011 | 100100 | |
| D.04 | 00100 | 101011 | 010100 | D.29 | 11101 | 011101 | 100010 | |
| D.08 | 01000 | 100111 | 011000 | D.30 | 11110 | 011110 | 100001 | |
| D.16 | 10000 | 110110 | 001001 | D.15 | 01111 | 111010 | 000101 | |
?????? D.23、D.27、D.29、D.30對應的5bit碼字中1的個數比0多,因此其RD-編碼即為在其前面加1bit0。而RD+則是RD-按bit取反。
?????? D.01、D.02、D.04、D.08對應的5bit碼字中0的個數比1多,因此其RD+是在第二bit處插入1bit1(最前面加1bit1對應的碼字被D.23、D.27、D.29、D.30的RD-占用了)
?????? D.16和D.15,比較特殊,為了減少連續的0/1,采用了特殊的編碼方法。
?????? 但是D.30的中間存在4個連續的0/1:6’b011110和6’b100001。
??????
- 特殊編碼:
| Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
| data | EDCBA | iedcba | data | EDCBA | iedcba | |||
| D.16 | 10000 | 110110 | 001001 | D.15 | 01111 | 111010 | 000101 | |
| D.00 | 00000 | 111001 | 000110 | D.31 | 11111 | 110101 | 001010 | |
| D.24 | 11000 | 110011 | 001100 | K.28 | 11100 | 111100 | 000011 | |
?????? 編碼的2個基本原則:
?????? K.28 作為控制碼,其邊界有連續的0和1,因此在和前后其他碼字構成連續的碼流時,需要考慮避免過長的連續0/1的情況。
?????? 由此我們也考慮到D.07采用的編碼,雖然0和1的個數是均等的,但是由于其連續的0和連續的1都在碼字的邊界,因此在構成連續的碼流時也容易和前后的其他碼字組成比較長的連0/1。
由此還剩下兩個編碼: 110000和001111。
3bit/4bit code
| Input | RD=-1 | RD=+1 | Input | RD=-1 | RD=+1 | |||
| data | HGF | jhgf | data | HGF | jhgf | |||
| D.x.0 | 000 | 1101 | 0010 | K.x.0 | 000 | 1101 | 0010 | |
| D.x.1 | 001 | 1001 | K.x.1 | 001 | 0110 | 1001 | ||
| D.x.2 | 010 | 1010 | K.x.2 | 010 | 0101 | 1010 | ||
| D.x.3 | 011 | 0011 | 1100 | K.x.3 | 011 | 0011 | 1100 | |
| D.x.4 | 100 | 1011 | 0100 | K.x.4 | 100 | 1011 | 0100 | |
| D.x.5 | 101 | 0101 | K.x.5 | 101 | 1010 | 0101 | ||
| D.x.6 | 110 | 0110 | K.x.6 | 110 | 1001 | 0110 | ||
| D.x.P7 | 111 | 0111 | 1000 | |||||
| D.x.A7 | 111 | 1110 | 0001 | K.x.7 | 111 | 1110 | 0001 | |
?????? 3bit/4bit碼表看起來比較直觀:
- D.x.1、D.x.2、D.x.5、D.x.6都是簡單地在最前面插入相應的1/0,湊成1和0平衡的4bit編碼。
- D.x.3和5bit/6bit編碼中的D.07類似,占用了兩個平衡的碼字,因此D.x.4和D.24類似,只能有非平衡的碼字了。
- D.x.0采用了特殊的編碼后,剩下四個連0/1的分給了D.x.7
- 為了防止碼流中D.x.7和前后的碼連接出太多的0/1,給D.x.7分配了2組碼字,并且規定如下:
1)3bit/4bit碼排在5bit/6bit碼之后(D.x.y中的x表示5bit/6bit編碼的結果)。在和5bit/6bit編碼組合時,D.x.P7和D.x.A7必須選一個,但是要避免5個以上的連0或連1。
2)結合5bit/6bit編碼,以下情況選擇A7,其他情況全都使用P7:
當RD為“-”是,有3個碼字選擇A7,即:
D.17.A7、D.18.A7、D.20.A7
當RD為“+”是,有3個碼字選擇A7,即:
D.11.A7、D.13.A7、D.14.A7
???????? 此處更能清晰的理解編碼的思想,和RD的含義:在有RD+和RD-的編碼中,利用不同RD采用不同的編碼,都可以有效的避免過多的連續0/1情況。但是對于D.17、D.18、D.20、D.11、D.13、D.14這樣的編碼并沒有區分RD+和RD-,這在和4bit/5bit編碼時,就容易產生多個連續的0/1。尤其當比較平衡的碼字都分配完后,K.x.7的編碼方式就必須考慮這一點了。
- K碼的碼字共有16個(4bti所有碼字也是16個),而為了避免出現某些連0/1的碼字,在K碼的16個碼字中,是有重復碼字的,因此在使用K碼時,情況會比較復雜。
使用K碼時,要避免和其他碼字混淆,因此并不是所有的組合都會被使用到。
K code:
K碼作為特殊的控制編碼,專門用來表示數據以外的控制指令。可以根據需要鑲嵌在數據碼流中的任何位置
基于K碼的應用和復雜性,在原始的8bit/10bit編碼中,只定義了12個特殊的控制碼。他們可以和其他碼字一起組成各種“原語”。
| input | RD= -1 | RD= +1 | |
| HGF? EDCBA | abcdei? fghj | abcdei? fghj | |
| K28.0 | 000? 11100 | 001111? 0100 | 110000? 1011 |
| K28.1 | 001? 11100 | 001111? 1001 | 110000? 0110 |
| K28.2 | 010? 11100 | 001111? 0101 | 110000? 1010 |
| K28.3 | 011? 11100 | 001111? 0011 | 110000? 1100 |
| K28.4 | 100? 11100 | 001111? 0010 | 110000? 1101 |
| K28.5 | 101? 11100 | 001111? 1010 | 110000? 0101 |
| K28.6 | 110? 11100 | 001111? 0110 | 110000? 1001 |
| K28.7 | 111? 11100 | 001111? 1000 | 110000? 0111 |
| K23.7 | 111? 10111 | 111010? 1000 | 000101? 0111 |
| K27.7 | 111? 11011 | 110110? 1000 | 001001? 0111 |
| K29.7 | 111? 11101 | 101110? 1000 | 010001? 0111 |
| K30.7 | 111? 11110 | 011110? 1000 | 100001? 0111 |
注意這個碼表的排列順序。
- K28.1、K28.5、K28.7中出現了5個連續的0/1,這在8bit/10bit編碼中是絕無僅有的。因此這連續出現的5個0/1,被定義為 逗號碼(commas),或者逗號序列,通常用來做序列的bit校準。
8bit/10bit編碼規則
RD(running disparity):
RD用來表示0和1的相對多少。如果RD=(+1),表示之前的編碼中1的個數比0多;如果RD=(-1),表示之前的編碼中0的個數比1多。
| Previous RD | Disparity of 6 or 4 bit code | Next RD |
| -1 | -2(0比1多2個) | 此情況禁止發生 |
| -1 | 0 | -1 |
| -1 | 2 | +1 |
| +1 | -2 | -1 |
| +1 | 0 | +1 |
| +1 | 2 | 此情況禁止 |
- 每一個編碼過程有2個輸入,和兩個輸出:
輸入:?????????? 要編的源碼 碼字
上一次編碼后得出的RD值
??????
輸出:?????????? 編碼后的碼字
???????????????????? 本次編碼后的RD值
編碼過程:
a,b,c,d,e,I,f,g,h,j
K碼的應用:
在PCIE協議中,使用如下的K碼:
| Encoding | symbol | function | description |
| K28.5 001111 1010 110000 0101 | COM | comma | Used for Lane and Link Initialization and management |
| K27.7 110110 1000 001001 0111 | STP | Start TLP | Marks the start of a Transaction Layer Packet |
| K28.2 001111 0101 110000 1010 | SDP | Start DLLP | Marks the start of a Data Link Layer Packet |
| K29.7 101110 1000 010001 0111 | END | end | Marks the end of TLP or DLLP |
| K30.7 011110 1000 100001 0111 | EDB | End bad | Marks the end of nullified TLP |
| K23.7 111010 1000 000101 0111 | PAD | Pad | Used in Framing and Link Width and Lane ordering negotiations |
| K28.0 001111 0100 110000 1011 | SKP | skip | Used for compensating for different bit rates for two communicating ports |
| K28.1 001111 1001 110000 0110 | FTS | Fast training sequence | Used within an ordered set to exit from L0s to L0 |
| K28.3 001111 0011 110000 1100 | IDL | Idle | Used in the Electrical idle ordered set |
| K28.4 001111 0010 110000 1101 | reserved | ||
| K28.6 001111 0110 110000 1001 | reserved | ||
| K28.7 001111 1000 110000 0111 | reserved |
從上表可以理解到:
總結
以上是生活随笔為你收集整理的8bit/10bit线路编码简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware导出ovf和ova格式文件
- 下一篇: linux操作系统c语言编程,Linux