はじめに
本記事は「コンピュータシステムの理論と実装」の勉強会の記録第3回となります。
前回ALU(算術論理演算機)の実装が終わり、今回はメモリを組み立てていくことになります。
この章が終わればハードウェアのパーツは完成です。
第5章では1〜3章のパーツを組み合わせてハードウェアは完成するようなので、非常に楽しみですね!
実装の部分についてはこれまでの記事と同様、私が詰まった部分をヒントとして残していきます。
3章の感動ポイント
記憶を維持する"メモリ"
「時間の経過によりデータを失うことなく保存でき、また引き出したい時にそのデータを引き出せる」という超便利アイテム"メモリ"が作れてしまいます。
今まで作ってきたCHIPだけでそれができてしまうのが驚きです。
1章の伏線回収
1章で「これなんで作ったの?」と疑問に思っていたCHIPを使います。
「ここで伏線回収……!」という少年マンガのような感動がある、と先輩エンジニアさんが言っていました。たしかに!
偉人の軌跡を感じるフリップフロップ回路の登場
ちなみに、Apple創業者たちを描いたマンガ「スティーブズ」の冒頭で、ウォズニアックが「♪フリップ フロップ」と歌っています。彼らもこうして(※ただし物理的に)コンピュータを作っていったのかもしれません。
3章実装のヒント
作る順序は
Bit
Register
RAM小さい順
PC
がよさそうです。
少し詰まったのはBit、RAM8、RAM16KでしたがALUやMUXなどに比べると簡単かもしれません。
多bitピンを分割するテクニック
前章のヒント内で紹介しましたが、見逃した方のために。(実装例は正解ではありません)
CHIP RAM16K {
IN in[16], load, address[14];
OUT out[16];
PARTS:
// Put your code here:
// address[3..5]のように書くことができます。
RAM8(in=in, load=address[0], address=address[3..5], out=out);
}
outピンを2回以上出力するテクニック
「最後の出力を入力ピンに入れたいのに、outを他のピンに代入できない」という問題が起きました。
こんな記載方法があります。
Nand(a=a, b=b, out=out1, out=out);
各CHIPのヒント
※以下に答えは載せていません。あくまでヒントです。
Bit
"逆"になってませんか?
RAM8
「なんでこれ作ったんだろう?」と思っていたCHIPがここで使われます。
使うパーツはわかったものの、そのCHIPへの入力に何を使えばいいか考えるのが複雑でした。落ち着いて整理しましょう。
また、outピンは一度しか使えません。
8本ありそうな出力を1本にまとめるCHIPが必要です。
RAM16K
ワンパターンだと思って実装したらエラーが出て少し頭を捻りました。
8→64→512→4k と 4k→16k 規則が違いますね。
PC
また、3.2.4の仕様の部分を見てください。
inc,load,resetの中で、他の2つによらず結果を出せる"強力な"セレクターはどれでしょう。
さらに残った2つの中で、もう一方によらず結果を出す"強力な"セレクターは?
"強力"なほど、先に書くべきですか?後に書くべきですか?
3章を読み終えた私の感想
PCを最初に発明した人は本当に間違いなく天才ですね。
NAND回路から始まり、NANDだけで種々の回路を作り、ALUのような複雑な回路を作りました。
そしてメモリというデータを記憶するパーツを作りました。
インターネットやPCに関する知識が広まった今だからこそ容易に思いつく構造を、何十年も前に考案し、今我々が使っているシミュレータとテストが存在しない中、物理的に作りあげています。
私たちはDFFを実装済みCHIPとして使わせてもらえますが、当時の人はDFFすら自分で作り上げなければならなかったはずです。
そんな偉人のPC開発の軌跡を追うのは、ロマンを追いかけているようで心が躍ります。
4章以降も楽しみです。