Week1-homework

与门 \(And\)

用两个 \(Nand\) 门拼出来
\(ab=\overline{\overline{ab}1}\)

CHIP And {
    IN a, b;
    OUT out;

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

16位与门 \(And16\)

CHIP And16 {
    IN a[16], b[16];
    OUT out[16];

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

非门 \(Not\)

\(\overline{a1}\)

CHIP Not {
    IN in;
    OUT out;

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

16位非门 \(Not16\)

CHIP Not16 {
    IN in[16];
    OUT out[16];

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

或门 \(Or\)

\(\overline{\overline{a}\overline{b}}\)

CHIP Or {
    IN a, b;
    OUT out;

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

\(Or8Way\)

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

    PARTS:
    Or(a=in[0],b=in[1],out=out1);
    Or(a=in[2],b=in[3],out=out2);
    Or(a=in[4],b=in[5],out=out3);
    Or(a=in[6],b=in[8],out=out4);
    Or(a=out1,b=out2,out=out5);
    Or(a=out3,b=out4,out=out6);
    Or(a=out5,b=out6,out=out);
}

16位或门 \(Or16\)

CHIP Or16 {
    IN a[16], b[16];
    OUT out[16];

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

异或门 \(Xor\)

\(\overline{a}b+a\overline{b}\)

CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    Not(in=a,out=nota);
    Not(in=b,out=notb);
    And(a=a,b=notb,out=w1);
    And(a=nota,b=b,out=w2);
    Or(a=w1,b=w2,out=out);
}

多路转换器/多路复用器 \(Mux\)

\(sel\)\(1\) 时输出信号 \(a\) , 为\(0\)时输出信号 \(b\) , 用真值表推出表达式
\(a\overline{sel}+bsel\)

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

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

16位多路复用器 \(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]);
}

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

多路输出选择器/多路解复用器 \(DMux\)

{a, b} = {in, 0} if sel == 0
         {0, in} if sel == 1    
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);
}

\(DMux4Way\)

{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:
    Not(in=sel[0],out=nsel0);
    Not(in=sel[1],out=nsel1);
    And(a=nsel1,b=nsel0,out=out1);
    And(a=nsel1,b=sel[0],out=out2);
    And(a=sel[1],b=nsel0,out=out3);
    And(a=sel[1],b=sel[0],out=out4);
    And(a=out1,b=in,out=a);
    And(a=out2,b=in,out=b);
    And(a=out3,b=in,out=c);
    And(a=out4,b=in,out=d);
}

\(DMux8Way\)

同上

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

    PARTS:
    Not(in=sel[0],out=nsel0);
    Not(in=sel[1],out=nsel1);
    Not(in=sel[2],out=nsel2);
    And(a=nsel0,b=nsel1,out=n00);
    And(a=n00,b=nsel2,out=n000);
    And(a=n00,b=sel[2],out=n100);
    And(a=sel[0],b=nsel1,out=n01);
    And(a=n01,b=nsel2,out=n001);
    And(a=n01,b=sel[2],out=n101);
    And(a=nsel0,b=sel[1],out=n10);
    And(a=n10,b=nsel2,out=n010);
    And(a=n10,b=sel[2],out=n110);
    And(a=sel[0],b=sel[1],out=n11);
    And(a=n11,b=nsel2,out=n011);
    And(a=n11,b=sel[2],out=n111);
    And(a=n000,b=in,out=a);
    And(a=n001,b=in,out=b);
    And(a=n010,b=in,out=c);
    And(a=n011,b=in,out=d);
    And(a=n100,b=in,out=e);
    And(a=n101,b=in,out=f);
    And(a=n110,b=in,out=g);
    And(a=n111,b=in,out=h);
}
posted @ 2022-10-04 21:28  misasteria  阅读(60)  评论(0编辑  收藏  举报