Week2-homework

半加器 \(HalfAdder\)

半加器处理两个一位二进制数的加法, 得到结果项 \(sum\) 和进位项 \(carry\)

CHIP HalfAdder {
    IN a, b;    // 1-bit inputs
    OUT sum,    // Right bit of a + b 
        carry;  // Left bit of a + b

    PARTS:
    Xor(a=a,b=b,out=sum);
    And(a=a,b=b,out=carry);
}

全加器 \(FullAdder\)

全加器处理三个一位二进制数的加法,得到结果项 \(sum\) 和进位项 \(carry\)

CHIP FullAdder {
    IN a, b, c;  // 1-bit inputs
    OUT sum,     // Right bit of a + b + c
        carry;   // Left bit of a + b + c

    PARTS:
    Not(in=a,out=na);
    Not(in=b,out=nb);
    Not(in=c,out=nc);
    And(a=a,b=b,out=n1);
    And(a=n1,b=c,out=ans1);
    And(a=na,b=nb,out=n2);
    And(a=n2,b=c,out=ans2);
    And(a=nb,b=nc,out=n3);
    And(a=n3,b=a,out=ans3);
    And(a=na,b=nc,out=n4);
    And(a=n4,b=b,out=ans4);
    Or(a=ans1,b=ans2,out=ans11);
    Or(a=ans3,b=ans4,out=ans12);
    Or(a=ans11,b=ans12,out=sum);
    And(a=a,b=b,out=m2);
    And(a=m2,b=nc,out=res2);
    And(a=b,b=c,out=m3);
    And(a=m3,b=na,out=res3);
    And(a=a,b=c,out=m4);
    And(a=m4,b=nb,out=res4);
    Or(a=ans1,b=res2,out=res11);
    Or(a=res3,b=res4,out=res12);
    Or(a=res11,b=res12,out=carry);
}

16位加法器 \(Add16\)

通过全加器实现,第\(i\)位由 \(a_i\)\(b_i\) 和第 \(i-1\) 位的 \(carry\) 项全加实现。

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

    PARTS:
   FullAdder(a=a[0],b=b[0],c=false,sum=out[0],carry=res0);
   FullAdder(a=a[1],b=b[1],c=res0,sum=out[1],carry=res1);
   FullAdder(a=a[2],b=b[2],c=res1,sum=out[2],carry=res2);
   FullAdder(a=a[3],b=b[3],c=res2,sum=out[3],carry=res3);
   FullAdder(a=a[4],b=b[4],c=res3,sum=out[4],carry=res4);
   FullAdder(a=a[5],b=b[5],c=res4,sum=out[5],carry=res5);
   FullAdder(a=a[6],b=b[6],c=res5,sum=out[6],carry=res6);
   FullAdder(a=a[7],b=b[7],c=res6,sum=out[7],carry=res7);
   FullAdder(a=a[8],b=b[8],c=res7,sum=out[8],carry=res8);
   FullAdder(a=a[9],b=b[9],c=res8,sum=out[9],carry=res9);
   FullAdder(a=a[10],b=b[10],c=res9,sum=out[10],carry=res10);
   FullAdder(a=a[11],b=b[11],c=res10,sum=out[11],carry=res11);
   FullAdder(a=a[12],b=b[12],c=res11,sum=out[12],carry=res12);
   FullAdder(a=a[13],b=b[13],c=res12,sum=out[13],carry=res13);
   FullAdder(a=a[14],b=b[14],c=res13,sum=out[14],carry=res14);
   FullAdder(a=a[15],b=b[15],c=res14,sum=out[15],carry=res15);
}

算术逻辑单元 \(ALU\)


\(zx\)\(1\) ,则输入 \(x\) 变为 \(0\) , 是 \(0\) 则不变。

\(nx\)\(1\), 则输入 \(x\) 变为 \(!x\), 是 \(0\) 则不变。

\(zy\)\(1\) ,则输入 \(y\) 变为 \(0\) , 是 \(0\) 则不变。

\(ny\)\(1\), 则输入 \(y\) 变为 \(!y\), 是 \(0\) 则不变。

\(f\)\(1\), 则执行操作 \(x+y\) , 是 \(0\) 则执行操作 $ x$ & \(y\)

\(no\)\(1\), 则输出取反, 是 \(0\) 则不变。

若输出为 \(0\), 则 \(zr\)\(1\), 反之为 \(0\)

若输出为负数, 则 \(ng\)\(1\), 反之为 \(0\)

\(ALU\) 的实现需要 \(Mux\) 进行分类讨论

CHIP ALU {
    IN  
        x[16], y[16],  // 16-bit inputs        
        zx, // zero the x input?
        nx, // negate the x input?
        zy, // zero the y input?
        ny, // negate the y input?
        f,  // compute out = x + y (if 1) or x & y (if 0)
        no; // negate the out output?

    OUT 
        out[16], // 16-bit output
        zr, // 1 if (out == 0), 0 otherwise
        ng; // 1 if (out < 0),  0 otherwise

   PARTS:
   Mux16(a=x,b=false,sel=zx,out=x1);
   Not16(in=x1,out=nx1);
   Mux16(a=x1,b=nx1,sel=nx,out=x2);
   Mux16(a=y,b=false,sel=zy,out=y1);
   Not16(in=y1,out=ny1);
   Mux16(a=y1,b=ny1,sel=ny,out=y2);
   Add16(a=x2,b=y2,out=xpy);
   And16(a=x2,b=y2,out=xay);
   Mux16(a=xay,b=xpy,sel=f,out=out1);
   Not16(in=out1,out=nout1);
   Mux16(a=out1,b=nout1,sel=no,out=out,out=copy,out[15]=flag);
   And16(a=copy,b=true,out[0..7]=tmp1,out[8..15]=tmp2);
   Or8Way(in=tmp1,out=o1);
   Or8Way(in=tmp2,out=o2);
   Or(a=o1,b=o2,out=flagzr);
   Mux(a=true,b=false,sel=flagzr,out=zr);
   Mux(a=false,b=true,sel=flag,out=ng);
}
posted @ 2022-10-05 22:37  misasteria  阅读(62)  评论(0编辑  收藏  举报