在《我的世界》遊戲裡打造一臺計算機有多難?

在《我的世界》遊戲裡打造一臺計算機有多難?

一塊小小的CPU裡有多少個電晶體?幾十億個。

單槍匹馬造出一個CPU乃至完整的電腦需要多長時間?有位大牛在《我的世界》遊戲裡用實際行動回答了這個問題:可能要花費一年多。

這篇造計算機的教程一經轉載就在知乎上火了。

這並不是一篇遊戲攻略,而是來自復旦大學的季文瀚,寫的一篇課程論文。他在大二時就有了大膽的設想,經過一年的精心營造,建起了一個計算機雛形,取名Alpha21016。

雖然它不能與現實中的計算機相比,只能實現一些簡單的功能,但這臺計算機體積驚人,光看它複雜的結構就已經能感受工程量的巨大。

有網友感嘆,發課程論文可惜了,簡直可以發學術論文啊。

這臺計算機能做什麼

季文瀚計算機使用的是哈佛結構,而非更常見的馮·諾依曼結構。程式儲存器和資料儲存器分開放置。程式儲存器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計算器,改成了完全時序邏輯電路控制、且有溢位判斷的計算器——這在Minecraft紅石電路玩家裡,已是前所未有。

它借用CPU的ALU部分進行運算,並經過匯流排傳輸資料。CPU和計算器的大部分硬體,都在這張表格裡(略):

表上的40個硬體,除了指令譯碼器、指令發射端、異常中斷響應沒有做完,其他都做好了。還有一些小的硬體單元沒有列出來。

目前,CPU的ALU、主儲存器、和暫存器等EU部分已經完工,內部環狀匯流排已竣工,CU部分,也就是最繁瑣的部分,還沒有完工。

在《我的世界》遊戲裡打造一臺計算機有多難?

肉眼可見的威力

季文翰說,雖然還沒完全竣工,但CPU已經可以執行許多種機器指令 (以MOV為主) :通用暫存器賦值,按字/位元組+立即數/間接/直接定址。

其中,最容易用肉眼感受到威力的,還是借用CPU的ALU完成運算的計算器。

他在影片裡展現了加減乘除,正餘弦,以及平方根的計算。

在《我的世界》遊戲裡打造一臺計算機有多難?

從養著小豬的地方走樓梯下來,就是計算器的所在地了。這裡有兩排按鈕,還有顯示屏,如上圖。

在《我的世界》遊戲裡打造一臺計算機有多難?

屏幕後面,可以看到運轉的電路。

先做加減乘除。乘法和除法的運算量比較大:三位數乘三位數,大概需要20秒;除法更慢一些,電腦還會卡。

下圖就是除法,因為打了反除號 () ,所以被除數在右邊。左下是商,右下是餘數。

空間限制了算力,所以計算器要有溢位判斷,超過±32627的範圍就會報錯,顯示“E”。

不論是輸入的數還是計算結果,超出範圍都會報錯:

在《我的世界》遊戲裡打造一臺計算機有多難?

除以“0”,也會報錯。

注意,計算機用二進位制來計算,算好之後還要從二進位制轉成十進位制,才是最終的答案。這裡用到了BCD/BIN轉換演算法,把二進位制BIN碼,轉成十進位制BCD碼。

四則運算做完了,還有正餘弦,用的是Cordic旋轉迭代演算法:

需要多次迭代,所以運算比較慢,大概花了兩分鐘。

相比之下開根號就快許多,用的是快速平方根演算法:

20秒 (就) 開好了。

計算能力就展示到這裡。

而機智的你可能已經也感受到了,顯示器對於一臺計算機有多重要。那麼:顯示器怎麼做?

遊戲空間太狹窄,造顯示卡是不現實的:2×2個紅石燈,就是遊戲能控制的最小畫素了。

所以,季文翰做了字元顯示器。

首先,用七段顯示器來表示數字。

一個“日”字,是7根小棒組成的

比如,“4”就有左上、右上、中、右下,一共四根小棒。

每根小棒又由三個方塊組成。把這些方塊的活塞往回抽,就顯示出凹陷的“4”了。

而每個十進位制數,都可以對應二進位制的四位數,比如3是0011,9是1001。輸入二進位制數,螢幕就能顯示成十進位制。

數字搞定了,還有其他字元。季文翰用了自己設計的縮減版ASCII碼,只有不到64個字元:

給每個字元編個號:0,1,2,…,63。每個號碼,都可以轉成二進位制數00000-111111。

然後,顯示出來長這樣:

開啟夜視,螢火一般,美不勝收。

其實,這些字是“印”在了顯示器的鍵盤上,白天長這樣:

也就是說,計算機有了,顯示器有了,鍵盤也有了。

而這樣的傑作,居然來自一位“業餘選手”。

“我學的不是計算機”

現在來回顧一下,從邏輯閘到計算機,都要經歷什麼:

或門,非門

→與門,異或門

→全加器,訊號長度轉換器,多型選擇器,儲存器單元,譯碼器單元,求補碼單元,移位器單元

→可讀寫儲存器,譯碼器,加法器,移位器,時鐘發生器

→加減法器,乘法器,除法器,可讀寫儲存器陣列,暫存器,程式計數器

→匯流排,ALU,CU

→計算機

令人意外的是,造出這項複雜工程的季文瀚,是復旦大學2011級生命科學學院的本科生,沒有受過系統地計算機科學專業教育。他說,看到國外玩家的作品很感興趣,才自學了一些專業課。

大二便啟動了Alpha21016計算機的開發,作為《網路虛擬環境與計算機應用》這門課的專案來做的。

從他對技術細節的解讀來看,那時的季文翰,已經硬體和軟體上擁有無比充分的準備。

普通人的話,可能瞭解邏輯電路的基礎。普通紅石玩家的話,可以把邏輯電路的基礎知識,用來搭建簡單或複雜的紅石電路。

高階紅石玩家,也曾經在季文瀚的專案開始之前,造出過計算器。

但製造一臺計算機,並沒有多少人敢想。季文翰不但想到,還用了一整年去實現,幾近完成。

畢竟,如果有個容量驚人的大腦,總歸要拿來用的吧。

在《我的世界》遊戲裡打造一臺計算機有多難?