ハミング符号の計算ツール

0と1のデータをハミング符号に符号化し、符号語のビットを押して誤りを入れると、受け取った側がシンドロームから誤りの位置を求めて訂正するまでを確かめられます。4ビットのデータの(7,4)符号から、メモリのECCで使われる64ビットのSECDED(72ビット)まで選べ、各パリティがどの位置を受け持つかも表で示します。

入力

符号語(ビットを押すと誤りを入れられます)

パリティ(位置が2のべき乗) データ 全体のパリティ(SECDED)

パリティの検査(受け取った側)

パリティ受け持つ位置XOR の結果

復号の結果

シンドローム
–
入れた誤りの数
0
訂正後のデータ
–

位置は1から数え、2のべき乗(1、2、4、8…)の位置にパリティ、それ以外にデータを上位から順に入れる、教科書でよく使う並べ方です。実際のメモリのECCでは、ビットの並べ方が異なることがあります。

パリティの位置と受け持つビット

ハミング符号では、位置を1から数え、1、2、4、8のような2のべき乗の位置にパリティビットを置きます。位置pのパリティは、位置の番号を2進数で書いたときにpのビットが1になる位置をすべて受け持ち、それらのXORが0になるように決めます。たとえば(7,4)符号では、P1は位置1・3・5・7、P2は2・3・6・7、P4は4・5・6・7を受け持ちます。データ1011を符号化すると、位置1〜7は0110011になります。表の「受け持つ位置」で、各パリティがどのビットを見ているかを確かめてください。

シンドロームで誤りの位置が分かる理由

受け取った側は、各パリティが受け持つ位置のXORを計算し直します。誤りがなければすべて0になりますが、位置iのビットが1つ反転すると、iを2進数で書いたときに1になっている桁のパリティの検査だけが1になります。この検査結果を並べた数(シンドローム)は、そのまま誤りの位置iになります。たとえば(7,4)符号で位置5が反転すると、P1とP4の検査が1になり、シンドロームは101(2進数)= 5です。ツールで符号語のビットを1つ押して、シンドロームが押した位置と一致し、訂正後のデータがもとに戻ることを確かめてください。

パリティは何ビット必要か

rビットのパリティで表せるシンドロームは2ʳ通りで、そのうち1つは「誤りなし」に使うので、区別できる誤りの位置は2ʳ − 1個です。データがkビットなら、符号全体の k + r 個の位置を見分ける必要があるので、2ʳ ≥ k + r + 1 を満たす最小のrが必要です。4ビットのデータには3ビット、8ビットには4ビット、64ビットには7ビットのパリティが要ります。データが長いほど、全体に占めるパリティの割合(冗長度)は小さくなり、符号化率は(7,4)の約57%から、64ビットでは約90%に上がります。

SECDED: 2ビットの誤りを見分ける

普通のハミング符号は1ビットの誤りを訂正できますが、2ビットが反転すると、シンドロームが関係のない位置を指し、間違った訂正(誤訂正)をしてしまいます。ツールでSECDEDを外したまま2ビットを押すと、訂正後のデータがもとと違うことが分かります。そこで、符号全体のパリティを1ビット足したのがSECDED(1ビット誤り訂正・2ビット誤り検出)です。全体のパリティが合わずにシンドロームが0でなければ1ビットの誤りとして訂正し、全体のパリティは合うのにシンドロームが0でなければ2ビットの誤りとして、訂正せずに検出だけを知らせます。64ビットのデータに7 + 1 = 8ビットを足した72ビットは、サーバー用のECCメモリで使われてきた構成です。

使われている場所と限界

ハミング符号のSECDEDは、サーバーのメインメモリ、プロセッサのキャッシュやレジスタファイル、SRAMなどで、宇宙線や放射線によるソフトエラーの対策として使われています。計算が少なく、XORの木で高速に符号化・復号できるのが利点です。一方、3ビット以上の誤りや、同じチップの多くのビットが壊れる故障には対応できないため、メモリではチップ単位の故障に耐える方式も使われ、フラッシュメモリのように誤りの多い記憶媒体では、BCH符号やLDPC符号のような訂正能力の高い符号が使われます。誤りを見つけるだけでよい通信では、CRCがよく使われます。

計算機算術の問題を解く

メモリで使われる誤り訂正符号(ECC)の働きとして正しいものはどれか。

  1. Aデータを圧縮して容量を増やす
  2. Bデータに冗長なビットを付け加え、ビットの誤りを検出・訂正する
  3. Cデータを暗号化する
答えと解説を見る

正解:B. データに冗長なビットを付け加え、ビットの誤りを検出・訂正する

ECCは、データにチェック用のビットを付け加え、読み出し時に誤りを検出・訂正する仕組みです。DDR4までのサーバー用メモリでは64ビットに8ビットを加え、1ビットの誤りを訂正し2ビットの誤りを検出する(SECDED)方式が基本です(DDR5のモジュールでは32ビットのサブチャネルごとに8ビットを加えます)。さらに高信頼のサーバーでは、チップ1個がまるごと故障しても救えるChipkillなどもあります。DDR5ではチップ内部にもECCが組み込まれました。

7ビットのデータ 1011001 に偶数パリティのビットを付けるとき、パリティビットの値はどれか。

  1. A1
  2. B0
  3. Cデータによらず常に1
答えと解説を見る

正解:B. 0

偶数パリティでは、パリティビットを含めた1の数が偶数になるようにします。1011001には1が4個あり、すでに偶数なのでパリティビットは0です。受信側で1の数が奇数なら1ビットの誤りを検出できますが、2ビット同時の誤りは検出できず、どのビットが誤ったかもわかりません。訂正まで必要なメモリでは、複数のパリティを組み合わせたECC(ハミング符号など)が使われます。

よくある質問

(7,4)ハミング符号とは何ですか?

4ビットのデータに3ビットのパリティを足して、7ビットにする最も小さな実用的なハミング符号です。7つの位置すべてを3ビットのシンドロームで区別できるので、どの1ビットの誤りも訂正できます。このツールでデータのビット数を4にすると確かめられます。

2ビットの誤りがあるとどうなりますか?

普通のハミング符号では、シンドロームが別の位置を指すため、正しいビットを反転させてしまう誤訂正が起こります。SECDEDでは全体のパリティを足しているので、2ビットの誤りを見分けて、訂正せずに検出だけを知らせます。

パリティビットとハミング符号の違いは何ですか?

1ビットのパリティは、奇数個のビットが反転したことは分かりますが、どのビットかは分かりません。ハミング符号は、受け持つ位置が少しずつ違う複数のパリティを組み合わせることで、誤りの位置まで分かり、訂正できます。

ハミング符号とCRCの違いは何ですか?

ハミング符号は誤りの位置を求めて訂正するための符号で、主にメモリで使われます。CRCは誤りがあるかどうかを高い確率で見つけるための符号で、訂正はせず、通信では見つけたら再送します。どちらもXORを使う線形の符号です。

位置0のビットは何ですか?

SECDEDのときに足す、符号全体のパリティ(P0)です。ほかのすべてのビットとのXORが0になるように決めます。このビット自身が反転したときは、シンドロームは0のまま全体のパリティだけが合わなくなるので、P0の誤りとして訂正します。

関連する用語

ECC(誤り訂正符号) ソフトエラー CRC(巡回冗長検査)

関連する計算ツール

半導体・電子回路・情報の計算ツール →