next up previous contents index
Next: 制御コード Up: データ処理部 Previous: シフタ   Contents   Index

算術論理回路ALU

算術論理回路(arithmetic logic unit)またはALUはもっとも設計の難しい回路である。 まず,キャリーのある加算ができなければならない。 補数も作られなければならない。 ビットごとのANDやORといったビット演算もできるとありがたい。 数値の比較もできるとよい。 ということで,単なる加算器の集合よりも,高機能の演算ができる回路を考えよう。

しかし,いきなり高機能の回路と言われても考えづらいと思われるので, まずキャリーに着目して,加算器の改良から取り掛かろう。 加算器の問題は何桁にも及ぶキャリーの伝播時間が馬鹿にならないことである。 同期式回路の場合,すべての論理処理が終了するまで, 次のクロックパルスを送れないから, 実はこのキャリー伝播時間がコンピュータ全体の速度を決めてしまうのである。

比較的簡単な回路で,かつ,比較的速い動作をするキャリーの計算法として マンチェスタキャリーチェーン(Manchester carry chain)という方式が提案されている。 これは,図 4.4に示した全加算器の真理値表を見てみると, ほとんどの欄で$C_o$$C_i$が等しいという事実を利用した方式である。 この結果,多くの場合,各桁ではキャリー$C_o$を改めて計算することなく, $C_i$をそのまま後段に伝播すればよいことになる。

式できちんと確認しておこう。 まず,下からのキャリーのない場合には次式が成立する。

  $\textstyle S$ $\displaystyle =A\oplus B$ (9.1)
  $\textstyle C_o$ $\displaystyle =A\cdot B$ (9.2)

しかし一般には下の桁からのキャリー$C_i$があるので,次式が成立する。
  $\textstyle P$ $\displaystyle =A\oplus B$ (9.3)
  $\textstyle S$ $\displaystyle =P\oplus C_i$ (9.4)
  $\textstyle C_o$ $\displaystyle =A\cdot B+(A+B)\cdot C_i$  
    $\displaystyle =\overline P\cdot A\cdot B+P\cdot C_i$ (9.5)

上の2式は,$A$$B$の算術和1桁目をとりあえず$P$とし, それにさらに$C_i$を加えたものを$S$とし直すというので直感的である。 キャリーの式は,下からのキャリー$C_i$が1のときは, $A$または$B$のいずれか,または双方が1ならば上へのキャリーが1となり, また$C_i$が0でも,$A$および$B$が1ならば1となることを示している。 さらに,$A+B$$P=A\oplus B$に置き換え, 前半に$\overline P$を付けても, 全体の結果が変わらないことを示している(各自で確認せよ)。 さらに,前の項は $\overline P(A+B)$としても構わない。

$P=1$であるとキャリーはそのまま上に伝えてよいことになるので, $P$を作り出す機能は伝達子(propagator)Pと呼ばれる。 伝達がない場合には, $A\cdot B$に基づき新たなキャリーを発生することになるが, この機能を生成子(generator)Gと呼ぶ。 さらに,この否定を消滅子(killer)Kと呼ぶ。 消滅子はプリチャージ論理の際,使われる。 $S$$P$$C_i$のEORであるが,この論理を行う部分をRと記載しよう。

図 9.5に1bit分のALUの概念図を示すが, ここでK,P,Rを固定の論理を扱うブロックとはしないで, 図 5.12に示した任意の論理関数を実現できる回路に置き換えると, 極めてたくさんの演算を行うことができるようになるのである。

Figure 9.5: ALU(シフタから入る入力にはシフト結果とシフト量の選択が可。 KとPの出力には $\overline {\phi _1}$とのANDが入る。)
\begin{figure}\centering
%
\unitlength 1pt
\begin{picture}(304,104)
\put(0,0){\...
...akebox(0,0)[lb]{{\footnotesize\rm$\overline{C_i}$}}}
\end{picture}
\end{figure}

$C_o$$\phi _1$でのプリチャージ論理により決定される。 $\phi _2$になって初めて,Kによりその電位を下げるかどうかが決まる。 これに対応して,KとPの機能ブロックの出力には $\overline {\phi _1}$とのANDゲートを置くことにより, このプリチャージ論理との整合性をとっている。

これらの機能ブロックに送る信号$K$$P$$R$を いろいろ変化させたときに実現できる機能の例を,図 9.6に示す。 先に第8章プログラムの図 8.3で示した 機械語の命令セットの演算命令と比較し,やや多めの機能が示されている。 例えば,$C_{in}$をALU全体に対するキャリーインとして,$A+B+C_{in}$$A-B-C_{in}$などの加減算は,データ幅以上の加減算の際,必要な命令である。

Figure 9.6: ALUの演算命令の例(算術記号と区別するためANDは$\cap $, ORは$\cup $と記した)
\begin{figure}\small {
\begin{displaymath}\begin{array}{\vert l\vert lll\vert l...
...&0110: P\oplus C_i&FB \\
\hline
\end{array}\end{displaymath} }
\end{figure}

ALUは全体として,その動作結果に応じたフラグ(flag)を出す。 これらフラグは,オーバフロー,ALU全体の$C_{out}$(キャリーアウト), シフトの際の$S_{out}$(シフト溢れ),減算の結果の正負などであるが, 図 9.7に示すフラグレジスタ(flag register)と呼ばれる 16bitの一時メモリーへ蓄積され, Aバスを経由して,他のレジスタやALUなどで利用することができる。 これらのうち,4から6bit目は$A-B$$B-A$の作業の結果,決定される。

Figure 9.7: フラグレジスタの内容(10から14bitは未定義)
\begin{figure}\centering
\begin{tabular}{\vert r\vert l\vert}
\hline
bit & フ...
... &$C_{out}$\ \\
0 &前回のフラグビット \\
\hline
\end{tabular}
\end{figure}

フラグレジスタのMSBには, フラグビット(flag bit)と呼ばれる特別の役割が与えられている。 この特定のビットは,上記0から7bit目までに記載されたフラグのうち, いずれかが選ばれ,そのコピーが記録される。 どのビットが選ばれるかは,制御部から与えられる当該演算の指令の中に記載される。 このフラグビットは,条件分岐の際利用されたり, これから述べるALUの条件付演算命令に利用される。 図 9.6中, ALU全体へのキャリーイン$C_{in}$の欄に書かれた$FB$とは, このフラグビットを意味する。 フラグレジスタの0bit目には,1回前のフラグビットも蓄積されるため, これをうまく利用すれば,かなり前のALUの状態を利用することも可能である。

次に条件付演算命令について述べよう。 乗除算は,複数のステップによって達成されるが, ステップによっては,MSBなどの値によって,実行する計算が異なる。 これを,通常のプログラムの条件分岐命令によって実行すると, かなりの時間がかかる。 そのため,前命令でフラグレジスタのフラグビットにMSBなどの値を記憶し, 次命令でその値により実行する機能を変えるという手法を使うことにより, 高速化が果たせる。 もちろん,すべての条件分岐をこのようにするのは, 限りなく機能が増えるので得策ではないが, 乗除算のように比較的よく使われ,かつ次命令が定まったものに適用するのは, 極めて有効である。 こういう形で拡張されたALUの機能の一例を図 9.8に示す。

Figure 9.8: ALUの条件付演算命令の例 (フラグビット$FB$の値によって動作を変える。乗算,除算の途中の計算は, フラグの一つであるMSBによって機能を変える必要のあるものがある)
\begin{figure}\begin{displaymath}\begin{array}{\vert l\vert llll\vert ll\vert}
...
... &0110 &0110 & A+B &0 &1 \\
\hline
\end{array}\end{displaymath}
\end{figure}

ここまでの説明でシフタとALUはかなり深い関係にあることを予想できたかもしれない。 実際,シフタの主なる活躍場所は乗除算である。 シフタも入力側または出力側のいずれかにレジスタが必要であるが, ここではシフタの出力側に置き,かつ関連の深いALUの入力レジスタと兼用している。 シフタの出力が必要な場合も,それを直接シフタからは出さないで, ALUを素通りさせて利用するようになっている。 この際,ALUの動作は$\phi _2$になされるから,時間ロスは発生しない。

問題2
シフタのデータをALUを素通りにして利用したい。 $K$$P$$R$をどのようにしたらよいか。
問題3
各ビットごとにEQ=NOT(EOR)を計算したい。 $K$$P$$R$をどのようにしたらよいか。


next up previous contents index
Next: 制御コード Up: データ処理部 Previous: シフタ   Contents   Index
Yoichi OKABE 2008-03-29