你可以幫助我們來翻譯此條目,但請勿使用機器翻譯。
本文旨在探討Minecraft中計算系統的設計和實現。
第一章, 建造一台計算機,這是一個關於如何在Minecraft中建造計算機以及如何擴展與改進的詳細教學。不需要讀者了解大量的計算機科學方面的知識。(尚未完成)
第二章, 紅石計算機的規劃,提供了在Minecraft中設計與理解一個紅石計算機的基本概念。不需要讀者了解大量的計算機科學方面的知識。
概述
計算機促進了人們透過編程與其交流的想法的實現。
這篇文章將會為在Minecraft中設計與建造計算機打下基礎,假定讀者相當熟悉紅石並且有基本水平的計算機知識。
事實上在不了解計算機是如何工作的情況下是無法建造計算機的。此教學旨在解釋你需要知道的所有內容,但也確實需要一點對計算機科學的了解。涉及的最深層次達到IGCSE[注 1] CS(計算機科學)。
所有的計算機系統都至少有一個處理單元。在執行時,處理單元執行儲存在計算機記憶體中的指令。為了在Minecraft中建造計算機能有一個良好的開始,你應該學習計算機科學。有非常多的資源與教學可以用來學習計算機科學,但是推薦觀看Crash Course Computer Science作為入門課程,尤其是1-8節。儘管它不夠透徹,但其內容可以作為你理解計算機的基礎。
在Minecraft中,大多數計算機是由紅石粉,紅石火把以及紅石中繼器組成的,以引起黏性活塞或者紅石燈的變化。它們被一系列的按鈕,控制桿,壓力板等等所控制。另外一些方法(本文沒有涉及)利用了漏斗,礦車或船與紅石。
第一章 建造一台計算機,這是一個關於如何在Minecraft中建造計算機以及如何擴展與改進的詳細教學。不需要讀者了解大量的計算機科學方面的知識,因為教學會對其進行解釋,但是會深入研究。
第二章 紅石計算機的規劃,提供了在Minecraft中設計與理解一個紅石計算機的基本概念。不需要讀者了解大量的計算機科學方面的知識,因為教學會對其進行解釋,但是會深入研究。
實現
計算機與計算器的區別在於計算器在沒有使用者輸入時無法連續執行複雜的指令,而計算機可以連續比較並處理指令來完成任務。計算機可以被用在很多方面,從創造一個智慧房屋到執行一張冒險地圖。但是,由於Minecraft對於計算機的限制(將會在後文說明),它們仍然只是個抽象概念,但也是理解CPU結構與嵌入式系統的良好工具。
由於Minecraft中的紅石計算機非常慢並且臃腫,很難為它們找到實際應用。即使是最快的紅石計算機也要花數秒來完成一次計算,還有著數千方塊大的體積。因為指令方塊的速度快且有著清晰且高級的指令,所以它們相比於紅石計算機有很大的優勢。
有一些Mod可以改變計算機的速度,比如TickrateChanger能改變遊戲刻速率。
第一章 建造一台計算機
介紹與條件
紅石的邏輯緊密地反映了二進位邏輯,應為紅石可以是啟動或非啟動的,可以被解釋為0或1。在本教學中,我們將提到基礎的二進位邏輯與眾多簡單的計算機科學術語。這裡有一篇文章,很好地解釋了二進位以及如何轉化到二進位。請讀計算機的結構一節,因為接下來我們對於計算機的設計是基於此的。
這一章會關注於知識的運用與紅石的操作,以來創造一台簡單的8位元計算機, 並且會解釋如何建造以及它是如何工作的。
所有的主題被分為了(理論)與(實踐)兩部分。理論部分會深入解釋會發生什麼,而實踐部分會說明如何在Minecraft中建造,它應該是什麼樣子,以及可能的存檔。
- 我們將要建造的計算機(MASIC計算機)
- 步驟1:記憶體和地址解碼器(理論) (未完成)
- 步驟1:記憶體和地址解碼器(實踐)
- 步驟2:構建算術邏輯單元(理論)
- 步驟2:構建算術邏輯單元(實踐) (未完成)
- 步驟3:指令集和機器結構(理論)
- 步驟3:指令集和機器結構(實踐) (未完成)
在Minecraft中,為了讓你的紅石計算機最適合你手頭的任務,需要有以下三個主要的設計目標。而有些得失需要進行考慮,比如當計算機的規模越大時,執行速度就會更慢,因為紅石中繼器的數量會隨著距離的增加而增加。越多的記憶體,意味著速度就越慢,體積越大。
- 緊湊程度
這台計算機的規模有多小?在Minecraft中,設計一台生存模式的計算機很大可能會強調這一點。所需的重複次數將隨著大小的增加而增加。
- 記憶體大小
它能容納多少的記憶體?它可以計算多少數字和字節?這對於大規模的計算機來說是很重要的,如那些可以完成更複雜算法和更大規模指令集的計算機(例如說,計算平方根或是三角學)記憶體大小或者位體系結構越大,計算機越複雜。
- 速度/效能
它能以多快的速度執行操作呢?它是否達到了最大最佳化的程度以執行工作呢?使用客製化設計構建一個計算機可以將更多的任務和分配給硬體,從而大大地提升計算機的效能。這在現實世界中的某些超級計算機中表現得很明顯,這些超級計算機可以非常高效地進行一些操作。Minecraft中的紅石計算機速度是非常慢的,一些模組,例如TickrateChanger可以變更Minecraft遊戲用戶端的遊戲刻速度,以提高計算機速度。
MASIC計算機
我們將在本教學中製作的計算機擁有8比特、16位元組的記憶體。我們將要製作的輸入輸出系統是一個七段的數字顯示器(以顯示十六進位數字)和一個控制面板。
MASIC計算機旨在成為一種適合所有人的計算機,並且不專門從事一項任務,因此它可以透過讀取其自己的記憶體進行完全編程(在第2節:指令集中進行了說明)。簡單的I/O(輸入/輸出)非常適合多種用途,並且儲存器大小足夠。它以相當快的速度執行(由於其體積小)。
步驟1:記憶體和地址解碼器(理論)
解碼器將二進位的數字轉換為小數。例如,看著8位元解碼器,00點亮代表0的第一個燈,01點亮代表1的第二個燈,10點亮代表2的第三個燈,11點亮代表3的最後一個燈。
步驟1:記憶體和地址解碼器(實踐)
地址解碼器
0000 0000(注意第一條輸出已亮起)
0000 0001(注意第二條輸出已亮起)
0000 0010
0000 0011
這是我們要構建的地址解碼器的設計。
上面是一個簡單的2位狀態,因此它有兩個輸入(透過左右中繼器)。輸出是在圖片最上方的紅石線,當所有條件滿足時會關閉。狀態是紅石訊號輸入是否會關閉上面的紅石線; 如果是,則狀態為紅石輸入。在上面例子中,必須是左側輸入為OFF(0),右側輸入為ON(1),才能關閉頂部的紅石線。因此,它期望的狀態為(OFF,ON)(即二進位01)。
這裡,顏色為藍色的方塊應設為ON(1),以便停止啟動頂部的紅石線。一旦每一位都停止啟動紅石線,紅石線就會關閉。
這些基本上是每條輸入用一個或兩個非門,多條匯入到一個或門,然後用非門後輸出。
上面是一個8位元狀態,它期望8個輸入的順序正好是0000 1101。紅石火把正好按照0000 1101的順序放置,所以我們看到頂部的紅石線熄滅。
現在,如果將它們中的多個放在一起,我們就可以用藍色位以二進位數進行計數,以獲得8位元的所有255個狀態。下面的一個是8位元,並具有四個狀態期望。查看正確的圖像以查看實際效果。現在,每個綠色輸出可以是一個儲存單元,如果我們繼續以二進位進行計數,它將達到255。
輸入為0000 0011(紅石火把為輸入),藍色位與目前狀態匹配時,綠色輸出為ON。
- 0000 0000 - 第一個訊號輸出(在右側的圖像上)
- 0000 0001 - 第二個訊號輸出
- 0000 0010 - 第三個訊號輸出
- 0000 0011 - 第四個訊號輸出
因此,現在我們繼續以二進位數進行計數,直到數到0000 1111並停止。現在我們應該有24(16)個狀態期望值,這就說明我們完成了地址解碼器。由於指令集的局限性,我們不會繼續計數到1111 1111,會在第3章指令集中介紹。
步驟2:構建算術邏輯單元(理論)
算術邏輯單元(ALU)會比較並執行二進位數的數學運算,並將結果與控制單元(CU,即計算機的中心組件)進行互動。本來也應與CPU互動,但它將與計算機本身一樣大。許多教學都希望讀者首先構建ALU,因此該主題在網上被廣泛涵蓋。
我們將要構建的ALU可以在兩個輸入上執行四個重要操作,並返回正確的輸出。A,B均為8位元輸入。
- A + B(將A加入到B)
- A >>(右移一位,與二進位除以2相同)
- << A(左移一位,與二進位乘以2相同)
- 非A(將A每位取反)
由於某些程式需要大量操作才能執行,因此計算機內部還可以有多個ALU,這些操作不依賴於先前的操作,因此可以進行執行緒化。 所以將它們委派給不同的ALU可以顯著提高該程式的速度。
二進位加法器
兩個數字相加
在一個加法單元中,對於每個位(對於我們的計算機,我們需要四個,因此需要4位)都要有一個全加器。全加器將接收三個輸入,每個輸入可以是1或0。前兩個將是使用者的輸入,第三個將是「進位」輸入。「進位」輸入是上一個全加器的輸出,稍後將對此進行說明。全加器器將輸出兩個語句:首先是輸出,然後是「進位」輸出,該輸出作為輸入發送到下一個全加器中,占一個位。 例如,希望將數字0101和1011相加。第一個全加器將把第一位的值1和1作為它們的兩個輸入(我們從右到左閱讀)。由於之前全加器,因此沒有「進位」輸入。全加器將加1和1;它是0,並攜帶1到下一個位置值。下一個全加器將加0和1,進位輸入將是1,這是前一個全加器指出的。0和1的輸出將為1,但進位輸入為1,因此將0與1和1相加,即0,並在下一個位值上攜帶1。複查二進位檔案中的加法應該解決任何混淆。
全加器
為了執行加法運算,所有ALU都需要多個加法器。每兩位將送入一個加法器,與其他加法器連接時,將產生輸出,該輸出是兩個字節加在一起的總和。加法器具有一個輸入,一個輸出和兩個進位輸入/輸出,就像執行9 + 1或01 + 01的加法操作一樣。加法器由邏輯門構成,這可以透過二進位的命名法實現。 教學/算術邏輯給出了全加器和半加器的非常詳細的介紹,目前,有一個構造方法的示意圖。它提供四個輸入/輸出,應與其他加法器連接以建立一個單元。對於此示例,我們將在四位計算機中將四個加法器連接在一起,以便我們可以將所有四個位都取為輸出。第一個加法器將缺少輸入進位,這是因為之前的位(第一位)沒有任何進位。輸入進位將保持為零。第四加法器還將缺少輸出進位,並且由於我們只能支持四個位,因此將忽略該輸出。附加的第四個進位輸出連接到溢出標誌,表示無法完成該操作。這稱為二進位溢出。
因此,基本上,進入Minecraft並構建一個完整的二進位加法器(如圖所示)並將其連接起來。應該有八個輸入和輸出。嘗試將控制桿和紅石燈分別放在兩端以測試。因此0010 + 0011應該為0101(2 + 3 = 5,我們從右往左讀)。
分數數字
計算機透過浮點算術的形式處理小於1的數字,僅在較大位計算機(16-64位元)和需要使用小於1的計算機中有用。浮點運算或高精度算法可以實現此目的。另一種更簡單但效率較低的方法是為所有數字分配2的冪,以使它們被選定的2的冪「累加」。玩家必須對每個數字都執行此操作,並假設該數字是您選擇的兩個數字的冪的一倍。例如5 = 1012,因此5×23 = 1010002,即five is bumped up by three。因此,現在,新系統中的值為1×23 = 10002,這將為0.1、0.01或0.001留下表示方法;0.01 * 23 = 102。這將導致您的計算機設定更為複雜。
兩個數字相減
一個全部帶正負符號的加法器(加減混合計算元件)
數字減法非常簡單。ALU首先必須變更第二個數字(即減數),將其從正數轉換為負數。一個數取負,對應的二進位補碼是反轉原二進位數補碼(0變為1,1變為0)後再加1。
示例:10減去9
| 1. 0000 1001 | (9的二進位補碼,我們希望將它轉換為-9) |
| 2. 1111 0110 | (將9取反,所有0變為1,1變為0) |
| 3. 1111 0111 | (加1,這是-9的二進位補碼) |
| 4. 0000 1010 | (10的二進位補碼) |
| + 1111 0111 | (加上-9的二進位補碼) |
| ---- | |
| 0000 0001 | 結果(10 +(-9)= 1)(存在溢出,這僅意味著結果不是負數) |
這帶來了帶符號數字的複雜性,但這是二進位數的權重,用來將其指定為正數或負數。結果是負數還是正數由溢出標誌確定。如果有溢出,則表示數字為正,否則為負。
為實現這一功能,可以讓ALU做3個操作。 實現A減B的操作是:A SUB B
- NOT B (將B的每一位取反)
- B ADD 1 (將B自加1)
- A ADD B (將A加B的值存到A)
- RETURN A (A即為回傳值)
兩個數字相乘
乘法是重複的加法,因此最簡單(但效率低下)是將A多次加到變數B上。
這是它的偽機代碼:
操作:A * B
- C = 0
- (set C to) C ADD A (將C+A的值存入C)
- (set B to) B SUB 1 (將B自身減1)
- JUMP IF (B > 0) TO LINE 2 (如果B>0,回到第2行繼續執行)
- RETURN C (C為回傳值)
但是,有更高效的方法做乘法。一個好方法是將第一個數字重複位移到第二個數字中每個1的位置,然後求和。
這裡用下劃線表示縮進,因為用0去填充不太直觀。下標2表示二進位,粗體表示十進位。
| __ __11 | (代表3,注意有2個1) |
| x __ 1011 | (代表11) |
| ------ | |
| __ __11 | (將112左移0位,因為二進位數10112的第1位是12) |
| + __ _110 | (將112左移1位,因為二進位數10112的第2位是12) |
| + _1 1000 | (將112左移3位,因為二進位數10112的第4位是12) |
| ---- | (二進位數10112的第3位是02,因此不用加) |
| 10 0001 | (結果為33) |
因此這對更大的數操作起來更高效。
操作:A * B
- C = 0
- D = 0
- JUMP IF (BIT (D) OF B == 0) TO LINE 5 (如果B的第D+1位是0,則跳到第5行)
- (Set C to) C ADD A (將C+A的值存入C)
- (Set D to) D ADD 1 (將D自加1)
- (Set A to) << A (將A左移1位)
- JUMP IF (D < LENGTH OF B) TO LINE 3 (如果D比B的位數小,即沒有超出,則跳到第3行)
- RETURN C (C即為回傳值)
不要忘記:
<< A (左移1位)等價於A * 2
>> A (右移1位)等價於A / 2
假如這些數字是唯一確定的或者CPU必須做大量的相似數字處理,可以考慮使用一個可查的窮舉表來頻繁調用乘法。因此,在極端情況下,你可以透過硬編碼的方式來得到答案。
步驟2:構建算術邏輯單元(實踐)
步驟3:指令集和機器結構(理論)
詳細說明第2章:指令集後,我們可以建立自己的一套。
對於我們正在建造的MASIC計算機,有一個8位元的系統,所以這意味著在堆棧記憶體的每個插槽上的每條指令都是8位元。堆棧記憶體是儲存任何資訊並儲存在RAM中的記憶體。所以將會有一個計數器,稱為程式計數器,它每週期遞增1次。循環是指CPU取得指令,解碼指令(找出該指令該做什麼)和執行指令(執行它讓它做的事情)。然後,透過遞增程式計數器並在堆棧記憶體中讀取位於該位置的資訊,移動到下一個程式計數器。
因此,堆棧記憶體中的每個字節都有8位元供我們使用。有些指令需要一個地址,比如將記憶體載入到寄存器中,這樣我們就可以對其執行操作。每條指令將被分成兩部分,每部分4位。第一種是類型。類型將指定計算機必須做什麼,地址將位於我們將執行操作的值所在的位置。
操作碼/操作數
憑藉這個4位資料組,我們可以有24種操作碼,即代表16種不同的操作。我們的電腦將有兩個寄存器,所以因此操作碼的一位用於指定操作將在其上執行的寄存器,並在下文用x表示。
指令與記憶體將被放在同一位置,由於指令的地址部分只有四位,我們只能從1-16行引用記憶體,需要一些巧妙的編程來適應更大的程式。每個程式的記憶體也限制為16位元組。值和指令本質上是相同的,因此,如果您編寫一條指令將其儲存到先前儲存指令的行上,這將有效地用一個值覆蓋該指令。
意外執行值是一個問題,因此必須設定並使用STOP指令來防止任何錯誤。這需要理解的東西太多了,所以自己去找找基礎教學吧。另外,不要忘記為您的IGCSE同時使用用戶端/伺服器端和資訊和通信技術。
必要條件
本節將介紹計算機中常見的簡單主題和組件。 看懂下文你需要:看懂第2章中的資訊,如ALU、RAM、寄存器和二進位操作。
MASIC指令集
因為這裡的計算機是指令集的草稿,只有基本要素。這是基於其他彙編語言的,但經過變更以適應我們的體系結構。有兩個寄存器,所以我們需要指令在兩個寄存器上執行操作。
| 二進位碼 | 操作碼 | 效果注釋 |
|---|---|---|
| 0000 | LOAD R1 | 將地址載入到寄存器1中 |
| 0001 | STORE R1 | 將寄存器1的內容儲存到該地址中 |
| 0010 | JUMP R1 IF | 如果寄存器1的值為0,則跳到地址一行 |
| 0011 | ADD R1 | 將地址處的內容加入到寄存器1 |
| 0100 | <<R1 | 在寄存器1中向左移位 |
| 0101 | NOT R1 | 按位非寄存器1(對寄存器1按位取反) |
| 0110 | JUMP | Jump to line OPERAND |
| 0111 | STOP | 終止程式 |
| 1000 | LOAD R2 | 將地址載入到寄存器2中 |
| 1001 | STORE R2 | 將寄存器1的內容儲存到該地址中 |
| 1010 | JUMP R2 IF | 如果寄存器2的值為0,則跳到地址一行 |
| 1011 | ADD R2 | 將地址處的內容加入到寄存器1 |
| 1100 | <<R2 | 在寄存器2中向左移位 |
| 1101 | NOT R2 | 按位非寄存器2(對寄存器2按位取反) |
| 1110 | OUT R1 | 輸出寄存器1 |
| 1111 | OUT R2 | 輸出寄存器2 |
解釋:
1000 0011表示將地址3的數載入到R2寄存器,因為1000為載入到寄存器2中,0011為3。
這些可以在一個過程中進行,以便可以執行功能。
編寫程式
下面這個程式能計算斐波那契數列:(0, 1, 1, 2, 3, 5, 8……)
| 地址 | 二進位指令 | 實際指令 | 注釋 |
|---|---|---|---|
| 0 | 0000 1110 | LOAD R1 14 | 將寄存器1設定為地址14的值 |
| 1 | 1000 1111 | LOAD R2 15 | 將寄存器2設定為地址15的值 |
| 2 | 1011 1110 | ADD R2 14 | 將地址14的值加入R2 |
| 3 | 1110 0000 | OUT R1 | 輸出寄存器1 |
| 4 | 0001 1111 | STORE R1 15 | 將其放入地址15 |
| 5 | 1111 0000 | OUT R2 | 輸出寄存器2 |
| 6 | 1001 1110 | STORE R1 14 | 將其放入地址14 |
| 7 | 0110 0000 | JUMP 0 | 回到地址0,重複執行 |
| ... | |||
| 14 | 0000 0001 | 1 | |
| 15 | 0000 0001 | 1 |
前面是低級彙編語言的一個例子。如果它是用高級語言編寫的,比如C++,它看起來更像是這樣:
#include <iostream>
using namespace std;
int main()
{
int n, t1 = 0, t2 = 1, nextTerm = 0;
cout << "Enter the number of terms: ";
cin >> n;
cout << "Fibonacci Series: ";
for (int i = 1; i <= n; ++i)
{
// Prints the first two terms.
if(i == 1)
{
cout << " " << t1;
continue;
}
if(i == 2)
{
cout << t2 << " ";
continue;
}
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
cout << nextTerm << " ";
}
return 0;
}
指令週期
圓角矩形為元件,矩形為不同單元,綠色箭頭為路線。
指令集是低級彙編語言,所以我們希望將它更多地集成到硬體裡。這圍繞著「取得→解碼→執行」循環(見上)在執行。 在CPU中,有4個重要寄存器:
- 程式計數器(PC)跟蹤計算機目前執行到哪裡;
- 儲存地址寄存器(MAR)跟蹤下一個記憶體地址的位置;
- 儲存資料寄存器(MDR)跟蹤跟蹤內存在哪一個位置;
- 現行指令寄存器(CIR)跟蹤哪條指令正在被執行;
- ALU累加器(ACC)跟蹤ALU的輸入和輸出。
還有四個組件需要記住:地址解碼器、記憶體、指令解碼器和ALU。
取得(Fetch)
程式會獲得下一條指令。
- PC將指令碼發送到MAR;
- PC自己增加1,為下一條指令做準備;
- 地址解碼器將地址解碼,並從記憶體中取得相應地址中的資訊;
- MDR接收到需要的資訊。(在這個圖片的例子中,如果MAR為0001,MDR會接收到「LOAD R1 1」,即將地址1的資料載入到寄存器R1中)
解碼(Decode)
程式會識別取得的是什麼指令。
- CIR透過資訊流,從MDR中接收到資訊;
- 指令解碼器將指令解碼,知道接下來要做什麼。
執行(Execute)
程式會執行這條指令。
- 在本圖片例子中,程式接收到「LOAD R1 1」這條指令,指令解碼器將這條指令拆分為操作碼和操作對象。操作碼是「LOAD R1」,操作對象是「1」。
- 操作對象被送到MAR,以便取得對應地址的資訊。
- MDR接收到那個地址的資訊。(在這個例子中,是同一行)
取決於指令,有四種情況可能發生。
如果指令是加(ADD),ACC就會被要求從資訊流中取得資訊,ALU會對其執行操作,再次輸出到ACC。
如果指令是載入(LOAD),控制單元(CU)會將指令載入到寄存器中。
如果指令是儲存(STORE),CU會將指定位置的值設定(SET)為記憶體中MAR指定的值。
如果指令是輸出(OUT),CU會將指令送到外部輸出裝置。
重複(Repeat)
指令週期會重複進行,直到執行到停止(STOP)指令,或是用完記憶體。
步驟3:指令集和機器結構(實踐)
第二章 紅石計算機的規劃
紅石計算機可以像真實計算機一樣運作,遵循計算機設計和硬體架構中的原則。有幾個關鍵的設計決策會影響架構;你對計算機預期的大小和功能應該在構建部件之前具體確定。建造紅石計算機需要理解這五個概念,並考慮最合適的方法,這對計算機是最實用的。
一些事情需要考慮:
- 執行模型(記憶體的計算機組織與程式儲存和執行)
- 字節大小(資訊的大小,你的紅石計算機用這些執行指令)
- 指令集(紅石計算機的一個結構)
- 記憶體大小(資料可以儲存在記憶體中,可儲存資料多少取決於記憶體大小)
有一個選擇決定將提供強有力的指導在各種組件的設計你的電腦。
我們會在本章最後一節應用這些內容並計劃構建CPU。這個CPU會在下一章建造。
計算機的基礎
計算機具有以下能力:
- 從有地址的記憶體中讀寫;
- 可以對記憶體的狀態進行比較,並據此執行操作,包含了重寫記憶體;
- 可以基於寫在記憶體中的內容執行一個功能。我們把這樣的內容叫作「程式+資料」,並將其編寫為程式。
一個值得注意的例子是最基本的計算機概念,即圖靈機器,它能從一條無窮長的編碼和指令中讀取資訊,以完成一個功能。
在Minecraft中設計和建造圖靈機器,這是可以實現的。然而,由於我們要設計更基本的一些東西,我們不討論這個。
計算機的部件
一個現代計算機有五個基礎部件。為了保證正常執行,並透過執行計算來處理資料,這些部件是必不可少的。
計算機的五個組成部分
算數邏輯單元(ALU)(這不是必需的,但通常存在)
- 執行加法與減法;
- 透過邏輯門進行布林運算。
控制單元(CU)
- 執行接收到的指令;
- 與其他所有部件互動。
資料儲存器(Data Memory)
- 從記憶體中儲存與返回資料。
指令儲存器(Instruction Memory)
- 返回指令,並發送到CU;
- 可以被設定,但不需要向資料儲存器那樣頻繁。
輸入/輸出裝置(I/O)
- 允許計算機與玩家和世界互動;
- 可以將資訊輸入到計算機(按下按鈕,或透過日光感測器);
- 可以從計算機中輸出資訊(透過紅石燈、音階盒等)。
計算機資料儲存
在Minecraft或是現實生活中有很多種方式儲存資料。記憶體狀態通常為二進位,非開即關,可透過邏輯運算來執行。
在計算機中,有三種儲存器。要知道,增加硬體的容量亦即增加大小,因此每一種儲存器都有自己適合的速度與容量。
主存
主存,也為記憶體,對於CPU來說可以直接且最快訪問。因此,在容量上它也通常很小。
寄存器與Flags
Fastest is the memory stored within the CPU. These are registers and flags as they can be set almost instantaneously and do not require any address sent to it as there is only one byte stored in each register. Redstone bits that can be toggled are extremely large but can be toggled within 2 ticks. This requires a very large amount of space but is perfect for caches and registers. The redstone is also required for logic gates (not shown) to set the bit, as in the images, sending an input would cause the bit to flip. The gate would take up more space. Registers could also utilize locking redstone repeaters and timing them correctly. This is explained below, in RAM). With the use of a computer clock, it may not be necessary to build registers. Registers are useful when the data goes through the line before either the CU or ALU is ready to process it. It would save it to the register and wait until the CU or ALU can perform its function.
緩衝儲存器(快取)
第二快的是緩衝儲存器,將資訊輸入處理器。現實中,它被分為幾個等級,每個等級都有獨立的速度與能力。和寄存器原因相同,它很有用。
隨機存取儲存器(RAM)
第三快的是隨機存取儲存器(RAM),這比寄存器和快取慢得多,是因為它有地址系統。它與三條總線(資料總線、控制總線和地址總線)連接。資料透過資料總線傳送,無論是設定RAM中資料的值或是從RAM中獲得資訊。控制總線能控制RAM,要「取得」還是「設定」資訊。地址總線能告訴RAM所操作的是哪個字節。參見計算機的結構來更加深入了解。RAM非常有用,可以完全替代三級儲存器(是因為它在Minecraft中比較穩定)。不穩定的意思是,在現實中,RAM斷電時會丟失所有的資訊,這在Minecraft中不會發生。因此RAM是儲存資訊的極佳方法。
The RAM in the first case is utilizing the locking redstone repeaters with the correct timing. This requires a bit of a plan but is very space-efficient. The conversion of a bus to the lines in order to lock the redstone repeaters also requires setting timings. This is time-consuming, much more than the registers, however, it is very compact and efficient. The address bus (green) would turn in binary to unlock a certain byte, either to be read or set by the control bus (second line, on the left).
Most often, making it volatile has no use in Minecraft, so the easiest way to make some is to use d-flip-flops and to add a reading and writing function. The bottom image shows instead of locking repeaters, it uses d-flip-flops which is much more space inefficient but simpler to build. D-flip-flops work more or less like locked repeaters, one input - if on, unlocks in until the input is off and the other will set it once unlocked. The output can be read as a bit and with a NAND gate, be ignored or put onto the bus. This is gone over in detail in the second chapter, Tutorial on building a Computer. Excuse the texture pack.
Random Access Memory also known as RAM is a kind of memory used by programs and is volatile. Volatile means that when the power is lost, it will lose information. Most often, making it volatile has no use in Minecraft, so the easiest way to make some is to use d-flip-flops and to add a reading and writing function.
Secondary Storage
These are equivalent of HDDs and SSDs. There is a very compact storage technique, involving redstone comparators with the ability to store up to 1KB, being practically sized.
Tertiary Storage
Third and last, is a tertiary memory, which requires a lot of time to read/write but can hold massive amounts of information at the expense of speed. Real-world tertiary storage use a mechanism of mounting the memory which takes about a minute for each drive. This is used for archival purposes and for memory which is rarely used. In Minecraft, a system where shulker boxes are used and block in the shulker boxes must be sorted out by a sorting system to represent a form of data. This can also be used to create removable storage. The read/write speed is fairly slow due to the massive amount of comparators and a lot of time is required. The aforementioned mods could speed up tick rate and eliminate this problem, however. This is used for storing long-term data that needed to be loaded at the beginning of a program or rarely due to its poor read/write speed and large capacity. This is the equivalent of a real computer's hard disk or solid-state drive.
執行模型
在記憶體中儲存指令塊的技術叫做程式,允許計算機同時執行各種不同的任務。使用的裝置由計算機來儲存和檢索這些程式是計算機的執行模型。世界上最成功的兩個執行模型,哈佛和馮·諾依曼,今天將近100%的可用的計算機上執行。
哈佛結構
哈佛結構檢索器分離的指令組成一個活躍的程式從資料訪問器的程式在執行期間訪問。
編寫的程式對電腦使用哈佛結構可能執行的任務達到快100%訪問主記憶體總線。但是要注意,哈佛結構的某些記憶電路體積會很大。
馮·諾依曼結構
馮·諾依曼結構使用一個兩步的過程來執行指令。首先,載入記憶體包含下一個指令,然後新指令載入是允許訪問相同的記憶體,因為它執行,使用一個記憶體的程式和資料促進元編程技術像編譯器和自我修改代碼。
馮·諾依曼體系結構是第一個提出的計算模型,幾乎所有現實中的計算機都使用馮·諾依曼結構。
位數大小
位數大小是計算機物理尺寸的主要因素。 在Minecraft中,從1位一直到32位元的機器已經被成功構建出來。 常見的位數大小的組合:
| 資料 | 指令 |
|---|---|
| 4 | 8 |
| 8 | 8 |
| 8 | 16 |
| 16 | 16 |
資料字
計算機在任何特定時間可以操作的資訊量代表了計算機的資料字大小。
在數字二進位中,計算機的資料字大小(以位為單位)等於計算機主總線中通道的寬度或數目。
資料字通常表示整數,或編碼為二進位數字模式的整數。
最大大小的數量可表示的二進位整數編碼是2資料字所占位數 - 1。
比如,有8位元資料字大小的計算機在總線上有八個通道(一組導線和連接部件),因此,最多能計算到28 - 1 = 255。8位元模式下計算超過255的數字是不可能的,因為計算255 + 1會帶來額外的一個進位,這需要第9個位才能儲存,於是發生了二進位溢出。最後結果返回一個不正確的0。
這個過程可以用下表形象描述:
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 255 | ||
| + | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | |
| = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
一些常見的整數資料大小是:
| 最大可表示的數量 | 所需的位數 |
|---|---|
| 1 = 21 - 1 | 1 |
| 7 = 23 - 1 | 3 |
| 15 = 24 - 1 | 4 |
| 255 = 28 - 1 | 8 |
| 65535 = 216 - 1 | 16 |
| 4294967295 = 232 - 1 | 32 |
資料字大小還決定了可以由計算機的ALU(算術和邏輯單元)處理的數字的最大大小。
指令字
計算機完成一條指令所需的資料量代表計算機指令字大小。
計算機的指令字大小通常是其資料字大小的倍數,這有助於在程式執行期間檢索指令時最小化儲存器未對準。
指令集
這裡是一系列指令,控制單元(CU)能將它們解碼,然後執行。
指令是計算機執行的基本功能。一些例子包括:
- 加、減、乘和除
- 從RAM/ROM/三級儲存器中讀寫資料
- 從RAM中載入和卸載資料
- 分支到代碼的其他部分
- 與寄存器比較
- 選擇一個邏輯運算(與非、或非、非……)
指令可以被編碼進RAM,從ROM中讀取,或直接被控制桿或按鈕啟動。每條指令都有自己指定的二進位字串(例如,0000可以代表從寄存器中讀取資料,0001代表A與B相加,1011代表將RAM的資料儲存到三級寄存器,等等),並且可能將自身的二進位編碼轉為十進位(將BIN碼轉為BCD碼),再到十進位解碼器,最後透過總線到ALU或寄存器。
計算機的結構
在計算機內部,有一個中央處理單元(不要與CPU內部的控制單元(CU)混淆),在現實生活中,這是一個非常小卻很強大的組件,或多或少地充當計算機的大腦。
在Minecraft中,很難將其壓縮到我們在現實生活中看到的規模,所以如果它看起來像是錯誤的,請不要擔心。
在下一章中,我們將首先設計我們的4位中央處理單元,因為考慮到執行模型(CPU的通信和組織方法),這是我們計算機中最重要的事情,我們可以繪製計算機的構建圖。
CPU的構建圖,基於哈佛執行模式
CPU遵循著一個循環,一共有四個步驟,取得、解碼、執行和儲存來執行指令。CPU首先從RAM取得指令,解碼其含義(指令很可能是一個數字,CPU必須找出它是什麼數字),一旦它理解了指令是什麼,它將執行該操作。有時需要將資料放回儲存器,因此它會儲存資料。然後重複循環。
總線
CPU中共有五條總線,每條總線將資訊從一個組件傳送到下一個組件。總線是連接每個組件的紅石通道。因為我們正在建造一台4位計算機,所以我們的總線只需要四個通道。這些是連接中央處理單元內部組件的紅線和藍線。請注意,藍色總線少於四條線,這是因為它們不攜帶資料。由於總線只能單向傳輸資料(在Minecraft中,紅石中繼器只能單向工作),所以有兩條總線將中央處理單元連接到外部計算機。
The first bus is the data bus, this is to transfer information from the storage or I/O devices to the CU. Instructions are also sent through this line The CU can also use this bus to transfer data to the ALU. The ALU cannot transfer data onto this bus because buses only work one way and once the information is taken by the ALU, the bus cuts off beyond the ALU. Information from the ALU is passed through bus 2.
The second bus is the data bus, but returns the data from the ALU to the CU. The CU cannot send data through this bus to the ALU because the bus goes from left to right and works in one direction only. The CU can send information back to the storage units though, and is used to set values of storage devices.
The third bus is the address bus, which the CU can send the address of storage. This is where the information resides. For example, the CU asks for the address of the byte living in 0001. It sends the address (0001) through the address bus and the RAM will return the value of the byte through the first bus. 0001 is the location of the byte, not the value of it.
The fourth bus is the control bus, which the CU will communicate with the RAM with. For example, one wire could tell the RAM to set the byte to the value to the data sent to it by the CU. Another wire could tell the RAM to get the byte from the address sent to it by the CU.
The fifth bus is another control bus, linking with the ALU, which sends flags from the ALU. Flags are notes which could be error messages. For example, the CU could ask the ALU to add 15 and 1 in a 4-bit system. Adding 15 and 1 in 4 bits would yield 0 (explained above) and this is called a binary overflow. This is an error and the ALU will tell the CU about this through the fifth bus as a flag. The CPU could also send data to the ALU and ask for it to perform an action with that data.
Components
Control Unit (CU) will fetch instructions from the instruction ROM (for other computers, instructions can be changed and therefore is RAM. For our case, we are running a fixed program and do not need to change the instructions. This simplifies the process entirely and the instruction is Read-Only Memory (ROM)). Inside the CU, it will then decode the instruction, which is normally a number, into a sensible action. It will then perform that action and if the instruction requires, store the result into the RAM. It communicates with the RAM through the control bus and receives flags from the ALU. It can also ask the ALU to perform actions on data it sends to the ALU (e.g. addition). To communicate with the RAM, for example, one wire could tell the RAM to set the byte (the location of it is specified through the third, address bus) to the value to the data sent to it by the CU through the second, data bus.
Arithmetic logic unit (ALU) will execute instructions sent to it from the CU and will compare binary numbers and communicate with the Control Unit. It can do simple addition and subtraction which can be repeated to do multiplication and whole-number division, outputting a whole number (then division). There are also logic gates for booleans, the fundamental logic gates are required, such as the NOT gate and the NAND gate.
Now we can choose from a range of designs of busses, each contributing to the aforementioned three key designing goals of a Minecraft computer.
第三章 計算機的設計
指令集架構
狀態
記憶體是一系列的位。在Minecraft中,儘管曾經成功創造過32位元和64位元[1]計算機,但是通常情況下記憶體占8位元或16位元。每一位都是兩種可能的狀態中的一種:開或閉。而記憶體就是一系列的開和閉,用於完成特定的任務。
訊號
現實世界計算機使用二進位,一系列的1和0。「1」表示「開」和「0」表示「關」。在"Minecraft,最好的體現是紅石:有訊號意味著「1」,沒有訊號表示「0」。然而,根據距離紅石從記憶體儲存,它是「0」可以是任何訊號強度從0到14。你也可以設計,使「1」訊號強度從1到15。
數
我們常規的十進位是一種以10為基數的數字系統。在電腦中使用的數制——二進位,則是以2為基數。為了比較兩者,我們看一下兩位數。在十進位中,左邊的那一位是十位。在二進位中,則是「二位」。比如在十進位中,「10」表示「十」。而在二進位中,「10」表示「二」。有兩種常用的十進位轉二進位的方法:
1. 最高位優先:這種方法需要一點直覺。我們以42為例。首先我們找小於等於42的最大的2的冪(如32 = 25或65536 = 216)。在這個例子中,是32。然後我們用例子中的數字來減它,42-32=10。那麼最左邊的一位就是「1」。隨後我們繼續找下一個2的冪,看它是否小於等於目前的數字。對於這個例子來說,下一個是16,16大於10,所以接下來這一位是「0」。一直找下去直到數字為0為止。無論二的冪是小於還是等於目前的數字,都要減掉它,並且記下一位為「1」。否則下一位就是「0」。用表格來表示這一過程,就是
| 比較 | 計算 | 結果 |
|---|---|---|
| 32<42 | 42-32=10 | 1 |
| 16>10 | 0 | |
| 8<10 | 10-8=2 | 1 |
| 4>2 | 0 | |
| 2=2 | 2-2=0 | 1 |
| 1>0 | 0 |
因此最終42的二進位表示就是「101010」。不錯。
2. 最低位優先:這個方法不需要記憶許多2的指數。相反,它重複將數字除以2,使用商作為下一個被除數,餘數作為二進位位。但請記住,此方法從右到左寫入二進位數,而不是像前一種方法一樣從左到右寫入。讓我們重用我們的例子,42:
| 計算 | 餘數 | 說明 |
|---|---|---|
| 42/2=21 | 0 | 最右邊的數字是0 |
| 21/2=10 | 1 | 向左邊一位的數是1 |
| 10/2=5 | 0 | 向左邊一位的數是0 |
| 5/2=2 | 1 | 向左邊一位的數是1 |
| 2/2=1 | 0 | 向左邊一位的數是0 |
| 1/2=0 | 1 | 向左邊一位的數是1 |
商數為0,所以我們停止。 我們得到了二進位數「101010」。與之前的方法相同。
過渡
字
指令
功能本質上是由計算機指令構成的,指令的例子包括:
- 加、減、乘、除
- 從RAM/ROM/第三儲存器的讀/寫
- 讀取和寫入資料到記憶體
- 分支的其他部分代碼
- 比較寄存器
- 計算一個邏輯函數(NAND,NOR,NOT等)
指令可以被編程到記憶體,從ROM載入或直接透過一個控制桿或按鈕啟動。每條指令都有它自己的特定的二進位串分配(比如0000=從寄存器載入資料,0001=A加B,等),並且可能需要其自己的二進位到十進位或二進位到BCD到十進位編碼器和總線到ALU或寄存器。
歸類
抽象
映射
符號
數字
符號可以用紅石燈或者活塞的推拉方塊產生凸凹起來顯示:
註:如果用紅石燈的話不要用黃色的方塊做面板,不然不容易分辨。
功能
形式化
可計算性
變數
變數是數字、字串、字元(套)或布林值(真/假)儲存在RAM中的空間。例如,布林值可以用來儲存資訊如果程式已經達到某種狀態。以下資訊需要儲存一個變數:名稱,類型(數字、字串或布林),和變數值。變數,顧名思義,改變。指令操作可以改變變數。在執行程式時建立變數,一旦程式結束,變數值會被從記憶體中刪除。當一個程式重啟,變數會被重設。在Minecraft中也是如此。
層次結構
記憶體
記憶體是儲存您的程式資料的地方。它是可變更的 (但它在計算機關閉後將會被刪除),它也用於儲存您計算機的資料。例如說,在一個從1開始計算的程式中,1就被儲存在了記憶體中,從記憶體中載入出來的1被加入上原來的1便得到了2。
執行
語義
資料
資料是計算機處理的資訊,使用二進位表示。
控制單元(CU)
機器架構
資料通道
Processing
算術邏輯單元(簡稱ALU)
ALU是計算機最重要的組件之一,在現實生活和Minecraft中。首先,你必須選擇你希望能夠實現的功能。大多數時候,這些都是加法、減法和一組邏輯選項。
與,或,與非,或者你所喜歡的。你必須建立單位和所有你想要的邏輯門和數學函數和選擇哪一個的輸出顯示。
(資料)總線
用總線允許您的計算機的組件相互通信。
一條總線可以透過使用建立紅石布線連接你的計算機的運算器,隨機儲存器,只讀儲存器,中央處理器和寄存器在一起,這樣他們就可以互相之間發送資料。通常是重要的計劃,建立你的電腦的組件,否則你建立總線過長,或者更糟的是,沒有空間來建立總線,在這種情況下,您可以刪除的組件並重建一個適當的位置,或者使用像WorldEdit移動組件到其他地方。
儲存
隨機存取儲存器
隨機存取儲存器又稱RAM,是程式使用的一種儲存器,具有易失性。易失性是指當電源斷開時,它將丟失資訊。大多數情況下,在Minecraft中記憶體資料不會失去,所以最簡單的方法就是使用d-觸發器來加入讀寫功能。
二級儲存器
這相當於HDD和SSD。下面介紹一種非常緊湊的儲存技術,要涉及到紅石比較器,能夠儲存高達1KB的實際資料大小。
三級儲存器
第三,也是最後一點,是第三級記憶體,它需要大量的時間來讀/寫,犧牲速度但可以儲存大量資訊。在現實世界中,三級儲存器使用的是一種老式的掛載記憶體的機制,而且現在也很少使用了。在Minecraft中,這種系統要用界伏盒來完成,界伏盒中的方塊必須由排序系統進行排序,以表示某種形式的資料。由於這些工作需要大量的比較器和大量的時間,所以讀/寫速度相當慢。然而,利用某些mod可以加快遊戲tick的速度並消除這個問題。這用於儲存長期資料,這些資料需要在程式開始時載入。相當於一台真正的計算機的機械硬碟或固態硬碟。
機器狀態
程式計數器
程式計數器用於告訴CPU應該執行哪行代碼。在每個時鐘週期,解碼器將訪問這個計數器來取得下一個要執行的指令。一些指令會比另一個訪問不同的資料量,或任何資料,因此解碼器將適量增加程式計數器的下一個指令。使用的計數器也跳轉指令控制程式流。
現實中,程式計數器自身並不是一個元器件,只是在其他寄存器旁邊的一個寄存器。然而在Minecraft中,應該建造一個獨立的寄存器,用來儲存程式計數,這並不奇怪。
控制路徑
處理
控制單元
控制單元(CU)是計算機中解釋指令的部分,並控制計算機的其他部分,比如告訴ALU做加法還是減法。
File:Redstone Computer Control Unit.PNG
總線
File:Redstone Computer Control Busing.PNG
硬碟
File:Redstone Computer Tertiary Memory.PNG
固體方塊可以被紅石中繼器強沖能,強充能方塊可以點亮周圍的紅石粉。透明方塊卻不可以被沖能,這就是一個簡單的硬碟。
程式記憶體
File:Redstone Computer Program Memory.PNG
程式記憶體,最基本,ROM(只讀儲存器)。ROM是最常用的遠程執行一系列任務(如一個程式,因此得名)。它可以用來在使用者控制項(如圖片)或每一行之間的時鐘和足夠的延遲2不是在同一時間。最簡單、最高效的設計之一是一個圖中,這可能是也可能不是加上解碼器。它可以很容易地擴大,這是另一個優勢。
機器狀態
File:Redstone Computer Machine State.PNG
程式計數器
時鐘
File:Redstone Computer Clock.PNG
時鐘同步組件或使用時間。(Minecraft)在大多數情況下,可以避免使用但有時它是計算機的功能所必需的。它基本上可以由紅石火把連結成一條線/圈的非門(奇數建議或者你的輸出必須「取反」),或者中繼器,如上圖所示。
提示
- 你也可以使用一些像是WorldEdit的模組。
- 如果你在生存模式沒有太多的紅石中繼器,你可以用兩個紅石火把代替。
- 利用顏色進行分區(例如用藍色羊毛建造RAM(隨機存取存貯器),黃色羊毛建造ALU(算術邏輯部件運算器)等)。
- 結構方塊對移動部件、組合多個部件來說很有用。然而,它只能透過指令獲得。
參見
注釋
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||











