ひとりNand2Tetris(3) ーメモリを手に入れた

Posted by Hiraku on 2015-09-22

Nand2Tetrisもくもく昨日の続き。 ついに値を記憶するRAMが出来上がります。ALUとメモリがあれば、これで次の何かが作れそうですね。


コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

3章 順序回路

フリップフロップというチップがいきなり出てきて、これは使って良いものとして話が進みます。Nandがあればできるらしいですが、詳細は割愛されていました。

nand2tetris-memo/03 at master ・ hirak/nand2tetris-memo

HDLのメモ

定数について。入力として、定数1や定数0を使うことができました。それぞれtruefalseと書きます。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章もガンバルゾー!

etcの最新記事