第一周
介紹
這是啥?
這是一個由希伯來大學的 Shimon Schocken與 Noam Nisan講授的課程。
教你從最簡單的與非門實現(xiàn)計算機辛润,并在計算機上實現(xiàn)操作系統(tǒng)锰霜,最后在構建的計算機上完成俄羅斯方塊的制作。
官網主頁:http://www.nand2tetris.org
Coursera課程主頁:https://www.coursera.org/learn/build-a-computer
我將它的視頻課程搬運到了B站磺送,方便大家學習:https://space.bilibili.com/69824765/#/channel/detail?cid=56426
如果能科學上網的話车份,也可以在youtube搜索Nand2Tetris谋减。
什么是Nand2Tetris
Nand就是與非門電路:
Tetris就是俄羅斯方塊。
我們知道計算機就是由各種門電路組成的躬充,所以作者的這個課程就是從最基礎的與非門電路開始逃顶,構建一個計算機,在計算機上實現(xiàn)操作系統(tǒng)充甚,然后在操作系統(tǒng)中玩俄羅斯方塊以政。是不是很有意思?
開始
開始之前伴找,要做點準備工作:
1. 下載初始代碼與測試工具
2. 下載JDK
作者給我們提供了一個硬件模擬工具盈蛮,我們通過編輯.hdl
文件來描述一個門電路的邏輯,然后使用測試工具就可以測試我們設計的門電路是否正確技矮。由于測試工具是基于Java的抖誉,需要下載安裝JDk,怎么安裝請自行百度衰倦。
初始代碼與測試工具都在這里下載:https://www.nand2tetris.org/software
第一周01
其實第一周應該是00袒炉,但是00其實是作者為了讓學者熟悉環(huán)境用的,所以我就跳過了樊零。
.hdl文件
這個項目中我磁,門電路是由.hdl文件來實現(xiàn)的,就是下面這樣:
在中間的注釋部分驻襟,告訴了你這個門的輸入輸出的關系夺艰,你需要完成PARTS。
下面的IN就是輸入端沉衣,OUT就是輸出端郁副。PARTS中寫上如何將信號a與b輸出即可(具體怎么寫繼續(xù)看下去)。
目標
這一周主要是完成四個門電路豌习,以及他們的多位復合電路:
1. Not 非門
2. And 與門
3. Or 或門
4. Xor 異或門
5. Mux 多路選擇器/多路開關
6. DMux 數據分配器
7. And16 16位的與門
8. DMux4Way 4通道的數據分配器
9. DMux8Way 8通道的數據分配器
10. Mux16 16位多路選擇器
11. Mux4Way16 4通道的16位多路選擇器
12. Mux8Way16 8通道的16位多路選擇器
13. Not16 16位的非門
14. Or16 16位的或門
15. Or8Way 8通道的或門
1. Not - 非門
我們現(xiàn)在只有一個門存谎,就是Nand門,看一下這個東西的真值表:
a | b | out |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
觀察第二行與第四行肥隆,b為1的時候愕贡,out總是等于非a。
所以就這樣實現(xiàn)非門了:
然后來測試一下巷屿,打開Tools文件夾下的 HardwareSimulator.bat (macOS下打開HardwareSimulator.sh, 如果打開不了檢查java環(huán)境是否配好)
點擊紅色旗子旁邊的腳本按鈕,選擇 nand2tetris > 01 > Not.tst
墩虹,然后按左邊的第三個前進按鈕
然后腳本就會自動導入你寫的Not.hdl嘱巾,然后測試這個門到底正不正確憨琳,如果輸入1輸出也是1的話,肯定就會錯了旬昭。如果沒有問題篙螟,就會一直跑完,這樣:
這樣就完成了一個門问拘,然后我們現(xiàn)在有兩個門了遍略,Nand與非門與Not非門,再用這兩個門來完成其他的門電路骤坐。
其他And绪杏、Or這幾個門就不多說了自己做吧,直接來說Mux纽绍。
Mux 多路選擇器
這個門有三個輸入蕾久,a,b拌夏,sel僧著。
當sel = false時,輸出a障簿,當sel=true時輸出b盹愚。
這里我們可以自己想出一個公式,至于公式怎么出來的站故,可以百度一下卡諾圖化簡皆怕。
out = Or(
And(
Not(sel), a
),
And(
sel, a
)
)
所以最后實現(xiàn)Mux:
基礎門
基礎門這里就詳細寫兩個,其他的And世蔗,Or端逼,Dmux都自己想辦法通過已經實現(xiàn)的門來實現(xiàn)吧。如果遇到問題污淋,可以在百度搜索卡諾圖化簡通過真值表化簡出公式顶滩,再不濟就去github上面搜索Nand2Tetris,看看別人都是怎么實現(xiàn)的寸爆。
復合多路門我這里也只詳細介紹And16與DMux4Way礁鲁,參考這兩個實現(xiàn)其他的就好。
And16
在And16.hdl中赁豆,它是這樣描述的:
即: out[i] = And(a[i], b[i])
所以每個都寫一遍出來就好了仅醇,不要想循環(huán)啊啥的,現(xiàn)在你手頭只有Nand魔种,And析二,Not,Or這幾個門電路,所以只能手寫叶摄。
最后實現(xiàn)方案:
DMux4Way
看看介紹:
前面已經實現(xiàn)了DMux属韧,當sel=0
時輸出{in, 0}
,sel=1
時輸出{0蛤吓, in}
宵喂。也就是說是sel來決定in在左邊還是在右邊。
在4Way中会傲,可以看作兩次選擇:
PS: 在.hdl中锅棕,如果sel = 01,則sel[1] = 0淌山,sel[0] = 1裸燎,也就是倒序的。
sel[1]決定in出現(xiàn)在前兩個還是后兩個的位置中艾岂。
sel[0]決定in出現(xiàn)在兩個中的前一個還是后一個位置顺少。
我們把輸出{a, b, c, d}
分成兩部分{a, b}
和{c, d}
,
先根據sel[1]將這兩部分的元素都置為相同的in或0
DMux(in=in, sel=sel[1], a=left1, b=right1); ①
DMux(in=in, sel=sel[1], a=left2, b=right2); ②
這樣的結果將會是{0, 0, in, in}
或{in, in, 0, 0}
left1和left2肯定是相同的王浴,right1和right2肯定是相同的脆炎。
然后根據sel[0]將前兩個和后兩個部分設置出來,:
DMux(in=left1, sel=sel[0], a=a, b=b);
DMux(in=right1, sel=sel[0], a=c, b=d);
OK
基礎門和復合門都可以參照這幾個有代表性的來做氓辣,寫完之后使用工具測試一下寫的對不對秒裕,測試都通過,這一周的門電路就算全部完成了钞啸。
結語
這一周實現(xiàn)的這些基礎電路后面會再次封裝几蜻,變成功能更強大的工具。