FullAdder

a b c sum carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
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:
    // Put you code here:

    Xor(a=a,b=b,out=d);
    Xor(a=c,b=d,out=sum);

    And(a=a,b=b,out=ab);
    And(a=a,b=c,out=ac);
    And(a=b,b=c,out=bc);

    Or(a=ab,b=ac,out=abORac);
    Or(a=abORac,b=bc,out=carry);
}

HalfAdder

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

    PARTS:
    // Put you code here:
    Xor(a=a,b=b,out=sum);
    And(a=a,b=b,out=carry);
}

Add16

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

    PARTS:
   // Put you code here:
   FullAdder(a=a[0],b=b[0],sum=out[0],carry=c1);
   FullAdder(a=a[1],b=b[1],c=c1,sum=out[1],carry=c2);
   FullAdder(a=a[2],b=b[2],c=c2,sum=out[2],carry=c3);
   FullAdder(a=a[3],b=b[3],c=c3,sum=out[3],carry=c4);
   FullAdder(a=a[4],b=b[4],c=c4,sum=out[4],carry=c5);
   FullAdder(a=a[5],b=b[5],c=c5,sum=out[5],carry=c6);
   FullAdder(a=a[6],b=b[6],c=c6,sum=out[6],carry=c7);
   FullAdder(a=a[7],b=b[7],c=c7,sum=out[7],carry=c8);
   FullAdder(a=a[8],b=b[8],c=c8,sum=out[8],carry=c9);
   FullAdder(a=a[9],b=b[9],c=c9,sum=out[9],carry=c10);
   FullAdder(a=a[10],b=b[10],c=c10,sum=out[10],carry=c11);
   FullAdder(a=a[11],b=b[11],c=c11,sum=out[11],carry=c12);
   FullAdder(a=a[12],b=b[12],c=c12,sum=out[12],carry=c13);
   FullAdder(a=a[13],b=b[13],c=c13,sum=out[13],carry=c14);
   FullAdder(a=a[14],b=b[14],c=c14,sum=out[14],carry=c15);
   FullAdder(a=a[15],b=b[15],c=c15,sum=out[15]);
}

Inc16

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

    PARTS:
   // Put you code here:
   //Not(in=in[0],out=neg);
   //Or(a=in[0],b=neg,out=one);

   HalfAdder(a=in[0],b=true,sum=out[0],carry=c1);
   HalfAdder(a=in[1],b=c1,sum=out[1],carry=c2);
   HalfAdder(a=in[2],b=c2,sum=out[2],carry=c3);
   HalfAdder(a=in[3],b=c3,sum=out[3],carry=c4);
   HalfAdder(a=in[4],b=c4,sum=out[4],carry=c5);
   HalfAdder(a=in[5],b=c5,sum=out[5],carry=c6);
   HalfAdder(a=in[6],b=c6,sum=out[6],carry=c7);
   HalfAdder(a=in[7],b=c7,sum=out[7],carry=c8);
   HalfAdder(a=in[8],b=c8,sum=out[8],carry=c9);
   HalfAdder(a=in[9],b=c9,sum=out[9],carry=c10);
   HalfAdder(a=in[10],b=c10,sum=out[10],carry=c11);
   HalfAdder(a=in[11],b=c11,sum=out[11],carry=c12);
   HalfAdder(a=in[12],b=c12,sum=out[12],carry=c13);
   HalfAdder(a=in[13],b=c13,sum=out[13],carry=c14);
   HalfAdder(a=in[14],b=c14,sum=out[14],carry=c15);
   HalfAdder(a=in[15],b=c15,sum=out[15]);
}

ALU

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:
// Put you code here:
//zx ng
Mux16(a=x,b=false,sel=zx,out=x1);
Not16(in=x1,out=notx);
Mux16(a=x1,b=notx,sel=nx,out=ndx);
//zy ny
Mux16(a=y,b=false,sel=zy,out=y1);
Not16(in=y1,out=noty);
Mux16(a=y1,b=noty,sel=ny,out=ndy);
//相加,相乘
Add16(a=ndx,b=ndy,out=addxy);
And16(a=ndx,b=ndy,out=andxy);
//f
Mux16(a=andxy,b=addxy,sel=f,out=fout);
Not16(in=fout,out=nfout);
//no,ng
Mux16(a=fout,b=nfout,sel=no,out=out,out[0..7]=or07,out[8..15]=or815,out[15]=ng);
//zr
Or8Way(in=or07,out=zr1);
Or8way(in=or815,out=zr2);
Or(a=zr1,b=zr2,out=ornego);
Not(in=ornego,out=zr);
}

results matching ""

    No results matching ""