2章 ブール算術
本章では、数を表現し算術演算を行うための論理ゲートを作成します。
★単語
2進数:2を底と考えて計算する
例)※+1づつ足していった場合
1 ⇒10 ⇒11 ⇒100 ⇒101 ⇒110 ⇒111
キャリービット:CPUがキャリー(桁上げ)を監視するために、レジスターの一部で使用するビットのことである。
例)8+7=15の場合キャリーは1である。
半加算器:ふたつのビットの和を求める
全加算器:3つのビットの和を求める
加算器:ふたつのnビット(16、32、64など)の和を求める
インクリメント:与えられた数字に1を加算する
ALU(演算装置):論理演算(AND、NOT、OR、XOR)や四則演算(+,-,×,÷)などの演算をおこなう装置
★回路図
・半加算器
【真理値表】
入力1 入力2 | 出力(carry) 出力(sum)
0 0 | 0 0
1 0 | 0 1
0 1 | 0 1
1 1 | 1 0
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
CHIP HalfAdder {
IN a, b; // 1-bit inputs
OUT sum, // Right bit of a + b
carry; // Left bit of a + b
PARTS:
Nand(a=a, b=b, out=w1);
Nand(a=w1, b=w1, out=carry);
Nand(a=a, b=b, out=w2);
Nand(a=a, b=w2, out=w3);
Nand(a=w2, b=b, out=w4);
Nand(a=w3, b=w4, out=sum);
}
・全加算器
【真理値表】
入力1 入力2 入力3 | 出力(carry) 出力(sum)
0 0 0 | 0 0
1 0 0 | 0 1
0 1 0 | 0 1
0 0 1 | 0 1
1 1 0 | 1 0
0 1 1 | 1 0
1 0 1 | 1 0
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:
HalfAdder(a=a, b=b, sum=s1, carry=c1);
HalfAdder(a=c, b=s1, sum=sum, carry=c2);
Or(a=c1, b=c2, out=carry);
}
・加算器
CHIP Add16 {
IN a[16], b[16];
//OUT s[16];
OUT out[16];
PARTS:
HalfAdder(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],carry=c16);
}
・インクリメント
CHIP Inc16 {
IN in[16];
OUT out[16];
PARTS:
Not(in=in[0], out=out[0]);
HalfAdder(a=in[1], b=in[0], sum=out[1], carry=ca1);
HalfAdder(a=in[2], b=ca1, sum=out[2], carry=ca2);
HalfAdder(a=in[3], b=ca2, sum=out[3], carry=ca3);
HalfAdder(a=in[4], b=ca3, sum=out[4], carry=ca4);
HalfAdder(a=in[5], b=ca4, sum=out[5], carry=ca5);
HalfAdder(a=in[6], b=ca5, sum=out[6], carry=ca6);
HalfAdder(a=in[7], b=ca6, sum=out[7], carry=ca7);
HalfAdder(a=in[8], b=ca7, sum=out[8], carry=ca8);
HalfAdder(a=in[9], b=ca8, sum=out[9], carry=ca9);
HalfAdder(a=in[10], b=ca9, sum=out[10], carry=ca10);
HalfAdder(a=in[11], b=ca10, sum=out[11], carry=ca11);
HalfAdder(a=in[12], b=ca11, sum=out[12], carry=ca12);
HalfAdder(a=in[13], b=ca12, sum=out[13], carry=ca13);
HalfAdder(a=in[14], b=ca13, sum=out[14], carry=ca14);
HalfAdder(a=in[15], b=ca14, sum=out[15], carry=ca15);
}
・算術論理演算器(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=false, sel=zx, out=w1);
Mux16(a=y, b=false, sel=zy, out=w2);
Not16(in=w1, out=nw1);
Mux16(a=w1, b=nw1, sel=nx, out=w3);
Not16(in=w2, out=nw2);
Mux16(a=w2, b=nw2, sel=ny, out=w4);
And16(a=w3, b=w4, out=xandy);
Add16(a=w3, b=w4, out=addxy);
Mux16(a=xandy, b=addxy, sel=f, out=w5);
Not16(in=w5, out=nw5);
Mux16(a=w5, b=nw5, sel=no, out=out,out[0..7]=out0to7,out[8..15]=out8to15,out[15]=ng);
Or8Way(in=out0to7, out=or0to7);
Or8Way(in=out8to15, out=or8to15);
Or(a=or0to7, b=or8to15, out=or0to15);
Not(in=or0to15, out=zr);
}
Next
3章 順序回路
・Twitter
https://twitter.com/tango3564
・Instagram
https://www.instagram.com/tango3690/