見出し画像

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	    00	    0   
 1	      00	    1        
 0	      10	    1        
 1	      11	    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);
}

画像5

スクリーンショット (3)


Next
3章 順序回路

Back
1章 ブール理論
1章 ブール理論(番外編)

・Twitter
https://twitter.com/tango3564

・Instagram
https://www.instagram.com/tango3690/