在學習CS50wk0的時候有學到電腦最底層都是一堆的0和1,當時就產生一堆的好奇心。感嘆每天自己使用的電子產品竟然都是從0和1這麼簡單的開和關一步步構造出來的。
所以在看到Nand2tetris part1課程號稱從NAND邏輯閘開始造一台可以跑簡單程式的電腦時,沒多想就開始上課了。
上完了前五章,我從一開始連Nor這種邏輯門都不能理解的人,看書然後跟著課程,慢慢從簡單的邏輯門開始,用模擬器構造出RAM/register/ALU,最後做出CPU。這個過程使用教授專門為了課程設計的硬體模擬語言HDL,在老師的指導下通過5週的作業做出了簡單的HACK電腦。不是真的連一堆電線,而是用模擬的方式學習背後的邏輯。
我的感受就是:哇!太神奇了。造就了現在聯繫數十億人的有史以來的最大的人類網路,只是電流加上最簡單的開和關(0和1)。也感嘆電腦科學的抽象化通過將各個部分模塊化然後組合在一起,最後可以產生如此複雜的系統。
雖然寫完作業做出電腦,但是心裡還是沒底,所以準備寫些文章總結下課程wk1-wk5所學,以提高學習留存率。
以下是正文:
電腦科學廣泛使用抽象化(Abstraction)的概念,把這門學科分為很多抽象層(Abstraction layer)。每一層關注自己的實作就可以了,把所有的底層知識當作理所當然。
下圖是Nand2tetris 課程實作項目,可以看出分了很多層,每一個底層完成就封裝起來直接使用。像是很多補習班會開設JAVA班或者C++班,直接教授高階語言,學員學習3個月就可就業,不用深入學習此層以下其他的知識,就得益於電腦科學的抽象化,也可以說是分層化或模塊化。

內容目錄
繼電器與邏輯門
上述層級最底層是由晶體管構建的邏輯門,而晶體管是建立在固態物理和量子理論基礎上的,理論深奧難理解。
晶體管本質上是一種開關,它有兩個前輩:繼電器和真空管。1944 第一台電腦Harvard Mark1使用繼電器, 1946 第一台可編程電腦ENIAC使用真空管,1947貝爾實驗室發明晶體管後,科技進步然後形成現在一個指甲大小到芯片上有數十億個晶體管。
我一開始學Nand2tetris課程看不懂邏輯門,然後看到CODE這本書,才發現用繼電器就可以幫助理解邏輯門後面的邏輯。
繼電器是利用電磁鐵產生的磁力吸引開關的金屬條,來達到控制開關的目的。有電流通過電磁鐵,電磁鐵產生磁力,會吸下上方的開關金屬片,從而閉合開關。

通過不同的方式連結繼電器就會製造出如下基本的的邏輯門。
1)AND gate
與門,兩個開關都閉合,讓電磁鐵產生磁力吸引兩個開關的彈簧片,從而閉合電路,點亮燈泡。

其中,V表示電源輸入,燈泡亮表示輸出為1,燈泡不亮表示輸出為0,下同。
真值表:
And | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
2)NOT gate(inverter)
反向器,開關閉合會拉下上方的金屬彈簧片,導致電流斷開,燈泡熄滅。

真值表:
NOT | |
0 | 1 |
1 | 0 |
3)OR gate
或門,有任意一個開關或者兩個都閉合,都可以接通電路。

真值表:
OR | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 1 |
4)NOR gate
或非門,兩個開關都打開,電路才能通,如果有任一開關閉合,電磁鐵產生電流,會吸引上方的彈簧片,導致電路斷開。

真值表:
NOR | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
5)NAND gate
因為燈泡有兩個電源輸入,任一個電路連通都會點亮燈泡。
此電路只有兩個輸入開關都閉合的情況下,才會導致燈泡熄滅。

真值表:
NAND | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
總結
所有的門都可以通過AND/OR/NOT來構造,也可以通過NAND來構造。比如:
- NOT(x)=(x)NAND(x),NAND的兩個信號一樣,兩個開關為0,輸出為1,兩個開關為1輸出為0。
- (x)AND(y)=NOT(x NAND y),把NAND門反過來,就獲得AND門。
- (x)OR(y)=(NOT x) NAND (NOT y),把信號取反,然後在連NAND門,獲得OR門。
這也是Nand2tetris這門課名字的來由,老師提供NAND,學生用NAND門構造出NOT/AND/OR後,在運用這些基礎邏輯門構造出如下的邏輯門,然後在這些邏輯門的基礎上構建整個電腦體系。
- Xor
- Mux
- DMux
- Not16
- And16
- Or16
- Mux16
- Or8Way
- Mux4Way16
- Mux8Way16
- DMux4Way
- DMux8Way