Machineboy空
[From Nand to Tetris] Project 1 (3) Multi-way variants(Or8way, Mux4Way16, Mux8Way16, DMux4Way, DMux8Way) 본문
Computer/CS
[From Nand to Tetris] Project 1 (3) Multi-way variants(Or8way, Mux4Way16, Mux8Way16, DMux4Way, DMux8Way)
안녕도라 2025. 1. 17. 17:031) Or8way
/**
* 8-way Or gate:
* out = in[0] Or in[1] Or ... Or in[7]
*/
CHIP Or8Way {
IN in[8];
OUT out;
PARTS:
Or(a=in[0], b=in[1], out=or1);
Or(a=in[2], b=in[3], out=or2);
Or(a=in[4], b=in[5], out=or3);
Or(a=in[6], b=in[7], out=or4);
Or(a=or1, b=or2, out=or5);
Or(a=or3, b=or4, out=or6);
Or(a=or5, b=or6, out=out);
}

2) Mux4Way16
/**
* 4-way 16-bit multiplexor:
* out = a if sel = 00
* b if sel = 01
* c if sel = 10
* d if sel = 11
*/
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=muxAB);
Mux16(a=c, b=d, sel=sel[0], out=muxCD);
Mux16(a=muxAB, b=muxCD, sel=sel[1], out=out);
}
3) Mux8Way16

/**
* 8-way 16-bit multiplexor:
* out = a if sel = 000
* b if sel = 001
* c if sel = 010
* d if sel = 011
* e if sel = 100
* f if sel = 101
* g if sel = 110
* h if sel = 111
*/
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:
Mux4Way16(a=a, b=b, c=c, d=d, sel=sel[0..1], out=muxAD);
Mux4Way16(a=e, b=f, c=g, d=h, sel=sel[0..1], out=muxEH);
Mux16(a=muxAD, b=muxEH, sel=sel[2], out=out);
}
4) DMux4Way
/**
* 4-way demultiplexor:
* [a, b, c, d] = [in, 0, 0, 0] if sel = 00
* [0, in, 0, 0] if sel = 01
* [0, 0, in, 0] if sel = 10
* [0, 0, 0, in] if sel = 11
*/
CHIP DMux4Way {
IN in, sel[2];
OUT a, b, c, d;
PARTS:
DMux(in=in, sel=sel[1], a=dIn0, b=dIn1);
DMux(in=dIn0, sel=sel[0], a=a, b=b);
DMux(in=dIn1, sel=sel[0], a=c, b=d);
}

5) DMux8Way
/**
* 8-way demultiplexor:
* [a, b, c, d, e, f, g, h] = [in, 0, 0, 0, 0, 0, 0, 0] if sel = 000
* [0, in, 0, 0, 0, 0, 0, 0] if sel = 001
* [0, 0, in, 0, 0, 0, 0, 0] if sel = 010
* [0, 0, 0, in, 0, 0, 0, 0] if sel = 011
* [0, 0, 0, 0, in, 0, 0, 0] if sel = 100
* [0, 0, 0, 0, 0, in, 0, 0] if sel = 101
* [0, 0, 0, 0, 0, 0, in, 0] if sel = 110
* [0, 0, 0, 0, 0, 0, 0, in] if sel = 111
*/
CHIP DMux8Way {
IN in, sel[3];
OUT a, b, c, d, e, f, g, h;
PARTS:
DMux(in=in, sel=sel[2], a=dIn0, b=dIn1);
DMux4Way(in=dIn0, sel=sel[0..1], a=a, b=b, c=c, d=d);
DMux4Way(in=dIn1, sel=sel[0..1], a=e, b=f, c=g, d=h);
}
