Nand2Tetrisもくもく昨日の続き。 ついに値を記憶するRAMが出来上がります。ALUとメモリがあれば、これで次の何かが作れそうですね。
コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
3章 順序回路
フリップフロップというチップがいきなり出てきて、これは使って良いものとして話が進みます。Nandがあればできるらしいですが、詳細は割愛されていました。
nand2tetris-memo/03 at master ・ hirak/nand2tetris-memo
HDLのメモ
定数について。入力として、定数1や定数0を使うことができました。それぞれtrue
とfalse
と書きます。1/0では認識してくれませんでした。。
And(a=true, b=false, out=out);
true/falseは特殊な挙動として、バス(複数ビット)に対しても代入できるようです。この場合、バスの全てのビットがtrueまたはfalseにセットされます。
And16(a=true, b=false, out=out);
これを使うと、記法としては面倒ですが任意のビットパターン定数を書くことができます。
//定数1と定数-1の足し算を表現。outは0が並ぶはず。
Add16(a[1..15]=false, a[0]=true, b=true, out=out);
プログラムカウンタ
時間をずらしてoutputがinputに戻ってゆくような書き方をするので、「あれ、これ動くんだろうか…」みたいな感じで悩みました。
ひとまずこんな感じでしょうか。Mux16を3つ使っているところは、Mux4Way16一個にできそうな気もしたのですが、Mux16で素直に書いたほうがわかりやすいですね。
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/03/a/PC.hdl
/**
* A 16-bit counter with load and reset control bits.
* if (reset[t] == 1) out[t+1] = 0
* else if (load[t] == 1) out[t+1] = in[t]
* else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition)
* else out[t+1] = out[t]
*/
CHIP PC {
IN in[16],load,inc,reset;
OUT out[16];
PARTS:
Register(in=regin, load=regload, out=regout, out=out);
Inc16(in=regout, out=incremented);
// make register-in
Mux16(a=tmp2, b=false, sel=reset, out=regin);
Mux16(a=tmp1, b=in, sel=load, out=tmp2);
Mux16(a=false, b=incremented, sel=inc, out=tmp1);
// make register-load
Or(a=reset, b=inc, out=resetorinc);
Or(a=load, b=resetorinc, out=regload);
}
次の4章もガンバルゾー!