コンピュータシステムの理論と実装 1..2章

前回記事から「コンピュータシステムの理論と実装」を読み始めて、現在2章のブール算術まで読み終わった&専用HDLで実装が終わりました。

第1章はNAND回路からAND、OR、NOT、XORの基本ゲートと、マルチプレクサ、多入力の基本ゲートなどを実装します。ここまでは簡単な回路なので、効率はさておき特に問題なく実装できました。

問題無くと言っても、nand2tetrisのプロジェクトについてきたテストが通っただけなので実用上は問題ありそうですが…今回は動けばいいという方針で()

第2章では加算器やALU(算術論理演算子)(Arithmetic Logic Unit)の解説と実装です。ALUを略さない呼び方はさっき調べました。

でそのALUを実装するときハマったので書き記しておきます。

この本のALUのoutバス(16bit)は、最後にoutをゼロチェックと負チェック(?)する仕様になっています。そこではじめに

...
OUT out[16],...

Mux16(a=fOut, b=notFOut, sel=no, out=out);
Or8Way(in=out[0..7], out=...);

というようにチェック用にoutを使ったのですが、出力ピンであるoutを使うなと怒られてしまいました。

安直にoutピン以外に繋げば…と思いましたが

Mux16(a=fOut, b=notFOut, sel=no, out=out);
Mux16(a=fOut, b=notFOut, sel=no, out=cc);
Or8Way(in=cc[0..7], out=...);

内部のサブバスをそうやって使うな💢と言われました…。

そこで次のようにすると

Mux16(a=fOut, b=notFOut, sel=no, out[0..7]=czr1, out[8..15]=czr2, out[15]=cng, out=out);

エラーが解消されました。

HDLのそれぞれの名前はあくまでピンなので、ピン同士の接続を表現する必要がありました。 いつもの癖で高級言語の変数のような書き方をしたのがまずかったようです。

論理回路あたりの低レイヤーな部分を触ったのは高校ぶりなんですが、なかなか楽しいです。

次は第3章の順序回路です。