博客中的文章均為meelo原創(chuàng)夹抗,請(qǐng)務(wù)必以鏈接形式注明本文地址
MOOC: Build a Modern Computer from First Principles: From Nand to Tetris用第一原理設(shè)計(jì)現(xiàn)代計(jì)算機(jī):從與非門到俄羅斯方塊https://www.coursera.org/learn/build-a-computer/
從零開始設(shè)計(jì)一臺(tái)計(jì)算機(jī)擂找,這就是這門公開課在宣傳片中許諾的拥知。一開始是我是質(zhì)疑的他挎,作為一個(gè)電子信息工程專業(yè)畢業(yè)的學(xué)生拷橘,大學(xué)4年恢筝,學(xué)完《模擬電路》诞外、《數(shù)字電路》鲸伴、《計(jì)算機(jī)組成原理》府蔗、《硬件描述語言》、《匯編語言》汞窗、《C語言》姓赤,對(duì)于如何設(shè)計(jì)一臺(tái)計(jì)算機(jī)可以說,我完全無從下手仲吏。
這門課總共由12周不铆,現(xiàn)在只放出來了前6周蝌焚。每一周都建立在前一周的基礎(chǔ)上,把前一周所搭建的模塊當(dāng)作基石誓斥,設(shè)計(jì)出更復(fù)雜的模塊只洒。這種不同層次的抽象就是構(gòu)建如此復(fù)雜的計(jì)算機(jī)的一個(gè)核心原則。
第一周
介紹了布爾函數(shù)劳坑。計(jì)算機(jī)的核心部分CPU毕谴、內(nèi)存都是數(shù)字電路,數(shù)字電路全部都是有邏輯門構(gòu)成的距芬。與門涝开、或門、非門是三種常用的邏輯門框仔,在真實(shí)的芯片中其實(shí)它們都是由一種門與非門NAND得到的舀武,可見與非門是如此強(qiáng)大,造就了真實(shí)數(shù)字電路的“原子”是如此簡潔存和。第一周的任務(wù)就是基于與非門奕剃,用一種專門為這門課程設(shè)計(jì)的硬件描述語言(Hardward Discription Language),把與非門當(dāng)作原子捐腿,設(shè)計(jì)出與門纵朋、非門、或門茄袖、異或門操软、多路的與門/或門/非門/異或門、多路選擇器宪祥、多路分配器聂薪。下圖是用硬件描述語言實(shí)現(xiàn)一個(gè)與門。
第二周
介紹了算數(shù)運(yùn)算蝗羊。CPU的核心功能就是進(jìn)行運(yùn)算藏澳,就是一個(gè)小學(xué)生都會(huì)的加減乘除或邏輯運(yùn)算,然而計(jì)算機(jī)可以算得如此之快耀找,1秒可以運(yùn)算1000000000次翔悠。這一周首先介紹了數(shù)字在計(jì)算機(jī)中的表示——補(bǔ)碼,補(bǔ)碼能夠把加法運(yùn)算和減法運(yùn)算統(tǒng)一起來野芒,而無需獨(dú)立地兩套邏輯蓄愁。基于與門和異或門就可以可以實(shí)現(xiàn)一位的加法運(yùn)算狞悲,這稱為半加器(Half Adder)撮抓。稱為半加器的原因是兩個(gè)半加器才成得到一個(gè)能用的加法器,半加器不能處理低位進(jìn)位操作摇锋。有了加法器丹拯,進(jìn)一步就可以得到算術(shù)邏輯單元(Arithmatic Logic Unit)站超,算數(shù)邏輯單元不同于加法器的原因是,它有一些控制電路咽笼,用于選擇輸入的數(shù)是進(jìn)行何種操作顷编?是加法、減法剑刑,還是與運(yùn)算媳纬、或運(yùn)算?和一些額外的輸出施掏,表示運(yùn)算的結(jié)果是否為零钮惠,是否為正。別小看了這額外的輸出七芭,它可是程序中判斷語句所不可或缺的硬件基礎(chǔ)素挽,仔細(xì)想想為什么吧。下圖表示算數(shù)邏輯單元的控制與對(duì)應(yīng)的操作狸驳。
第三周
介紹了時(shí)序邏輯電路预明。課程中并沒有像傳統(tǒng)的《數(shù)字電路》課程中講授,與非門是如何得到觸發(fā)器等時(shí)序邏輯電路的耙箍,而是把它作為了一個(gè)“原子”撰糠。配合多路選擇器、多路分配器和觸發(fā)器就可以制作內(nèi)存(Random Access Unit)了辩昆。這一步得到的最大的內(nèi)存是16K阅酪,也就是最終設(shè)計(jì)出的計(jì)算機(jī)的內(nèi)存大小,以現(xiàn)在計(jì)算機(jī)內(nèi)存的大小來看汁针,簡直小的不可思議是吧术辐。這一周除了內(nèi)存外,設(shè)計(jì)的另一個(gè)重要的電路就是程序計(jì)數(shù)器(Program Counter)施无,其實(shí)就是一個(gè)計(jì)數(shù)器辉词,可以控制它做自加運(yùn)算和載入一個(gè)數(shù)兩種操作。這分別對(duì)應(yīng)著程序一行一行的順序執(zhí)行和跳轉(zhuǎn)操作猾骡〗嫌欤可見這些簡單的電路都是真實(shí)計(jì)算機(jī)中不可或缺的一部分。
第四周
介紹了匯編語言卓练。匯編語言能夠直接轉(zhuǎn)換成計(jì)算機(jī)能夠執(zhí)行的2進(jìn)制指令。課程中使用的匯編語言也完全是為這門課程所設(shè)計(jì)的购啄。匯編指令可以分為兩種襟企,一種描述運(yùn)算,一種描述尋址狮含。在匯編語言的程序中顽悼,你就可以看見高級(jí)語言循環(huán)曼振、判斷語句的影子了。這一周的任務(wù)就是編寫一個(gè)簡單的匯編程序蔚龙,實(shí)現(xiàn)乘法運(yùn)算”溃現(xiàn)在大多數(shù)CPU,在硬件層面就能夠?qū)崿F(xiàn)乘法運(yùn)算木羹,這門課程的一個(gè)宗旨是盡可能的“簡潔”甲雅,乘法運(yùn)算就交給軟件實(shí)現(xiàn)了。
第五周
介紹了中央處理器(Center Process Unit)坑填。這算是這門課程的一個(gè)小高潮了抛人,前面幾周所搭建的電路會(huì)通通用在CPU里,這一周的一個(gè)任務(wù)就是設(shè)計(jì)CPU脐瑰,還好老師給出了CPU的框圖妖枚,留給我們需要思考的是不同模塊之間的控制邏輯。下面就是CPU的結(jié)構(gòu)圖苍在。
有了CPU绝页、內(nèi)存,就可以搭建一個(gè)完成的計(jì)算機(jī)了寂恬,現(xiàn)代的計(jì)算機(jī)都是馮諾依曼結(jié)構(gòu)续誉,內(nèi)存分為數(shù)據(jù)內(nèi)存、和指令內(nèi)存兩個(gè)部分掠剑。
第六周
介紹了匯編器屈芜。匯編器就是把匯編語言轉(zhuǎn)換成,CPU能夠執(zhí)行的二進(jìn)制代碼朴译。從前面幾周過來井佑,你會(huì)清晰地認(rèn)識(shí)到,每一條二進(jìn)制代碼會(huì)有操作的數(shù)據(jù)和控制指令兩部分構(gòu)成眠寿。你會(huì)驚訝的發(fā)現(xiàn)二進(jìn)制代碼的幾位控制位如何精細(xì)地對(duì)應(yīng)著算數(shù)邏輯單元控制進(jìn)行何種運(yùn)算躬翁,如何控制著從內(nèi)存、還是CPU里的寄存器獲取數(shù)據(jù)盯拱。這一周的任務(wù)是設(shè)計(jì)一個(gè)匯編器盒发,對(duì)于沒有任何編程基礎(chǔ)的人,這一周也許有些困難狡逢。經(jīng)過一些波折宁舰,我用Python200行完成了這個(gè)匯編器。
完成這門課奢浑,可以說是成就感滿滿蛮艰,老師把計(jì)算機(jī)如此復(fù)雜的一個(gè)系統(tǒng),一層一層拆分成了很多模塊雀彼,同時(shí)保證每一周內(nèi)容的難度都能夠被一個(gè)完全沒有計(jì)算機(jī)基礎(chǔ)的人接受壤蚜,著實(shí)是這門課無與倫比之處即寡。開這門課程的教師Shimon Schocken是一個(gè)偉大的教育家,它把這個(gè)課程的設(shè)計(jì)過程還寫成了:http://shimonschocken.com/wp-content/uploads/2011/09/Synthesis-course.pdf袜刷,還在TED作了一個(gè)演講聪富,其中講述了他的教學(xué)理念:http://www.ted.com/talks /shimon_schocken_the_self_organizing_computer_course,或者h(yuǎn)ttps: //www.youtube.com/watch?v=iE7YRHxwoDs著蟹。在演講中提到墩蔓,在美國有人自發(fā)的組織起來教授課程的內(nèi)容,一位中國的大學(xué)生用可編程邏輯器件實(shí)現(xiàn)了整個(gè)計(jì)算機(jī)的設(shè)計(jì)草则。
對(duì)于我來說钢拧,這門課是對(duì)極客精神最好的闡述,極客們喜歡把復(fù)雜的東西支離破碎炕横,然后設(shè)計(jì)出新的發(fā)明源内,這正是這門課程所做的。愿極客精神永駐份殿!