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