一塊小小的CPU里有多少個晶體管?幾十億個。
單槍匹馬造出一個CPU乃至完整的電腦需要多長時間?有位大牛在《我的世界》游戲里用實際行動回答了這個問題:可能要花費一年多。這篇造計算機的教程一經轉載就在知乎上火了。
這并不是一篇游戲攻略,而是來自復旦大學的季文瀚,寫的一篇課程論文。他在大二時就有了大膽的設想,經過一年的精心營造,建起了一個計算機雛形,取名。雖然它不能與現實中的計算機相比,只能實現一些簡單的功能,但這臺計算機體積驚人,光看它復雜的結構就已經能感受工程量的巨大。有網友感嘆,發課程論文可惜了,簡直可以發學術論文啊。這臺計算機能做什么季文瀚計算機使用的是哈佛結構,而非更常見的馮·諾依曼結構。程序儲存器和數據儲存器分開放置。程序儲存器1kb,數據儲存器0.5kb。它可以實現各種函數運算:加減乘除、三角函數還有矩陣運算。它包含一個16bit的CPU和一個32bit的浮點運算單元 (FPU) 。
從硬件上看,它是個超大規模集成電路,邏輯門總數大概在5萬-10萬門之間。光是存儲器堆疊起來就有8層。
要造出這樣一臺計算機,數字電路、微機原理、匯編語言、編譯原理都不能少。想想你掛過哪幾門課,從學會到熟練運用就更難了。
有了專業知識的支持,就能將計算機拆解成基本的部件。我們都知道計算機的基礎是數字電路,數字電路的基礎是“門”,季文瀚用游戲里基本的“紅石電路”搭建出了邏輯門。從邏輯門出發,再搭建出組合電路、時序電路、觸發器,有了這些就能組成CPU的一些基本單元,最終造出整個計算機。現實世界中,晶體管是數字電路的基礎;在《我的世界》中,紅石電路是構成復雜電路的基本單元。
紅石電路玩家,只用火把和方塊,就能造出基本的邏輯門:或門和非門。或門和非門的組合可以造出與門、異或門等任意邏輯門。
但僅僅知道怎么制造邏輯門離造出計算機還很遠,可能大致相當于造出漢字筆畫到寫出《紅樓夢》的距離。季文瀚先給自己的CPU架構畫了一個草圖:
其中每一個方框都代表一個或若干個硬件單元,小一點的大約一兩百個門電路,大的有幾千個門電路。這個密密麻麻的部分,也只是架構的右半部分而已:
知道了CPU的基本架構,再按照架構圖分別造出每個部分,比如CPU的重要模塊“算數邏輯單元”(ALU)和“指令寄存器”(IR),工程量很大。
算數邏輯單元還能進一步拆解電腦計算器怎么算反三角函數,它的加法器由數個全加器組成,上面基本的邏輯門可以組成加法器中最基本的全加器(下圖) 。
全加器也是計算機的一個核心部件。同時,《我的世界》還提供的基于活塞機械的斷路,用信號控制電路的通斷,也就是繼電器。利用繼電器和邏輯門的組合可以造出存儲器。
計算器→單片機→計算機大概是因為太復雜,季文瀚一開始也沒想直接搭個計算機。最初,他的目標是造出一臺16 bit的簡單計算器。但做到一半,他就覺得可以實現更復雜的東西,于是想改成單片機:這是具有“圖靈完備性”,可以執行一切計算機程序的簡單計算機。他規劃了指令集架構,儲存器架構,以及指令發射方式等等。后來,觸發器、可讀寫儲存器、緩沖隊列等等重要電路,季文瀚都設計成功了。
有了這些,少年又做了更雄偉的計劃:做個16 bit的CPU。CPU旁邊,還有一個包含超越函數的單精度32 bit浮點處理器(FPU) 。這里,計算器作為片外系統,并沒有被拋棄。季文瀚把16 bit計算器,改成了完全時序邏輯電路控制、且有溢出判斷的計算器——這在紅石電路玩家里,已是前所未有。它借用CPU的ALU部分進行運算,并經過總線傳輸數據。CPU和計算器的大部分硬件,都在這張表格里:
表上的40個硬件,除了指令譯碼器、指令發射端、異常中斷響應沒有做完,其他都做好了。還有一些小的硬件單元沒有列出來。
目前,CPU的ALU、主儲存器、和寄存器等EU部分已經完工,內部環狀總線已竣工,CU部分,也就是最繁瑣的部分,還沒有完工。
肉眼可見的威力季文瀚說,雖然還沒完全竣工,但CPU已經可以執行許多種機器指令 (以MOV為主) :通用寄存器賦值,按字/字節+立即數/間接/直接尋址。
其中,最容易用肉眼感受到威力的,還是借用CPU的ALU完成運算的計算器。他在視頻里展現了加減乘除,正余弦,以及平方根的計算。
從養著小豬的地方走樓梯下來,就是計算器的所在地了。這里有兩排按鈕電腦計算器怎么算反三角函數,還有顯示屏,如上圖。
屏幕后面,可以看到運轉的電路。
先做加減乘除。比如加法:減法也是同理。只不過,負號和減號在這里分成了兩個按鈕。
乘法和除法的運算量比較大:三位數乘三位數,大概需要20秒;除法更慢一些,電腦還會卡。下圖就是除法,因為打了反除號() ,所以被除數在右邊。左下是商,右下是余數。
空間限制了算力,所以計算器要有溢出判斷,超過±32627的范圍就會報錯,顯示“E”。
不論是輸入的數還是計算結果,超出范圍都會報錯:
除以“0”,也會報錯。注意,計算機用二進制來計算,算好之后還要從二進制轉成十進制,才是最終的答案。這里用到了BCD/BIN轉換算法,把二進制BIN碼,轉成十進制BCD碼。四則運算做完了,還有正余弦,用的是旋轉迭代算法:
需要多次迭代,所以運算比較慢,大概花了兩分鐘。
相比之下開根號就快許多,用的是快速平方根算法:
20秒 (就) 開好了。
計算能力就展示到這里。而機智的你可能已經也感受到了,顯示器對于一臺計算機有多重要。那么:顯示器怎么做?游戲空間太狹窄,造顯卡是不現實的:2×2個紅石燈,就是游戲能控制的最小像素了。所以,季文瀚做了字符顯示器。首先,用七段顯示器來表示數字。
△一個“日”字,是7根小棒組成的比如,“4”就有左上、右上、中、右下,一共四根小棒。每根小棒又由三個方塊組成。把這些方塊的活塞往回抽,就顯示出凹陷的“4”了。而每個十進制數,都可以對應二進制的四位數,比如3是0011,9是1001。輸入二進制數,屏幕就能顯示成十進制。數字搞定了,還有其他字符。季文瀚用了自己設計的縮減版ASCII碼,只有不到64個字符:
給每個字符編個號:0,1,2,…,63。每個號碼,都可以轉成二進制數00000-。
然后,顯示出來長這樣:
打開夜視,螢火一般,美不勝收。
其實,這些字是“印”在了顯示器的鍵盤上,白天長這樣:
也就是說,計算機有了,顯示器有了,鍵盤也有了。
而這樣的杰作,居然來自一位“業余選手”。“我學的不是計算機”現在來回顧一下,從邏輯門到計算機,都要經歷什么:
或門,非門→與門,異或門→全加器,信號長度轉換器,多態選擇器,儲存器單元,譯碼器單元,求補碼單元,移位器單元→可讀寫儲存器,譯碼器,加法器,移位器,時鐘發生器→加減法器,乘法器,除法器,可讀寫儲存器陣列,寄存器,程序計數器→總線,ALU,CU→計算機令人意外的是,造出這項復雜工程的季文瀚,是復旦大學2011級生命科學學院的本科生,沒有受過系統地計算機科學專業教育。他說,看到國外玩家的作品很感興趣,才自學了一些專業課。
大二便啟動了計算機的開發,作為《網絡虛擬環境與計算機應用》這門課的項目來做的。
從他對技術細節的解讀來看,那時的季文瀚,已經硬件和軟件上擁有無比充分的準備。
普通人的話,可能了解邏輯電路的基礎。普通紅石玩家的話,可以把邏輯電路的基礎知識,用來搭建簡單或復雜的紅石電路。高階紅石玩家,也曾經在季文瀚的項目開始之前,造出過計算器。但制造一臺計算機,并沒有多少人敢想。季文瀚不但想到,還用了一整年去實現,幾近完成。
畢竟,如果有個容量驚人的大腦,總歸要拿來用的吧。