Chap 2 Boolean Arithmetic
筆記:
作業部分:
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 );
}
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=os , carry=oc );
HalfAdder ( a=os , b=c , sum=sum , carry=oc2);
Or ( a=oc , b=oc2 , out=carry );
}
Add16
CHIP Add16 {
IN a[16], b[16];
OUT out[16];
PARTS:
HalfAdder ( a=a[0] , b=b[0] , sum=out[0] , carry=c0 );
FullAdder ( a=a[1] , b=b[1] , c=c0 , sum=out[1] , carry=c1 );
FullAdder ( a=a[2] , b=b[2] , c=c1 , sum=out[2] , carry=c2 );
FullAdder ( a=a[3] , b=b[3] , c=c2 , sum=out[3] , carry=c3 );
FullAdder ( a=a[4] , b=b[4] , c=c3 , sum=out[4] , carry=c4 );
FullAdder ( a=a[5] , b=b[5] , c=c4 , sum=out[5] , carry=c5 );
FullAdder ( a=a[6] , b=b[6] , c=c5 , sum=out[6] , carry=c6 );
FullAdder ( a=a[7] , b=b[7] , c=c6 , sum=out[7] , carry=c7 );
FullAdder ( a=a[8] , b=b[8] , c=c7 , sum=out[8] , carry=c8 );
FullAdder ( a=a[9] , b=b[9] , c=c8 , sum=out[9] , carry=c9 );
FullAdder ( a=a[10] , b=b[10] , c=c9 , sum=out[10] , carry=c10 );
FullAdder ( a=a[11] , b=b[11] , c=c10 , sum=out[11] , carry=c11 );
FullAdder ( a=a[12] , b=b[12] , c=c11 , sum=out[12] , carry=c12 );
FullAdder ( a=a[13] , b=b[13] , c=c12 , sum=out[13] , carry=c13 );
FullAdder ( a=a[14] , b=b[14] , c=c13 , sum=out[14] , carry=c14 );
FullAdder ( a=a[15] , b=b[15] , c=c14 , sum=out[15] );
}
Inc16
CHIP Inc16 {
IN in\[16\];
OUT out\[16\];
PARTS:
Add16 \( a=in\[0..15\] , b\[0\]=true , b\[1..15\]=false , out=out \);
}
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:
Mux16 \( a=x , b\[0..15\]=false , sel=zx , out=mox1 \);
Not16 \( in=mox1 , out=nmox1 \);
Mux16 \( a=mox1 , b=nmox1 , sel=nx , out=mox2 \);
Mux16 \( a=y , b\[0..15\]=false , sel=zy , out=moy1 \);
Not16 \( in=moy1 , out=nmoy1 \);
Mux16 \( a=moy1 , b=nmoy1 , sel=ny , out=moy2 \);
And16 \( a=mox2 , b=moy2 , out=axy1 \);
Add16 \( a=mox2 , b=moy2 , out=axy2 \);
Mux16 \( a=axy1 , b=axy2 , sel=f , out=mxy1 \);
Not16 \( in=mxy1 , out=nmxy1\);
Mux16 \( a=mxy1 , b=nmxy1 , sel=no , out=out , out\[0..7\]=o7 , out\[8..15\]=o15 , out\[15\]=ng \);
Or8Way \( in=o7 , out=oo7\);
Or8Way \( in=o15 , out=oo15\);
Or \( a=oo7 , b=oo15 , out=nzr\);
Not \( in=nzr , out=zr \);
}