HalfAdder
半加法器,兩個bit相加,輸出sum和carry
1 | // This file is part of www.nand2tetris.org |
FullAdder
全加法器
三個bit相加,需要考慮進位後的總合,可以利用半加法器組合
1 | // This file is part of www.nand2tetris.org |
Adder16
16位元加法,考慮進位
1 | // and the book "The Elements of Computing Systems" |
Inc16
進位器,輸出就是in + 1 , 可以將 1的補數 化為2的補數,使作補數時不會有+0 -0
1 | // This file is part of www.nand2tetris.org |
1的補數很單純,就是對每一個bit做反向,實作signed number,但是這種做法使例如
n’s bit if n= 4 ;
+0 >> 0000 >> 1的補數 >> 1111 >> -0
+1 >> 0001 >> 1的補數 >> 1110 >> -1
但若我們使用2的補數
+0 >> 0000 >> 1的補數 >> 1111 >>再+1 >> 0000 (捨去carry out 的位元) >> +0
而4bit可以表達 7~ -8 -> 2的補數的概念有點類似模數運算,
使數字就算產生溢位也可以回到範圍內。
我們有了加法器 ,以及補數的概念,就可以開始寫ALU 算術邏輯單元
1 | // This file is part of www.nand2tetris.org |
注意的點:
不管if else 先把功能寫出來,再利用多工器做功能選擇,sel bit 是表上的條件式
在實作zr 以及 ng這兩個bit時遇到了一些困難
zr : out == 0 時輸出 1
每個bit做or 就知道這之間有沒有出現1了
最後因為要輸出1 所以反相
ng: 是否小於0 所以要預留輸出線路為MSB (Nand2Teris為 Little Endian)
為了功能實作方便,可以指定某些範圍的bit儲存到另一個變數,因為內部pin角不可讀取特定範圍的位元。