自己紹介
こんにちは。taka2です。初投稿です。プログラミング絶賛修行中のものです。今回、本屋でこの本を見かけて、立ち読みしてうおおおとなり、10分後にはすでに買っていたので、備忘録として書こうと思いました。
#内容
今回はNand2Tetrisの第1章の備忘録です。Nandからいろいろな論理回路を組み立てていきます。準備の部分は本書にかかれているとおりです。
#Not
Notゲートは簡単です。
CHIP Not {
IN in;
OUT out;
PARTS:
Nand(a=in, b=in, out=out);
}
これを本書で提供されているハードウェアシュミレーターでテストします。
このシュミレーターの上のバーの上のようなアイコンを押してNot.tstを選択し、読み込まれたらバーの>>を押して、
このように成功すればOKです。
初め、コマンドプロンプトの方から、
~/nand2tetris/tools/HardwareSimulator.sh Not.hdl
と入力して実行しようとしたがそうすると自分の環境ではエラーが出てしまうようです。(ubuntu1604)
上記の方法なら問題なくできたので、その方法でやっていきました。
And
先ほどと同様に実装していきます。このあとも同じように。
CHIP And {
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=b, out=Nandout);
Not(in=Nandout, out=out);
}
Or
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
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
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
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のみ載せます。
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がややこしすぎる。
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);
}
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);
}
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);
}
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);
}
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);
}
これで第一章は終わりです。
あとがき
第一章だけでもかなりボリュームがあった(自分にとって)ので、これから読み進めていくのが楽しみです。