- 公開日:2020年07月15日
- | 更新日:2024年05月31日
パリティチェック・チェックサムとは? 誤り検出・訂正基礎講座 第1回
- ライター:Shigetsuna Sasaki
- その他
誤り検出と誤り訂正
デジタルデータはノイズなどの影響により誤ったデータを送受信してしまうことがあります。メモリなどの場合、ノイズなどの影響により誤ったデータが書き込まれてしまうことがあります。この誤ったデータを検出、訂正するために、デジタルデータの送受信や、メモリへの書き込みの際には、誤り検出・訂正符号というものを用います。この誤り検出・訂正符号には様々なものがありますので、数回の記事に分けて、この誤り検出・訂正の基本的内容と、代表的な使用例(パリティ・チェック、チェックサム、CRC、ハミング符号、BCH符号など)について記載していきたい思います。今回の記事ではこれらの代表的な符号にはどういうものがあるのかを説明します。また、それらの中で最もベーシックなパリティ・チェック及びチェックサムについて、その仕組みと使用方法について解説します。
誤り検出・訂正符号とは
メモリなどのデジタルデータの誤りを検出・訂正するための追加のデータのことで、図のようにデータに併せて用意されます。
この符号を用いて、受信機側は誤りを検出したり、訂正したりすることが可能となります。
この符号はデータの誤り検出をするためのもの(データの訂正はできない)、または誤り訂正をすることが可能なものがあります。
代表的な誤り検出
- パリティ・チェック : シリアル通信などでよく利用されます
- チェックサム : メモリに書き込んだデータのチェックするときなどに利用されます
- CRC(巡回冗長検査) : こちらもメモリに書き込んだデータのチェックをするときになどに利用されます
代表的な誤り訂正
- ハミング符号
- 水平垂直パリティ符号
- BCH符号
- リードソロモン符号
基本的に誤り検出符号よりも、誤り訂正符号のほうが、符号のサイズ(Bit数)は大きくなります。
(検出をしてさらに訂正も可能なので符号サイズが大きくなるのは仕方がないですね。)
パリティ・チェック
シリアル通信などでよく使われるパリティ・チェックについて解説します。パリティ・チェックはパリティ符号というものを用いてデータの誤り検出を行います。 まずは下の例を見てみましょう。
送信機は送信データの1の数を数えて、1の数が偶数ならパリティビットを0、1の数が奇数ならパリティビットを1にセットします。これを偶数パリティ(even parity)と呼びます。
これとは逆に、送信機が送信データの1の数を数えて、1の数が偶数ならパリティビットを1、1の数が奇数ならパリティビットを0にセットするものを奇数パリティ(odd parity)と呼びます。パリティ・チェックを行う場合には、送信機側と受信機側で、偶数パリティでチェックを行うのか、奇数パリティで行うのか予め決めておく必要があります。
次に、下の通信例を見てみましょう。送信機側は送信データにパリティビット(偶数パリティ)を付与して送信します。受信機側はそのデータを受信したときに、外部ノイズなどの影響で、データの一部のビットが反転してしまいました。
このとき、受信機側がデータの1の数をチェックすると、受信データの1の数は奇数(3)になっています。つまりパリティビットが1になっていればこのデータが正しいことになりますが、実際の値は0なので、このデータは正しくないデータであると認識できます。
このようにパリティ・チェックは1bitをデータに追加するだけで使えますので、非常に簡単で便利ですが、デメリットもあります。既にお気づきだと思いますが、データが2bit以上変化してしまい、たまたま送信と受信のデータの1の数が同じになってしまった場合などには誤りを検出できません。
チェックサム
メモリに書き込まれた値のチェックなどによく利用されるチェックサムについて解説します。チェックサムは名前の通り、Check(チェック)、Sum(和)になりますので、あるデータの和、つまり足し合わせて得られたデータをチェックして、データの誤りを検出するものです。チェックサムの計算には特別な決まりはなく、様々な方法で計算されます。
[Memory内のデータ]
0xC8 | 0x7D | 0x2 | 0xDE | 0x3B | 0xBE | 0xC7 | 0xF2 | 0xFF | 0xBC |
例えば「上のデータを足し合わせた下位8bitをチェックサムとする」と決めたとします。
そうすると、全て足し合わせたものは、以下の計算の通り0x692となります。
0xC8 + 0x7D + 0x2 + 0xDE + 0x3B + 0xBE + 0xC7 + 0xF2 + 0xFF + 0xBC = 0x692
このデータの下位8bitをチェックサムとするので、この場合は0x92がチェックサムとなります。
今回は「データを足し合わせた下位8bitをチェックサムとする」と決めましたが、「データを足し合わせた結果をビット反転させた結果をチェックサムとする」でも良いですし、任意の方法で計算してチェックすることができます。
計算方法は任意の方法ですが、基本的にチェックサムの計算は上の例のようにシンプルなので、プログラムで実装する場合も誰でも簡単に実装することができます。
もし、フラッシュメモリの書き込みツールや、メモリコントローラでチェックサムを使ってデータの整合性を取っている場合には、その製品のマニュアルに、このチェックサムの計算方式が示されていることが多いので、使用している製品のチェックサムの中身を調べたい場合には、製品ごとに用意されているチェックサムの計算式を確認して見てください。
使用例:
- チェックサム値を計算したデータをフラッシュメモリに書き込む
- フラッシュメモリに書き込みしたデータを読み取る
- 読み取ったデータのチェックサムの計算する
- 事前に計算していたチェックサム値と比較する
さいごに
今回は誤り検出の中でもシンプルでわかりやすい、パリティ・チェックと、チェックサムについて仕組みを解説してみました。次回の記事では、ハミング符号の仕組みなどを解説したいと思います。
ルネサス製品をお探しの方はぜひメーカーページもご覧ください。