LoginSignup
14
5

More than 3 years have passed since last update.

Nand2Tetris(1)

Last updated at Posted at 2019-04-03

自己紹介

こんにちは。taka2です。初投稿です。プログラミング絶賛修行中のものです。今回、本屋でこの本を見かけて、立ち読みしてうおおおとなり、10分後にはすでに買っていたので、備忘録として書こうと思いました。

内容

今回はNand2Tetrisの第1章の備忘録です。Nandからいろいろな論理回路を組み立てていきます。準備の部分は本書にかかれているとおりです。

Not

Notゲートは簡単です。

Not.hdl
CHIP Not {
    IN in;
    OUT out;

    PARTS:
    Nand(a=in, b=in, out=out);
}

これを本書で提供されているハードウェアシュミレーターでテストします。Screenshot from 2019-04-03 23-21-30.png
このシュミレーターの上のバーの上のようなアイコンを押してNot.tstを選択し、読み込まれたらバーの>>を押して、Screenshot from 2019-04-03 23-24-04.png
このように成功すればOKです。
初め、コマンドプロンプトの方から、

~/nand2tetris/tools/HardwareSimulator.sh Not.hdl

と入力して実行しようとしたがそうすると自分の環境ではエラーが出てしまうようです。(ubuntu1604)
上記の方法なら問題なくできたので、その方法でやっていきました。

And

先ほどと同様に実装していきます。このあとも同じように。

And.hdl
CHIP And {
    IN a, b;
    OUT out;

    PARTS:
    Nand(a=a, b=b, out=Nandout);
    Not(in=Nandout, out=out);
}

Or

Or.hdl
CHIP Or {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a, out=nota);
    Not(in=b, out=notb);
    Nand(a=nota, b=notb, out=out);
}

Xor

Xor.hdl
CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Nand(a=a, b=b, out=w1);
    Nand(a=a, b=w1, out=w2);
    Nand(a=w1, b=b, out=w3);
    Nand(a=w2, b=w3, out=out);
}

Nandだけで実装できるなんて感動!

Mux

Mux.hdl
CHIP Mux {
    IN a, b, sel;
    OUT out;

    PARTS:
    Not(in=sel, out=notsel);
    Nand(a=a, b=notsel, out=w1);
    Nand(a=b, b=sel, out=w2);
    Nand(a=w1, b=w2, out=out);
}

DMux

DMux.hdl
CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Nand(a=in, b=sel, out=w1);
    Nand(a=in, b=w1, out=w2);
    Not(in=w2, out=a);
    Not(in=w1, out=b);
}

多ビットゲート

多ビットゲートは、同じことの繰り返しなので、Mux16のみ載せます。

Mux16.hdl
CHIP Mux16 {
    IN a[16], b[16], sel;
    OUT out[16];

    PARTS:
    Mux(a=a[0], b=b[0], sel=sel, out=out[0]);
    Mux(a=a[1], b=b[1], sel=sel, out=out[1]);
    Mux(a=a[2], b=b[2], sel=sel, out=out[2]);
    Mux(a=a[3], b=b[3], sel=sel, out=out[3]);
    Mux(a=a[4], b=b[4], sel=sel, out=out[4]);
    Mux(a=a[5], b=b[5], sel=sel, out=out[5]);
    Mux(a=a[6], b=b[6], sel=sel, out=out[6]);
    Mux(a=a[7], b=b[7], sel=sel, out=out[7]);
    Mux(a=a[8], b=b[8], sel=sel, out=out[8]);
    Mux(a=a[9], b=b[9], sel=sel, out=out[9]);
    Mux(a=a[10], b=b[10], sel=sel, out=out[10]);
    Mux(a=a[11], b=b[11], sel=sel, out=out[11]);
    Mux(a=a[12], b=b[12], sel=sel, out=out[12]);
    Mux(a=a[13], b=b[13], sel=sel, out=out[13]);
    Mux(a=a[14], b=b[14], sel=sel, out=out[14]);
    Mux(a=a[15], b=b[15], sel=sel, out=out[15]);
}

多入力ゲート

多入力ゲートは紙に書きながら考えました。selがややこしすぎる。

Or8Way
CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
    Or(a=in[0], b=in[1], out=w1);
    Or(a=in[2], b=in[3], out=w2);
    Or(a=in[4], b=in[5], out=w3);
    Or(a=in[6], b=in[7], out=w4);
    Or(a=w1, b=w2, out=w5);
    Or(a=w3, b=w4, out=w6);
    Or(a=w5, b=w6, out=out);
}
Mux4Way16
CHIP Mux4Way16 {
    IN a[16], b[16], c[16], d[16], sel[2];
    OUT out[16];

    PARTS:
    Mux16(a=a, b=b, sel=sel[0], out=out1);
    Mux16(a=c, b=d, sel=sel[0], out=out2);
    Mux16(a=out1, b=out2, sel=sel[1], out=out);
}
Mux8Way16
CHIP Mux8Way16 {
    IN a[16], b[16], c[16], d[16],
       e[16], f[16], g[16], h[16],
       sel[3];
    OUT out[16];

    PARTS:
    Mux16(a=a, b=b, sel=sel[0], out=out1);
    Mux16(a=c, b=d, sel=sel[0], out=out2);
    Mux16(a=e, b=f, sel=sel[0], out=out3);
    Mux16(a=g, b=h, sel=sel[0], out=out4);
    Mux16(a=out1, b=out2, sel=sel[1], out=out5);
    Mux16(a=out3, b=out4, sel=sel[1], out=out6);
    Mux16(a=out5, b=out6, sel=sel[2], out=out);
}
DMux4Way
CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
    DMux(in=in, sel=sel[0], a=a1, b=b1);
    DMux(in=in, sel=sel[0], a=c1, b=d1);
    DMux(in=in, sel=sel[1], a=a2, b=c2);
    DMux(in=in, sel=sel[1], a=b2, b=d2);
    And(a=a1, b=a2, out=a);
    And(a=b1, b=b2, out=b);
    And(a=c1, b=c2, out=c);
    And(a=d1, b=d2, out=d);
}
DMux8Way
CHIP DMux8Way {
    IN in, sel[3];
    OUT a, b, c, d, e, f, g, h;

    PARTS:
    DMux4Way(in=in, sel[0]=sel[0], sel[1]=sel[1], a=a1, b=b1, c=c1, d=d1);
    DMux4Way(in=in, sel[0]=sel[0], sel[1]=sel[1], a=e1, b=f1, c=g1, d=h1);
    DMux(in=in, sel=sel[2], a=a2, b=e2);
    DMux(in=in, sel=sel[2], a=b2, b=f2);
    DMux(in=in, sel=sel[2], a=c2, b=g2);
    DMux(in=in, sel=sel[2], a=d2, b=h2);
    And(a=a1, b=a2, out=a);
    And(a=b1, b=b2, out=b);
    And(a=c1, b=c2, out=c);
    And(a=d1, b=d2, out=d);
    And(a=e1, b=e2, out=e);
    And(a=f1, b=f2, out=f);
    And(a=g1, b=g2, out=g);
    And(a=h1, b=h2, out=h);
}

これで第一章は終わりです。

あとがき

第一章だけでもかなりボリュームがあった(自分にとって)ので、これから読み進めていくのが楽しみです。

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5