ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

符号付き2進数のバリエーション

ディジタル数値演算回路の実用設計に綺麗にまとまっていたので、表をそのまま使わさせていただきます。いろんな表記の中から好きな物を選べるのが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でステートマシーンの符号化として使った事がありますが、最近の合成ツールは上手くやってくれるので手書きで符号化する機会は少ないです。