Skip to content

Latest commit

 

History

History
116 lines (109 loc) · 3.83 KB

0930作業.md

File metadata and controls

116 lines (109 loc) · 3.83 KB

HalfAdder

CHIP HalfAdder {
    IN a, b;    // 1-bit inputs
    OUT sum,    // Right bit of a + b 
        carry;  // Left bit of a + b

    PARTS:
    // Put you code here:
    And(a=a,b=b,out=carry);
    Xor(a=a,b=b,out=sum);
}
|   a   |   b   |  sum  | carry |
|   0   |   0   |   0   |   0   |
|   0   |   1   |   1   |   0   |
|   1   |   0   |   1   |   0   |
|   1   |   1   |   0   |   1   |

sum邏輯同Xor;carry邏輯同And image

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:
    // Put you code here:
    HalfAdder(a=a,b=b,sum=abs,carry=abc);
    HalfAdder(a=abs,b=c,sum=sum,carry=abccc);
    Or(a=abc,b=abccc,out=carry);
}

先將其中兩個連通加法器 再把sum跟第三個連通加法器 最後的sum就是第一位數 將兩個carry用or連接可得第二位數 image

Adder16

CHIP Add16 {
    IN a[16], b[16];
    OUT out[16];

    PARTS:
   // Put you code here:
    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] , carry = c15);
}

首位數可用半加器或全加器加入一個零運算 後面使用全加器將a、b以及進位相加 進位加到下一個全加器 image

Inc16

// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/02/Inc16.hdl

/**
 * 16-bit incrementer:
 * out = in + 1 (arithmetic addition)
 */

CHIP Inc16 {
    IN in[16];
    OUT out[16];

    PARTS:
   // Put you code here:
    
    Nand(a=in[0],b=in[0],out=out[0]);
    And(a=in[0],b=in[0],out=c0);
    HalfAdder(a=in[1],b=c0,sum=out[1],carry=c1);
    HalfAdder(a=in[2],b=c1,sum=out[2],carry=c2);
    HalfAdder(a=in[3],b=c2,sum=out[3],carry=c3);
    HalfAdder(a=in[4],b=c3,sum=out[4],carry=c4);
    HalfAdder(a=in[5],b=c4,sum=out[5],carry=c5);
    HalfAdder(a=in[6],b=c5,sum=out[6],carry=c6);
    HalfAdder(a=in[7],b=c6,sum=out[7],carry=c7);
    HalfAdder(a=in[8],b=c7,sum=out[8],carry=c8);
    HalfAdder(a=in[9],b=c8,sum=out[9],carry=c9);
    HalfAdder(a=in[10],b=c9,sum=out[10],carry=c10);
    HalfAdder(a=in[11],b=c10,sum=out[11],carry=c11);
    HalfAdder(a=in[12],b=c11,sum=out[12],carry=c12);
    HalfAdder(a=in[13],b=c12,sum=out[13],carry=c13);
    HalfAdder(a=in[14],b=c13,sum=out[14],carry=c14);
    HalfAdder(a=in[15],b=c14,sum=out[15],carry=c15);
}
加1後首位數一定 1->0 或相反
使用Nand連接達到效果
若變換前為1會進位,反之則不會
使用And連接得到進位與否
之後用半加器計算下一位數及進位
然後以此類推即可

image