# 乗算器

## デジタル乗算器

デジタルに乗算を実行する回路で、演算装置の一種である。

デジタル乗算器を実装するには様々な技法が考えられる。 多くの技法は分割した部分の積を計算し、それを加算してまとめることで実現する。 このやり方は、小学校で習う十進整数の筆算による乗算と似ている。 しかし、乗算器ではそれを二進数で実現する。

### 符号無整数の場合の例

ここでは、例示のために8ビットの符号無整数の乗算について説明する。 乗算器の入力であるふたつの数を $a[7:0]$$b[7:0]$ とし、ビット配列とみなす。 この場合、8回の 1ビット乗算で 8つの部分積を求める。$a$の各ビットを$b$にかける。 つまり、それは $a$ のビットを取り出して、その値に応じて $00000000$$11111111$ のどちらかのビットパターンを作り、ビット演算論理積$\mbox{AND}$）を実行するのと等しい。

$\begin{cases} p_0[7:0] = a[0] \times b[7:0] = \{a[0]\}\ \mbox{AND}\ b[7:0]\\ p_1[7:0] = a[1] \times b[7:0] = \{a[1]\}\ \mbox{AND}\ b[7:0]\\ p_2[7:0] = a[2] \times b[7:0] = \{a[2]\}\ \mbox{AND}\ b[7:0]\\ p_3[7:0] = a[3] \times b[7:0] = \{a[3]\}\ \mbox{AND}\ b[7:0]\\ p_4[7:0] = a[4] \times b[7:0] = \{a[4]\}\ \mbox{AND}\ b[7:0]\\ p_5[7:0] = a[5] \times b[7:0] = \{a[5]\}\ \mbox{AND}\ b[7:0]\\ p_6[7:0] = a[6] \times b[7:0] = \{a[6]\}\ \mbox{AND}\ b[7:0]\\ p_7[7:0] = a[7] \times b[7:0] = \{a[7]\}\ \mbox{AND}\ b[7:0] \end{cases}$

 $p_0[7]$ $p_0[6]$ $p_0[5]$ $p_0[4]$ $p_0[3]$ $p_0[2]$ $p_0[1]$ $p_0[0]$ $+$ $p_1[7]$ $p_1[6]$ $p_1[5]$ $p_1[4]$ $p_1[3]$ $p_1[2]$ $p_1[1]$ $p_1[0]$ $0$ $+$ $p_2[7]$ $p_2[6]$ $p_2[5]$ $p_2[4]$ $p_2[3]$ $p_2[2]$ $p_2[1]$ $p_2[0]$ $0$ $0$ $+$ $p_3[7]$ $p_3[6]$ $p_3[5]$ $p_3[4]$ $p_3[3]$ $p_3[2]$ $p_3[1]$ $p_3[0]$ $0$ $0$ $0$ $+$ $p_4[7]$ $p_4[6]$ $p_4[5]$ $p_4[4]$ $p_4[3]$ $p_4[2]$ $p_4[1]$ $p_4[0]$ $0$ $0$ $0$ $0$ $+$ $p_5[7]$ $p_5[6]$ $p_5[5]$ $p_5[4]$ $p_5[3]$ $p_5[2]$ $p_5[1]$ $p_5[0]$ $0$ $0$ $0$ $0$ $0$ $+$ $p_6[7]$ $p_6[6]$ $p_6[5]$ $p_6[4]$ $p_6[3]$ $p_6[2]$ $p_6[1]$ $p_6[0]$ $0$ $0$ $0$ $0$ $0$ $0$ $+$ $p_7[7]$ $p_7[6]$ $p_7[5]$ $p_7[4]$ $p_7[3]$ $p_7[2]$ $p_7[1]$ $p_7[0]$ $0$ $0$ $0$ $0$ $0$ $0$ $0$ $P[15]$ $P[14]$ $P[13]$ $P[12]$ $P[11]$ $P[10]$ $P[9]$ $P[8]$ $P[7]$ $P[6]$ $P[5]$ $P[4]$ $P[3]$ $P[2]$ $P[1]$ $P[0]$

### 符号付整数の場合

$b$ が符号付整数だった場合、部分積を符号拡張した上で足し合わせる必要がある。$a$ が符号付整数だった場合、部分積の $p[7]$ を足すのではなく、それ以外の合計から引かなければならない。

 $1$ $-p_0[7]$ $+p_0[6]$ $+p_0[5]$ $+p_0[4]$ $+p_0[3]$ $+p_0[2]$ $+p_0[1]$ $+p_0[0]$ $-p_1[7]$ $+p_1[6]$ $+p_1[5]$ $+p_1[4]$ $+p_1[3]$ $+p_1[2]$ $+p_1[1]$ $+p_1[0]$ $0$ $-p_2[7]$ $+p_2[6]$ $+p_2[5]$ $+p_2[4]$ $+p_2[3]$ $+p_2[2]$ $+p_2[1]$ $+p_2[0]$ $0$ $0$ $-p_3[7]$ $+p_3[6]$ $+p_3[5]$ $+p_3[4]$ $+p_3[3]$ $+p_3[2]$ $+p_3[1]$ $+p_3[0]$ $0$ $0$ $0$ $-p_4[7]$ $+p_4[6]$ $+p_4[5]$ $+p_4[4]$ $+p_4[3]$ $+p_4[2]$ $+p_4[1]$ $+p_4[0]$ $0$ $0$ $0$ $0$ $-p_5[7]$ $+p_5[6]$ $+p_5[5]$ $+p_5[4]$ $+p_5[3]$ $+p_5[2]$ $+p_5[1]$ $+p_5[0]$ $0$ $0$ $0$ $0$ $0$ $-p_6[7]$ $+p_6[6]$ $+p_6[5]$ $+p_6[4]$ $+p_6[3]$ $+p_6[2]$ $+p_6[1]$ $+p_6[0]$ $0$ $0$ $0$ $0$ $0$ $0$ $1$ $+p_7[7]$ $-p_7[6]$ $-p_7[5]$ $-p_7[4]$ $-p_7[3]$ $-p_7[2]$ $-p_7[1]$ $-p_7[0]$ $0$ $0$ $0$ $0$ $0$ $0$ $0$ $P[15]$ $P[14]$ $P[13]$ $P[12]$ $P[11]$ $P[10]$ $P[9]$ $P[8]$ $P[7]$ $P[6]$ $P[5]$ $P[4]$ $P[3]$ $P[2]$ $P[1]$ $P[0]$

なお、乗数も被乗数も負の場合算術オーバーフローが発生するが、無視すればよい。

## アナログ乗算器

トランジスタによる乗算回路 [1]

アナログに乗算を実行する回路で、周波数帯域の変換等に用いられる。 一般的な実装方法は $AB=\mathrm{e}^{\log{}A+\log{}B}$ という等式を利用するものである[2]。 基本的な原理は次のものである。

1. バイポーラトランジスタ$V_{BE}\propto\log{}I_C$ となることを利用して、入力信号の対数を得る。
2. オペアンプで加算する。
3. 1と同様に $I_C\propto\mbox{e}^{V_{BE}}$ を利用して2.で得た和の指数を取る(これが2数の積)。

（ただし、アナログ回路なので実際には各ステップは、ほぼ瞬時に進む。）

2の部分を減算に変更すれば、同様の原理で除算も可能。

## 参照

 [ヘルプ]
1. ^ 小島 高田, p. 154.
2. ^ 柴田 2004, p. 223.