NANDでALUを実装

2018-10-13

コンピュータシステムの理論と実装という、NANDゲートだけを使ってテトリスを実装するという本があって、それに習ってALU(の8ビット版)を実装してみた。

SimcirJSというJavaScript上で回路を操作できるライブラリを使っている。 「ALU8」というブロックがそれで、ダブルクリックで内容が見れる。 展開していくと最終的にNANDだけから組み上げられているのがわかる。

このALU(Arithmetic Logic Unit、算術論理演算装置)にいろいろ機能があって、2つの8ビット数値入力X, Y以外にいくつかの入力で演算を切り替えることができる:

zx nx zy ny f no out
1 0 1 0 1 0 0
1 1 1 1 1 1 1
1 1 1 0 1 0 -1
0 0 1 1 0 0 x
1 1 0 0 0 0 y
0 0 1 1 0 1 !x
1 1 0 0 0 1 !y
0 0 1 1 1 1 -x
1 1 0 0 1 1 -y
0 1 1 1 1 1 x+1
1 1 0 1 1 1 y+1
0 0 1 1 1 0 x-1
1 1 0 0 1 0 y-1
0 0 0 0 1 0 x+y
0 1 0 0 1 1 x-y
0 0 0 1 1 1 y-x
0 0 0 0 0 0 x&y
0 1 0 1 0 1 x|y
  • zx, zy: xまたはyを0にする
  • nx, ny: xまたはyを反転する
  • f: 1なら加算、0なら&
  • no: 出力を反転する

実装は、まずNANDから基本的な論理ゲートNOT, AND, OR, XORを作り、半加算器全加算器を作る。 あとセレクタ(マルチプレクサ)を作る。 あとはそれを8ビット単位で扱うゲートを作って組み上げていく。 SimcirJSにはBusIn, BusOutという複数の結線を扱う方法があるので、それを使うと少しすっきりする。

ALUは組み合わせ回路(入力のみから出力が決まる)なので、結線は大変だけど内容はそんなに複雑ではなかった。 しかし実際のところNANDだけであらゆる回路を構成できると理屈としてわかっていても、実際に動いているのを見ると結構感動する。