從零構(gòu)建現(xiàn)代計(jì)算機(jī)[From Nand to Tetris]

博客中的文章均為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ā)明源内,這正是這門課程所做的。愿極客精神永駐份殿!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膜钓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卿嘲,更是在濱河造成了極大的恐慌颂斜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拾枣,死亡現(xiàn)場(chǎng)離奇詭異沃疮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梅肤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門司蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姨蝴,你說我怎么就攤上這事俊啼。” “怎么了左医?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵授帕,是天一觀的道長。 經(jīng)常有香客問我浮梢,道長跛十,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任秕硝,我火速辦了婚禮偶器,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己屏轰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布憋飞。 她就那樣靜靜地躺著霎苗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榛做。 梳的紋絲不亂的頭發(fā)上唁盏,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音检眯,去河邊找鬼厘擂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锰瘸,可吹牛的內(nèi)容都是我干的刽严。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼避凝,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舞萄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起管削,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤倒脓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后含思,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崎弃,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年含潘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饲做。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡调鬓,死狀恐怖艇炎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腾窝,我是刑警寧澤缀踪,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站虹脯,受9級(jí)特大地震影響驴娃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜循集,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一唇敞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦疆柔、人聲如沸咒精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽模叙。三九已至,卻和暖如春鞋屈,著一層夾襖步出監(jiān)牢的瞬間范咨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工厂庇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渠啊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓权旷,卻偏偏與公主長得像替蛉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炼杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容