8b/10b

From Wikipedia, the free encyclopedia

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の実装を示す。このビット変換に決まった法則はなく、完全なテーブルによる変換で行われる。

さらに見る シンボル名, 5ビット値 EDCBA ...
5b/6b変換 (下位データ)
シンボル名 5ビット値
EDCBA
6ビット値 abcdei
正シンボル負シンボル
D.0000000100111011000
D.0100001011101100010
D.0200010101101010010
D.0300011110001
D.0400100110101001010
D.0500101101001
D.0600110011001
D.0700111111000000111
D.0801000111001000110
D.0901001100101
D.1001010010101
D.1101011110100
D.1201100001101
D.1301101101100
D.1401110011100
D.1501111010111101000
D.1610000011011100100
D.1710001100011
D.1810010010011
D.1910011110010
D.2010100001011
D.2110101101010
D.2210110011010
D.2310111111010000101
D.2411000110011001100
D.2511001100110
D.2611010010110
D.2711011110110001001
D.2811100001110
D.2911101101110010001
D.3011110011110100001
D.3111111101011010100
閉じる
さらに見る シンボル名, 3ビット値 HGF ...
3b/4b変換 (上位データ)
シンボル名 3ビット値
HGF
4ビット値 fghj
正シンボル負シンボル
D.xx.000010110100
D.xx.10011001
D.xx.20100101
D.xx.301111000011
D.xx.410011010010
D.xx.51011010
D.xx.61100110
D.xx.7[a]111 11100001
0111[b] 1000[c]
閉じる
  1. 0/1が5連続しないようなものを選択して使う。
  2. D.17.7, D.18.7, D.20.7 (=0xF1, 0xF2, 0xF4) でのみ使う。
  3. 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個ずつの10を持つシンボルでRD=負を維持するか、6個の1・4個の0を持つシンボルでRD=正にする、のいずれかで始まる。この性質により、受信データにRD極性の違反があれば、それ以前にエラーがあることを検出できるようになっている。

上記シンボルはデータを表現するもので総称してDコードと呼ばれるが、さらにこれ以外に制御用としてKコードと呼ばれるシンボルが12個ある[10]

さらに見る シンボル名, 10ビット値 abcdei fghj ...
Kコード(制御用シンボル)
シンボル名 10ビット値 abcdei fghj 構造
正シンボル負シンボル
K.28.0001111 0100110000 1011 下位6ビットはK.28と呼ばれる特殊シンボル001111を用いる。
上位4ビットはDコードとほぼ同じだが常に正負反転させる。
例外的に同一ビットが5連続するものがある(下線部)。
K.28.1001111 1001110000 0110
K.28.2001111 0101110000 1010
K.28.3001111 0011110000 1100
K.28.4001111 0010110000 1101
K.28.5001111 1010110000 0101
K.28.6001111 0110110000 1001
K.28.7001111 1000110000 0111
K.23.7111010 1000000101 0111D.23とD.xx.7下段の組合せ
K.27.7110110 1000001001 0111D.27とD.xx.7下段の組合せ
K.29.7101110 1000010001 0111D.28とD.xx.7下段の組合せ
K.30.7011110 1000100001 0111D.30とD.xx.7下段の組合せ
閉じる

脚注

Related Articles

Wikiwand AI