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 \);

}

results matching ""

    No results matching ""