Project 2
HalfAdder
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);
}
a |
b |
sum |
carry |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
FullAdder
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:
HalfAdder(a=a,b=b,sum=s1,carry=c1);
HalfAdder(a=s1,b=c,sum=sum,carry=c2);
Or(a=c1,b=c2,out=carry);
//And(a=a,b=b,out=c1);
//Xor(a=a,b=b,out=b1);
//And(a=b1,b=c,out=c2);
//Xor(a=c,b=b1,out=sum);
//Or(a=c1,b=c2,out=carry);
}
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 |
Add16
4-bit adder
CHIP Add16 {
IN a[16], b[16];
OUT out[16];
PARTS:
HalfAdder(a=a[0],b=b[0],carry=c0,sum=out[0]);
FullAdder(a=a[1],b=b[1],c=c0,carry=c1,sum=out[1]);
FullAdder(a=a[2],b=b[2],c=c1,carry=c2,sum=out[2]);
FullAdder(a=a[3],b=b[3],c=c2,carry=c3,sum=out[3]);
FullAdder(a=a[4],b=b[4],c=c3,carry=c4,sum=out[4]);
FullAdder(a=a[5],b=b[5],c=c4,carry=c5,sum=out[5]);
FullAdder(a=a[6],b=b[6],c=c5,carry=c6,sum=out[6]);
FullAdder(a=a[7],b=b[7],c=c6,carry=c7,sum=out[7]);
FullAdder(a=a[8],b=b[8],c=c7,carry=c8,sum=out[8]);
FullAdder(a=a[9],b=b[9],c=c8,carry=c9,sum=out[9]);
FullAdder(a=a[10],b=b[10],c=c9,carry=c10,sum=out[10]);
FullAdder(a=a[11],b=b[11],c=c10,carry=c11,sum=out[11]);
FullAdder(a=a[12],b=b[12],c=c11,carry=c12,sum=out[12]);
FullAdder(a=a[13],b=b[13],c=c12,carry=c13,sum=out[13]);
FullAdder(a=a[14],b=b[14],c=c13,carry=c14,sum=out[14]);
FullAdder(a=a[15],b=b[15],c=c14,carry=c15,sum=out[15]);
}
a |
b |
out |
0000000000000000 |
0000000000000000 |
0000000000000000 |
0000000000000000 |
1111111111111111 |
1111111111111111 |
1111111111111111 |
1111111111111111 |
1111111111111110 |
1010101010101010 |
0101010101010101 |
1111111111111111 |
0011110011000011 |
0000111111110000 |
0100110010110011 |
0001001000110100 |
1001100001110110 |
1010101010101010 |
Inc16
4-bit incrementer
CHIP Inc16 {
IN in[16];
OUT out[16];
PARTS:
Add16(a=in,b[0]=true,out=out);
}
in |
out |
0000000000000000 |
0000000000000001 |
1111111111111111 |
0000000000000000 |
0000000000000101 |
0000000000000110 |
1111111111111011 |
1111111111111100 |
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:
//zx.nx
Mux16(a=x,b=false,sel=zx,out=mzx);
Not16(in=mzx,out=nzx);
Mux16(a=mzx,b=nzx,sel=nx,out=mnx);
//zy.ny
Mux16(a=y,b=false,sel=zy,out=mzy);
Not16(in=mzy,out=nzy);
Mux16(a=mzy,b=nzy,sel=ny,out=mny);
Add16(a=mnx,b=mny,out=xaddy);
And16(a=mnx,b=mny,out=xandy);
//f.no
Mux16(a=xandy,b=xaddy,sel=f,out=mf);
Not16(in=mf,out=nf);
Mux16(a=mf,b=nf,sel=no,out=mno);
//zr
And16(a=mno,b=mno,out[0..7]=out1,out[8..15]=out2);
Or8Way(in=out1,out=out11);
Or8Way(in=out2,out=out22);
Or(a=out11,b=out22,out=out12);
Not(in=out12,out=zr);
//ng
And16(a=mno,b=mno,out[15]=ng);
//out
And16(a=mno,b=mno,out=out);
}