ディジタル数値演算回路の実用設計に綺麗にまとまっていたので、表をそのまま使わさせていただきます。いろんな表記の中から好きな物を選べるのがVerilogの楽しいところでもあります。
10進 | ストレートバイナリ | 符号+絶対値 | 1の補数 | 2の補数 | オフセットバイナリ | グレイコード | |
---|---|---|---|---|---|---|---|
15 | 01111 | 01111 | 01111 | 01111 | 11111 | 1000 | |
14 | 01110 | 01110 | 01110 | 01110 | 11110 | 1001 | |
13 | 01101 | 01101 | 01101 | 01101 | 11101 | 1011 | |
12 | 01100 | 01100 | 01100 | 01100 | 11100 | 1010 | |
11 | 01011 | 01011 | 01011 | 01011 | 11011 | 1110 | |
10 | 01010 | 01010 | 01010 | 01010 | 11010 | 1111 | |
9 | 01001 | 01001 | 01001 | 01001 | 11001 | 1101 | |
8 | 01000 | 01000 | 01000 | 01000 | 11000 | 1100 | |
7 | 00111 | 00111 | 00111 | 00111 | 10111 | 0100 | |
6 | 00110 | 00110 | 00110 | 00110 | 10110 | 0101 | |
5 | 00101 | 00101 | 00101 | 00101 | 10101 | 0111 | |
4 | 00100 | 00100 | 00100 | 00100 | 10100 | 0110 | |
3 | 00011 | 00011 | 00011 | 00011 | 10011 | 0010 | |
2 | 00010 | 00010 | 00010 | 00010 | 10010 | 0011 | |
1 | 00001 | 00001 | 00001 | 00001 | 10001 | 0001 | |
0 | 00000 | 00000 | 00000 | 00000 | 10000 | 0000 | |
-0 | - | 10000 | 11111 | - | - | - | |
-1 | - | 10001 | 11110 | 11111 | 01111 | - | |
-2 | - | 10010 | 11101 | 11110 | 01110 | - | |
-3 | - | 10011 | 11100 | 11101 | 01101 | - | |
-4 | - | 10100 | 11011 | 11100 | 01100 | - | |
-5 | - | 10101 | 11010 | 11011 | 01011 | - | |
-6 | - | 10110 | 11001 | 11010 | 01010 | - | |
-7 | - | 10111 | 11000 | 11001 | 01001 | - | |
-8 | - | 11000 | 10111 | 11000 | 01000 | - | |
-9 | - | 11001 | 10110 | 10111 | 00111 | - | |
-10 | - | 11010 | 10101 | 10110 | 00110 | - | |
-11 | - | 11011 | 10100 | 10101 | 00101 | - | |
-12 | - | 11100 | 10011 | 10100 | 00100 | - | |
-13 | - | 11101 | 10010 | 10011 | 00011 | - | |
-14 | - | 11110 | 10001 | 10010 | 00010 | - | |
-15 | - | 11111 | 10000 | 10001 | 00001 | - | |
-16 | - | - | - | 10000 | 00000 | - |
ストレートバイナリ
普通の2進数。いわいるunsingedにデータを扱います。符号ビットが必要ないので、同じリソースであれば一桁多く数を扱えるのがメリットです。
符号+絶対値
最上位ビットを符号ビットとして、残りの2進数が絶対値を示します。2の補数表現を使った場合符号反転に加算器が必要なので、状況によってはこちらの方が回路が小さくなる場合がある。符号ビットと絶対値で分けて計算すれば、数値計算自体は簡単になります。ダンプしたときの視認性も高いのもポイントです。
デメリットは、本に書いてあるとおり0が2種類出てくることですが、計算結果が0なら符号ビットを0にする回路が許容出来るのであれば大きなデメリットにはなりません。
1の補数
あまり使われません。
2の補数
一般的なプロセッサを使う場合、負の数に2の補数を使うことになります。符号によらずALUを共通化できるため、一般的に浸透しています。見た目では負の数がわかりにくいところがデメリットです。
オフセットバイナリ
これは最小値を0としてオフセット表現をしています。AD/DAとデータのやりとりをする場合は、この形が多くなります。演算自体はそのまま出来ないので、若干工夫が必要です。見た目で大小関係がわかりやすい事と、AD/DAで言えば最大最小間のどのあたりになるのかが直感的にわかるのがメリットです。
グレイコード (2008/11/5追加)
詳細はhttp://ja.wikipedia.org/wiki/グレイコードを見てもらうとして、一つ隣の値に移るだけなら必ず1bitしか変化しません。加算などの演算するためには、一度別の形に変換する必要があります。いわいるオーバーフロー的な動き(1000→0000)でも1ビットしか変化しないため、ロータリエンコーダやカウンターそのものといった、値がループする物に特に有効です。Verilogでステートマシーンの符号化として使った事がありますが、最近の合成ツールは上手くやってくれるので手書きで符号化する機会は少ないです。