8b/10bはシリアル通信に用いられる伝送路符号の1つ。IBM[1]やソニー[2]による開発を元に ANSI INCITS 230 で規定されたもので、この名称は8ビットのデータを10ビットのデータに変換して転送することに由来する。10b/8bとも。
特徴
シリアル通信にはデータと、そのデータを拾うタイミングを作るクロックの存在が欠かせない。8b/10b方式はシリアル・データの中にクロックを埋め込むことで、データとクロックの転送を同じ配線で行うことが特徴である。
データとクロックを同時に通信するときに、LowやHighの状態が長期間に渡って続く場合は、そこからクロックを取り出せなくなることがある。8b/10bではどのようなデータであっても、Low/High状態が4クロック以下になるように変換を行う。これによって、帯域の20%をロスする(=データの割合が8/10になる)代わりに、データとクロックを同じ配線で同時に送受信することが可能になる。
用例
シリアル転送方式の多くで採用され、ギガビットイーサネット (1000BASE-X)[3]、ファイバーチャネル (1GFC~8GFC)[4]、IEEE 1394b (FireWire 800)[5]、PCI Express 2.0[6]、Serial ATA[7]、USB 3.0[8]などがこの方式を採っている。
8b/10bで同一のシンボルを長時間連続して送ると、電気変動が周期的になるため基板上でノイズの発生源となる恐れがある。
この対策として、PCI Expressでは8ビットデータに疑似乱数によるスクランブル処理を掛けてから8b/10b変換する方法が採用されており、伝送路が常にランダムなビットパターンで動作し続けることで周期変動を防いでいる。
さらに高速通信になると上記同様にスクランブル処理を用いる方式が多くなり、10ギガビット・イーサネット(10GBASE-R)やファイバーチャネル(10GFC・16GFC)では64b/66bが、PCI Express 3.0やUSB 3.1 Gen2では128b/130bが採用されている。
変換方式
8ビットの元データを HGF EDCBA
の上位3ビット/下位5ビットに分け、それぞれ1ビットずつ加えてLSBが最初に来る形でabcdei fghj
のように下位6ビット/上位4ビットに変換する。
この変換はシンボル D.xx.x
のように表記し、8ビットの元データ 0x00~0xFF
は、256種のシンボル D.00.0
, D.01.0
, ... , D.31.6
, D.31.7
で表現される。
以下に変換テーブルの一例としてIBMの実装を示す。このビット変換に決まった法則はなく、完全なテーブルによる変換で行われる。
5b/6b変換 (下位データ)
シンボル名
|
5ビット値 EDCBA
|
6ビット値 abcdei
|
正シンボル |
負シンボル
|
D.00 |
00000 |
100111 |
011000
|
D.01 |
00001 |
011101 |
100010
|
D.02 |
00010 |
101101 |
010010
|
D.03 |
00011 |
110001
|
D.04 |
00100 |
110101 |
001010
|
D.05 |
00101 |
101001
|
D.06 |
00110 |
011001
|
D.07 |
00111 |
111000 |
000111
|
D.08 |
01000 |
111001 |
000110
|
D.09 |
01001 |
100101
|
D.10 |
01010 |
010101
|
D.11 |
01011 |
110100
|
D.12 |
01100 |
001101
|
D.13 |
01101 |
101100
|
D.14 |
01110 |
011100
|
D.15 |
01111 |
010111 |
101000
|
D.16 |
10000 |
011011 |
100100
|
D.17 |
10001 |
100011
|
D.18 |
10010 |
010011
|
D.19 |
10011 |
110010
|
D.20 |
10100 |
001011
|
D.21 |
10101 |
101010
|
D.22 |
10110 |
011010
|
D.23 |
10111 |
111010 |
000101
|
D.24 |
11000 |
110011 |
001100
|
D.25 |
11001 |
100110
|
D.26 |
11010 |
010110
|
D.27 |
11011 |
110110 |
001001
|
D.28 |
11100 |
001110
|
D.29 |
11101 |
101110 |
010001
|
D.30 |
11110 |
011110 |
100001
|
D.31 |
11111 |
101011 |
010100
|
3b/4b変換 (上位データ)
シンボル名
|
3ビット値 HGF
|
4ビット値 fghj
|
正シンボル |
負シンボル
|
D.xx.0 |
000 |
1011 |
0100
|
D.xx.1 |
001 |
1001
|
D.xx.2 |
010 |
0101
|
D.xx.3 |
011 |
1100 |
0011
|
D.xx.4 |
100 |
1101 |
0010
|
D.xx.5 |
101 |
1010
|
D.xx.6 |
110 |
0110
|
D.xx.7[a] |
111
|
1110 |
0001
|
0111[b]
|
1000[c]
|
- ^
0 /1 が5連続しないようなものを選択して使う。
- ^ D.17.7, D.18.7, D.20.7 (=0xF1, 0xF2, 0xF4) でのみ使う。
- ^ D.11.7, D.13.7, D.14.7 (=0xEB, 0xED, 0xEE) でのみ使う。
|
シンボルの中には正負2種類が用意されているものがあるが、多くは0
/1
の個数が異なっており、それを反転させた組になっている。これまでに送ったシンボルの0
/1
の個数差をランニングディスパリティ (RD) と呼び、このRDによって正負シンボルどちらを使うかが決まる。
- 直前のRDが正(=
1
が多い)なら、次は負シンボルを送る。
- 直前のRDが負(=
0
が多い)なら、次は正シンボルを送る。
- 送るシンボルの
1
の数と0
の数が同じなら、RDの正負は維持する。
RDの初期値は負である[9]。したがって最初に送る10ビットシンボルは、5個ずつの1
・0
を持つシンボルでRD=負を維持するか、6個の1
・4個の0
を持つシンボルでRD=正にする、のいずれかで始まる。この性質により、受信データにRD極性の違反があれば、それ以前にエラーがあることを検出できるようになっている。
上記シンボルはデータを表現するもので総称してDコードと呼ばれるが、さらにこれ以外に制御用としてKコードと呼ばれるシンボルが12個ある[10]。
Kコード(制御用シンボル)
シンボル名
|
10ビット値 abcdei fghj
|
構造
|
正シンボル |
負シンボル
|
K.28.0 |
001111 0100 |
110000 1011
|
下位6ビットはK.28と呼ばれる特殊シンボル001111 を用いる。 上位4ビットはDコードとほぼ同じだが常に正負反転させる。 例外的に同一ビットが5連続するものがある(下線部)。
|
K.28.1 |
001111 1001 |
110000 0110
|
K.28.2 |
001111 0101 |
110000 1010
|
K.28.3 |
001111 0011 |
110000 1100
|
K.28.4 |
001111 0010 |
110000 1101
|
K.28.5 |
001111 1010 |
110000 0101
|
K.28.6 |
001111 0110 |
110000 1001
|
K.28.7 |
001111 1000 |
110000 0111
|
K.23.7 |
111010 1000 |
000101 0111 |
D.23とD.xx.7下段の組合せ
|
K.27.7 |
110110 1000 |
001001 0111 |
D.27とD.xx.7下段の組合せ
|
K.29.7 |
101110 1000 |
010001 0111 |
D.28とD.xx.7下段の組合せ
|
K.30.7 |
011110 1000 |
100001 0111 |
D.30とD.xx.7下段の組合せ
|
出典
- ^ US 4486739, "Byte oriented DC balanced (0,4) 8B/10B partitioned block transmission code", published 1984-12-04
- ^ US 4456905, "Method and apparatus for encoding binary data", published 1984-06-26
- ^ IEEE 802.3z-1998: Media Access Control Parameters, Physical Layers, Repeater and Management Parameters for 1,000 Mb/s Operation. (1998-10-01)
- ^ 辻哲也 (2002年8月22日). “特集:IP技術者のためのSAN入門”. @IT. 2024年4月30日閲覧。
- ^ 海上忍 (2007年8月16日). “IEEE 1394(FireWire)のこれから”. ITmedia NEWS. 2024年4月30日閲覧。
- ^ PCI Express Base Specification Revision 2.0. PCI-SIG. (2006-12-20). https://pcisig.com/specifications/pciexpress/base2
- ^ 大原雄介 (2010年7月12日). “大原雄介の最新インターフェイス動向 - Serial ATA 3.0編 (その3)”. PC Watch. 2024年4月30日閲覧。
- ^ Universal Serial Bus Revision 3.2 Specification. (2022-06-03). https://www.usb.org/document-library/usb-32-revision-11-june-2022
- ^ IEEE 802.3-2022, Section 36.2.4.4 Running disparity rules
- ^ IEEE 802.3-2022, Table 36–2—Valid special code-groups