博客中的文章均爲meelo原創,請務必以連接形式註明本文地址(簡書同步更新地址)html
MOOC: Build a Modern Computer from First Principles: From Nand to Tetris
用第一原理設計現代計算機:從與非門到俄羅斯方塊
https://www.coursera.org/learn/build-a-computer/編程
從零開始設計一臺計算機,這就是這門公開課在宣傳片中許諾的。一開始是我是質疑的,做爲一個電子信息工程專業畢業的學生,大學4年,學完《模擬電路》、《數字電路》、《計算機組成原理》、《硬件描述語言》、《彙編語言》、《C語言》,對於如何設計一臺計算機能夠說,我徹底無從下手。app
這門課總共由12周,如今只放出來了前6周。每一週都創建在前一週的基礎上,把前一週所搭建的模塊看成基石,設計出更復雜的模塊。這種不一樣層次的抽象就是構建如此複雜的計算機的一個核心原則。dom
第一週ide
介紹了布爾函數。計算機的核心部分CPU、內存都是數字電路,數字電路所有都是有邏輯門構成的。與門、或門、非門是三種經常使用的邏輯門,在真實的芯片中其實它們都是由一種門與非門NAND獲得的,可見與非門是如此強大,造就了真實數字電路的「原子」是如此簡潔。第一週的任務就是基於與非門,用一種專門爲這門課程設計的硬件描述語言(Hardward Discription Language),把與非門看成原子,設計出與門、非門、或門、異或門、多路的與門/或門/非門/異或門、多路選擇器、多路分配器。下圖是用硬件描述語言實現一個與門。函數
第二週post
介紹了算數運算。CPU的核心功能就是進行運算,就是一個小學生都會的加減乘除或邏輯運算,然而計算機能夠算得如此之快,1秒能夠運算1000000000次。這一週首先介紹了數字在計算機中的表示——補碼,補碼可以把加法運算和減法運算統一塊兒來,而無需獨立地兩套邏輯。基於與門和異或門就能夠能夠實現一位的加法運算,這稱爲半加器(Half Adder)。稱爲半加器的緣由是兩個半加器才成獲得一個能用的加法器,半加器不能處理低位進位操做。有了加法器,進一步就能夠獲得算術邏輯單元(Arithmatic Logic Unit),算數邏輯單元不一樣於加法器的緣由是,它有一些控制電路,用於選擇輸入的數是進行何種操做?是加法、減法,仍是與運算、或運算?和一些額外的輸出,表示運算的結果是否爲零,是否爲正。別小看了這額外的輸出,它但是程序中判斷語句所不可或缺的硬件基礎,仔細想一想爲何吧。下圖表示算數邏輯單元的控制與對應的操做。ui
第三週url
介紹了時序邏輯電路。課程中並無像傳統的《數字電路》課程中講授,與非門是如何獲得觸發器等時序邏輯電路的,而是把它做爲了一個「原子」。配合多路選擇器、多路分配器和觸發器就能夠製做內存(Random Access Unit)了。這一步獲得的最大的內存是16K,也就是最終設計出的計算機的內存大小,以如今計算機內存的大小來看,簡直小的難以想象是吧。這一週除了內存外,設計的另外一個重要的電路就是程序計數器(Program Counter),其實就是一個計數器,能夠控制它作自加運算和載入一個數兩種操做。這分別對應着程序一行一行的順序執行和跳轉操做。可見這些簡單的電路都是真實計算機中不可或缺的一部分。spa
第四周
介紹了彙編語言。彙編語言可以直接轉換成計算機可以執行的2進制指令。課程中使用的彙編語言也徹底是爲這門課程所設計的。彙編指令能夠分爲兩種,一種描述運算,一種描述尋址。在彙編語言的程序中,你就能夠看見高級語言循環、判斷語句的影子了。這一週的任務就是編寫一個簡單的彙編程序,實現乘法運算。如今大多數CPU,在硬件層面就可以實現乘法運算,這門課程的一個宗旨是儘量的「簡潔」,乘法運算就交給軟件實現了。
第五週
介紹了中央處理器(Center Process Unit)。這算是這門課程的一個小高潮了,前面幾周所搭建的電路會統統用在CPU裏,這一週的一個任務就是設計CPU,還好老師給出了CPU的框圖,留給咱們須要思考的是不一樣模塊之間的控制邏輯。下面就是CPU的結構圖。
有了CPU、內存,就能夠搭建一個完成的計算機了,現代的計算機都是馮諾依曼結構,內存分爲數據內存、和指令內存兩個部分。
第六週
介紹了彙編器。彙編器就是把彙編語言轉換成,CPU可以執行的二進制代碼。從前面幾周過來,你會清晰地認識到,每一條二進制代碼會有操做的數據和控制指令兩部分構成。你會驚訝的發現二進制代碼的幾位控制位如何精細地對應着算數邏輯單元控制進行何種運算,如何控制着從內存、仍是CPU裏的寄存器獲取數據。這一週的任務是設計一個彙編器,對於沒有任何編程基礎的人,這一週也許有些困難。通過一些波折,我用Python200行完成了這個彙編器。
完成這門課,能夠說是成就感滿滿,老師把計算機如此複雜的一個系統,一層一層拆分紅了不少模塊,同時保證每一週內容的難度都可以被一個徹底沒有計算機基礎的人接受,着實是這門課無與倫比之處。開這門課程的教師Shimon Schocken是一個偉大的教育家,它把這個課程的設計過程還寫成了:http://shimonschocken.com/wp-content/uploads/2011/09/Synthesis-course.pdf,還在TED做了一個演講,其中講述了他的教學理念:http://www.ted.com/talks /shimon_schocken_the_self_organizing_computer_course,或者https: //www.youtube.com/watch?v=iE7YRHxwoDs。在演講中提到,在美國有人自發的組織起來教授課程的內容,一位中國的大學生用可編程邏輯器件實現了整個計算機的設計。
對於我來講,這門課是對極客精神最好的闡述,極客們喜歡把複雜的東西支離破碎,而後設計出新的發明,這正是這門課程所作的。願極客精神永駐!