今回も「CPUの創りかた」に沿って進めます。
で、これが「オリジナルCPU試作2号機」です!
1号機と違うのは主に黄色く色を付けた部分ですね。 小さくてちょっと見にくいですが、 not リレーで反転しています。
これで、 NOT A
ができる 1bit CPU ができました。
演算装置部分の動作が
def process(input) ! input end
になった形ですね。
動かすと、最初は発振します。スイッチを適当にガチャガチャと切り替えて発振を止めます(前回書いてませんでしたが、1号機も同じです)。
クロック入力(左下)が L になっている場合は、たとえば下記の右上の方の赤い矢印で示したスイッチを手動で切り替えると発振が止まります(止まるまでスイッチ切り替えを繰り返します)。
発振を止めたら、クロックを切り替えて確認します。
クロック入力が H になったタイミングでレジスタの状態(右上のランプに注目)が切り替わっています。
また、クロックの1周期ごとにレジスタの状態の反転が繰り返されます。
さて、1号機と2号機はこのようなものでした。
- 1号機:
MOV A, A
だけを延々と繰り返す - 2号機:
NOT A
だけを延々と繰り返す
それぞれ、ただ1つの命令しか実行できない、単一命令専用の回路でした。 1個だけだと、命令といってもあってないようなものですね。
そこで、これら2つを組み合わせて、どちらの命令を実行するかをスイッチで切り替えられるようにしたものが3号機です(繰り返しますが「CPUの創りかた」に沿って進めています)。
次のコードのようなイメージです。
def process(select, input) if select == :H input else # :L ! input end end
命令を切り替えるためのしくみを右側に追加しました。
見にくいので追加部分だけ抜き出してみます。
後ろ(右側)にある OR は2系統に別れた回路を1本にまとめるためのもので、 前(左側)の部分は「切り替え器と門番」の組み合わせのバリエーションですね。
Dフリップフロップのときは「両方とも通すか、または両方とも通さない」という動きをする門番でしたが、今回は「片方だけ通す門番」となっているところが違います。
これで、「CPUの創りかた」 181ページの「オリジナルCPU試作3号機(エレキ式)」 ができました。
動かしましょう。 2号機と同じように発振を止めてから操作します。
中央部分でマウスカーソルをくるくる動かしているのが操作開始の合図です。
何をやっているかというと、次の5つの命令を順番に実行しています。
MOV A, A # L を保持(右上のランプに着目、以下同じ) MOV A, A # L を保持 NOT A # H になる MOV A, A # H を保持 MOV A, A # H を保持
操作と合わせてもうちょっと詳しく書くとこう。
# 開始時点では # クロック == L # 命令選択 == H MOV A, A # クロックを H に切り替え # クロックを L に切り替え MOV A, A # クロックを H に切り替え # クロックを L に切り替え NOT A # 命令選択を L に切り替え # クロックを H に切り替え # クロックを L に切り替え MOV A, A # 命令選択を H に戻す # クロックを H に切り替え # クロックを L に切り替え MOV A, A # クロックを H に切り替え # クロックを L に切り替え
Dフリップフロップのときの水門と運河のたとえで書いたように 「午後(クロックが H になっている間)はやることがない」ので、クロックを H にして出力に反映したら、 すぐクロックを L に戻すように操作しています。 「クロックを H にする」「L に戻す」を1セットにしている感じですね。
「午後のフェーズ」で命令を切り替えてはいけない訳ではないと思いますが、 ひとまず「午後は何もしない」というルールにした方が迷わずに操作できてよいかなと。
クロックも命令の切り替えも全部手動で、こういうのやってみるとだんだん CPU の気持ちが分かってくるような気がします。 実際に自分の手で動かすと得られる感触が違うので、これはやっぱりやってみて良かったですね。
さて、改めて考えてみると、3号機の時点で
- 演算の結果をレジスタに記憶させる
- 演算を行う
- 命令(演算の種類)を切り替える
ということができるようになっています。 この3つを行える最低限の回路が3号機だ、と見てもいいかもしれません。
なるほど、CPU の説明に出てくる命令デコーダや ALU などはありませんが、たしかに CPU っぽくなってきた気がしますね!
はい。
というわけで、ここまで作ってだいぶ気が済んだので、 いったんここで区切りとします。
これ以上回路が大きくなると LibreOffice Draw での作図も辛くなってきます。 論理回路にもある程度親しむことができてきましたので、 もしここから先を作るとしたら既存の論理回路シミュレータを使って進めるのが良いように思います。
いやーしかし、「(論理)回路シミュレータって自分でも作れるの??」 というところから始まって、なんとこんなところまで辿り着けてしまいましたね。
満足!
以下のリンク先で実際に動かせます。
https://sonota88.github.io/kairo-gokko/pages/35/index.html
※ 音量小さめにしていますが音が出ます。
※ スマホでは全体が表示できないかもしれません。PCブラウザなどで見てください。