기본 논리게이트의 HDL

기본 논리게이트의 HDL

NOT

NANDToNOT

CHIP Not {
    IN in;
    OUT out;

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

AND

NANDToAND

CHIP And {
    IN a, b;
    OUT out;

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

OR

NANDToOR

CHIP Or {
    IN a, b;
    OUT out;

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

XOR

NANDToXOR

CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a, out=c0);
    Not(in=b, out=c1);
    Nand(a=c0, b=b, out=d0);
    Nand(a=a, b=c1, out=d1);
    Nand(a=d0, b=d1, out=out);
}

MUX (Multiplexer)

mux

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

    PARTS:
    Not(in=sel, out=nsel);
    And(a=a, b=nsel, out=c0);
    And(a=b, b=sel, out=c1);
    Or(a=c0, b=c1, out=out);
}

MUX 4 Way 16

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=c1);
    Mux16(a=c, b=d, sel=sel[0], out=c2);
    Mux16(a=c1, b=c2, sel=sel[1], out=out);
}

MUX 8 Way 16

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[0]=sel[0], sel[1]=sel[1], out=c0);
    Mux4Way16(a=e, b=f, c=g, d=h, sel[0]=sel[0], sel[1]=sel[1], out=c1);
    Mux16(a=c0, b=c1, sel=sel[2], out=out);
}

4 Way 같은 경우는 sel을 sel[0]과 sel[1]로 나누어서 생각하면 편하다. 예를들어 sel이 01이면 sel[0]은 1이므로 c1은 b c2는 d가 될 것이다. 그 후 c1과 c2중 sel[1]에 따라서 out을 결정하면 된다. sel[1]은 0이므로 out은 c1(b)이 되겠다. 8 Way도 마찬가지로 4 Way로 이루어졌다고 생각하면 된다.

mux


DEMUX (Demultiplexer)

demux

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

    PARTS:
    Not(in=sel, out=nsel);
    And(a=in, b=nsel, out=a);
    And(a=in, b=sel, out=b);
}

DEMUX 4 Way

CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
    DMux(in=in, sel=sel[1], a=c0, b=c1);
    DMux(in=c0, sel=sel[0], a=a, b=b);
    DMux(in=c1, sel=sel[0], a=c, b=d);
}

DEMUX 8 Way

CHIP DMux8Way {
    IN in, sel[3];
    OUT a, b, c, d, e, f, g, h;

    PARTS:
    DMux(in=in, sel=sel[2], a=c0, b=c1);
    DMux4Way(in=c0, sel[1]=sel[1], sel[0]=sel[0], a=a, b=b, c=c, d=d);
    DMux4Way(in=c1, sel[1]=sel[1], sel[0]=sel[0], a=e, b=f, c=g, d=h);
}

MUX의 4 Way는 Bottom-Up 방식으로 구현했다면 DEMUX는 Top-Down 방식으로 구현한다. 예를들어 c0를 A와 B c1을 C와 D로 생각해보자. 그리고 sel이 01이면 sel[1]은 0이므로 c0는 in, c1은 0이 될 것이다. 그러므로 c0, 즉 A와 B중 In이 있다. 그 후 c1은 0이므로 c와 d는 모두 0이 될 것이고, sel[0]은 1 이므로 b가 out이 될 것이다.

demux