コンピュータシステムの理論と実装という、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だけであらゆる回路を構成できると理屈としてわかっていても、実際に動いているのを見ると結構感動する。