minecraft紅石教程-2 高級(jí)數(shù)電

聲明:本書所有內(nèi)容均摘編自minecraftWiki
獲取帶圖版本書請(qǐng)至https://wwjb.lanzoum.com/iIPBk14kgvtc密碼:ev8y
目錄
5、高級(jí)紅石電路----2
6、紅石計(jì)算機(jī)------35
?
?
?
?
?
第五課
高級(jí)紅石
電路
?
?
?
?
?
計(jì)算機(jī)
主條目:教程/紅石計(jì)算機(jī)
在Minecraft中,一些游戲內(nèi)的系統(tǒng)在計(jì)算機(jī)科學(xué)中與圖靈機(jī)等價(jià)——也就是說這樣您可以建構(gòu)信息處理的裝置。這些系統(tǒng)包括:水,沙子,礦車,活塞與紅石。
這些系統(tǒng)中只有紅石是特別為信息處理而設(shè)計(jì)的,主要以紅石信號(hào)的方式來表示。
紅石與電力類似,具有高適應(yīng)性與較快的切換速度。就像在現(xiàn)實(shí)世界中電力取代了蒸汽動(dòng)力成為高科技的基石一樣,前述的這些特性使紅石力壓其他機(jī)械系統(tǒng),成為Minecraft中最具有科技含量的部分。
現(xiàn)代數(shù)字電路與紅石工程在復(fù)雜信息處理的應(yīng)用時(shí)。都被簡化為抽象的從基本到復(fù)雜的多層次結(jié)構(gòu)。
第一層是最基本的組件:紅石粉、紅石火把、紅石中繼器、活塞、按鈕、拉桿與壓力板等所有與紅石信號(hào)相關(guān)的方塊。
第二層是二進(jìn)制邏輯門;他們是能夠處理有限位(一般是1-3位)的混合裝置。
第三層是由邏輯門組合而成的高階組件。這些組件用于處理模式化的位數(shù)據(jù),一般能夠?qū)⑵渚幋a為更加易讀的數(shù)字。例如數(shù)學(xué)加法器,組合鎖具,寄存器等。
第四層,也是最后一層,是由一系列的高階組件組合成的功能型計(jì)算機(jī)系統(tǒng),通常能夠在不需要人工維護(hù)的情況下處理任意數(shù)據(jù)。
?
一個(gè)8位寄存器,屬于第三層結(jié)構(gòu)
算術(shù)邏輯
主條目:教程/算術(shù)邏輯
半加器
?
邏輯門:異或門,蘊(yùn)含門
紅石火把數(shù)量:12
紅石粉數(shù)量:7
方塊數(shù)量:19
尺寸:5X4X4
這個(gè)半加器能夠輸出兩個(gè)一位二進(jìn)制數(shù)的和。結(jié)果位輸出到輸出端S(英文Sum,加法和之意)。如果兩個(gè)數(shù)字都是1,那么會(huì)產(chǎn)生進(jìn)位1到輸出端C(Carry,進(jìn)位之意)(C會(huì)變?yōu)?)。這個(gè)半加器可以被修改為具有同相輸出的C端,但圖中這種結(jié)構(gòu)在全加器鏈中可以照搬。
注:由于紅石線的新特性,本結(jié)構(gòu)已經(jīng)失效!為了應(yīng)急,您可以先使用下面的全加器,只要不使用C輸入端即可。
全加器(1位)
?
邏輯門:同或門(2),蘊(yùn)含門,非門,或門,與門
紅石火把數(shù)量:16
紅石粉數(shù)量:32
方塊數(shù)量:48
尺寸:從上到下6X12X5,包括輸入/輸出端。
這個(gè)全加器能夠?qū)蓚€(gè)一位二進(jìn)制數(shù)與前一個(gè)加法器的進(jìn)位C相加(事實(shí)上是C而不是C,第一層的左下部),產(chǎn)生一個(gè)和(S端)和進(jìn)位(事實(shí)上是C而不是C)。
如果要改造為減法器,把其中一個(gè)二進(jìn)制輸入取反(第一個(gè)或第二個(gè)數(shù))即可。想把第幾個(gè)輸入作為被減數(shù),就取反第幾個(gè)輸入。如此改造成減法器時(shí),輸出計(jì)算結(jié)果也是反向的。在現(xiàn)實(shí)世界中的計(jì)算機(jī)里,二進(jìn)制帶符號(hào)數(shù)的第一位(也被稱為“標(biāo)志位”)決定了該二進(jìn)制數(shù)的正負(fù),如果你把這個(gè)特性(應(yīng)用相同的反相規(guī)則)引入,你就可以得知該數(shù)字是負(fù)數(shù),還僅僅只是一個(gè)較大的數(shù)字。
當(dāng)使用上述的邏輯門時(shí),注意輸入與輸出,您可能會(huì)對(duì)為什么這里使用了如此多的反相信號(hào)而不是同相信號(hào)有疑問。這個(gè)全加器使用了比異或門更能實(shí)現(xiàn)壓縮的同或門,同理,蘊(yùn)含門比與門更為壓縮。因此如果您想壓縮全加器的體積,必須使用反相信號(hào)。如果用能夠表示2層方格的符號(hào)來表示,圖像將十分復(fù)雜,因此我們將每一層都單獨(dú)用圖表表示了出來,而且也方便您分層次地建造。
活塞全加器
2位活塞全加器
1位活塞全加器
?
紅石火把數(shù)量:3
黏性活塞數(shù)量:2
紅石中繼器數(shù)量:8
紅石粉數(shù)量:16
方塊數(shù)量:7
交替全加器
?
進(jìn)位輸入與輸出端對(duì)稱,這樣您能夠方便的壓縮并組合多個(gè)這樣的單元。
紅石火把數(shù)量:14
紅石線數(shù)量:15
尺寸:5x6x3
4位加法器
?
注意!重要性最低的那一位數(shù)就是圖表中的最左邊那位(即“個(gè)位”)。這里之所以標(biāo)明,是為了向您清楚地說明全加器比起半加器的功能優(yōu)勢(shì)——半加器無法處理比其低一數(shù)位的進(jìn)位。如果您想依據(jù)一般的使用習(xí)慣把個(gè)位放在右邊,那么將圖表左右鏡像處理即可。
注:由于紅石線的新特性,本結(jié)構(gòu)的個(gè)位部分的半加器已經(jīng)失效!為了應(yīng)急,您可以先使用全加器,只要不使用C輸入端即可。
邏輯門:同或門(7),蘊(yùn)含門(4),非門(4),或門(3),與門(3)
紅石火把數(shù)量:56
紅石粉數(shù)量:108
方塊數(shù)量:164
尺寸:23X12X5
這個(gè)加法器能夠?qū)蓚€(gè)四位二進(jìn)制數(shù)相加(A與B),產(chǎn)生每一位數(shù)的和(S)與整個(gè)和的進(jìn)位(C,相當(dāng)于第五位)。和的位數(shù)順序與加數(shù)的順序相同,這也就是說,最左側(cè)的S是和的最低位。這個(gè)4位加法器僅僅是一個(gè)全加器鏈的示例,您可以通過同樣的構(gòu)造來建造具有更多位數(shù)加法或減法能力的計(jì)算單元。
邏輯單元(2-4譯碼器)
在電路中,有時(shí)候您可能需要建造能夠依據(jù)輸入來選擇輸出的邏輯單元。這樣的邏輯單元能夠用于更復(fù)雜的電路中,比如說算術(shù)邏輯單元(ALU)。下面介紹的邏輯單元又被稱為2-4譯碼器。
這是一個(gè)2位邏輯單元,依輸入不同可以有4種狀態(tài)。
?
輸出端在最上面一行,依照11、00、01、10的順序排列(輸入端順序?yàn)樯蟼?cè)的是第一位,下側(cè)第二位)。
下面是另一種采用格雷碼的簡化版本。輸出端為頂部那行末端的紅石火把。本設(shè)計(jì)能夠被擴(kuò)展到任意位,但會(huì)受到電路延時(shí)的限制。相對(duì)地,輸出排序?yàn)?1、01、00、10。
?
二進(jìn)制轉(zhuǎn)換為八進(jìn)制(3-8譯碼器)
?
3位二進(jìn)制轉(zhuǎn)換為1位八進(jìn)制
這個(gè)裝置是一系列邏輯門的組合,分為8部分。當(dāng)組合起來時(shí)能夠?qū)⒁粋€(gè)3位二進(jìn)制數(shù)輸入轉(zhuǎn)換為一位八進(jìn)制數(shù)輸出(未編碼狀態(tài),所以輸出端數(shù)量與進(jìn)制數(shù)相同),功能等同于3-8譯碼器。由于其最大占地面積不過5x5x3,所以有很強(qiáng)的適應(yīng)性。
右圖的每一部分都可以將輸入端連接到共同的輸入源,但建議您在每一個(gè)輸入端都加一個(gè)反相器以使在該電路與其他電路協(xié)同工作時(shí),輸入端保持獨(dú)立性。
某些部分也可以作為三態(tài)緩沖器使用,或至少您能夠方便地將其改造為三態(tài)緩沖器。
下表與右上圖的8部分一一對(duì)應(yīng)。
?
?
?
?
對(duì)應(yīng)八進(jìn)制數(shù)字
0
1
2
3
4
5
6
7
尺寸
5x3x2
5x3x3
5x5x3
5x5x3
5X3X3
5x4x3
5x5x3
5x5x3
紅石火把數(shù)量
1
2
2
3
2
3
3
4
紅石粉數(shù)量
7
7
12
10
7
7
10
10
二進(jìn)制轉(zhuǎn)換為十進(jìn)制/十六進(jìn)制(4-10或4-16譯碼器)
?
4位二進(jìn)制轉(zhuǎn)換為十進(jìn)制/十六進(jìn)制
這個(gè)裝置是一系列邏輯門的組合,分為10或16部分。當(dāng)組合起來時(shí)能夠?qū)⒁粋€(gè)4位二進(jìn)制數(shù)輸入轉(zhuǎn)換為一位十進(jìn)制或十六進(jìn)制數(shù)輸出(未編碼狀態(tài),所以輸出端數(shù)量與進(jìn)制數(shù)相同),功能等同于4-10或4-16譯碼器。由于其最大占地面積不過3x5x2,所以有很強(qiáng)的適應(yīng)性。
與上一章節(jié)的3-8譯碼器類似,右圖的每一部分都可以將輸入端連接到共同的輸入源,但建議您在每一個(gè)輸入端都加一個(gè)反相器以使在該電路與其他電路協(xié)同工作時(shí),輸入端保持獨(dú)立性。
右圖的右下角是一個(gè)說明性質(zhì)的圖例,圖表中列出的16個(gè)部分的輸入端皆按此逆時(shí)針順序排列。
十六進(jìn)制轉(zhuǎn)換為二進(jìn)制(16-4編碼器)
您也可以將一個(gè)十六進(jìn)制信號(hào)轉(zhuǎn)換為一個(gè)4位二進(jìn)制信號(hào)。與前面不同的是,您不再需要除了或門之外的任何邏輯門了——因此您只需要分析各個(gè)輸入端與哪幾個(gè)輸出端的對(duì)應(yīng)關(guān)系,然后直接用紅石線連過去。需要注意的是,為了防止不同輸入端連線的互相干擾,在最終連到輸出端之前您需要用連續(xù)的兩個(gè)非門或是中繼器來互相隔離;您也可以選擇在一堆連向某一輸出端的紅石線末端用最簡單的輸入隔離型或門(參見紅石電路條目的或門設(shè)計(jì)方案B或C)。在最終投入使用前請(qǐng)先測(cè)試以保證不會(huì)出錯(cuò)。
下面是十六進(jìn)制與對(duì)應(yīng)二進(jìn)制的列表:
?
?
十六進(jìn)制數(shù)
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
第4位
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
第3位
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
第2位
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
第1位
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
如果您想得到一個(gè)八進(jìn)制轉(zhuǎn)二進(jìn)制的8-3編碼器,在本裝置基礎(chǔ)上剝離第四位輸出與前八位輸入即可。
示例-順序敏感的3位十進(jìn)制數(shù)密碼鎖
?
一個(gè)對(duì)順序敏感的3位十進(jìn)制數(shù)密碼鎖邏輯圖
右側(cè)的示例采用了OR(符號(hào)為>=1)、異或門?(符號(hào)為=)、?RS或非鎖存器(符號(hào)為SR)和一些延遲器(符號(hào)為dt*)。依個(gè)人喜好,我采用了同或門設(shè)計(jì)方案C。
右側(cè)的例子采用了4位設(shè)計(jì),因而您可以設(shè)置一個(gè)十六進(jìn)制的密碼。由于狀態(tài)(0)十六進(jìn)制?== (0000)二進(jìn)制無法激活系統(tǒng),故您只可以設(shè)置15種密碼(1到F,或0到E)。如果您希望加入第16種,那么請(qǐng)自行編輯電路添加第五位輸入。
接下來我們將規(guī)定(0)十六進(jìn)制?為 (1111)二進(jìn)制,至于[1,9]區(qū)間內(nèi)的數(shù)請(qǐng)查看上一節(jié)末尾的表格。這樣,我們就可以使用十進(jìn)制數(shù)字作為密碼的外在顯示了。我們必須把十個(gè)按鈕分配到對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)上,請(qǐng)看右圖的前兩列:第一列代表表示為十進(jìn)制(當(dāng)然十六進(jìn)制在[0,9]區(qū)間內(nèi)和十進(jìn)制的表示一樣)的輸入碼;第二列對(duì)應(yīng)著每一個(gè)輸入碼的二進(jìn)制。當(dāng)然您也可以添加更多的按鈕來對(duì)應(yīng)區(qū)間[A,E],我只是為了講解方便而把那幾位去除了。方框/b1\輸出第一位,方框/b2\輸出第二位,依此類推。
接下來您可以看到用Key[i](i=1,2,3)來表示的密碼設(shè)置區(qū)。這幾個(gè)Key[i]方框的第一個(gè)輸出均為第一位,第二個(gè)輸出為第二位,依此類推。您可以在每個(gè)Key[i]處用拉桿設(shè)置二進(jìn)制加密型的密碼。請(qǐng)參考上一節(jié)末尾的表格,還有(0)十六進(jìn)制:= (1111)二進(jìn)制的特殊對(duì)應(yīng)。如果我們用按鈕輸入了第一位,裝置會(huì)與這一位對(duì)應(yīng)的四位二進(jìn)制數(shù)逐位比較。一旦每一位都正確,才會(huì)輸出置位信號(hào)到下一級(jí)。
因此我們要實(shí)現(xiàn)邏輯運(yùn)算(((b1=b1 & b2=b2) & b3=b3) & b4=b4) =: (b*=b*),在Minecraft中至少需要4個(gè)與門。這樣我們可以把識(shí)別通過的信號(hào)存到RS鎖存器/A\中。Key[2]和Key[3]具有同樣的驗(yàn)證比較過程。
我們必須確認(rèn)如果第二輸入位是錯(cuò)的話狀態(tài)會(huì)被清除。因此我們采用了一個(gè)按鍵觸發(fā)事件(--/b1 OR b2 OR b3 OR b4\--/dt-\--/dt-\--)。請(qǐng)?jiān)趫D中找到包括兩個(gè)"dt-"的那三個(gè)方框。工作原理是:任意鍵按下就會(huì)產(chǎn)生信號(hào),然后再加上一個(gè)小延遲。為了在第二個(gè)輸入位錯(cuò)誤時(shí)復(fù)位/A\,我們進(jìn)行邏輯運(yùn)算(有鍵按下) “與” (非B),即“任何鍵按下且第二位輸入錯(cuò)誤”。這樣如果我們正輸入第一位,/A\不會(huì)被復(fù)位;如果/A\已經(jīng)被激活,那么只有/A\應(yīng)當(dāng)被復(fù)位。因此在第二位輸入錯(cuò)誤而且第一位已經(jīng)輸入時(shí)繼續(xù)邏輯運(yùn)算(B* & A) =: (AB*),這樣/AB*\就復(fù)位了記憶單元/A\。為了避免如果按按鈕時(shí)間過長從而使/A\錯(cuò)誤地被復(fù)位的問題,我們加入了主延遲元件/dt+\。/AB*\后面的非門是為了人工復(fù)位而設(shè)計(jì)的(例如可以連接一個(gè)壓力板)。
然后,把整個(gè)復(fù)位電路復(fù)制到Key[2]上去,除了人工復(fù)位端由(非A)引出,自動(dòng)復(fù)位端(即錯(cuò)誤輸入后的)從C引出。從A接來的人工復(fù)位阻止在第一位未輸入前B就被激活。所以這一系列線路保證了本裝置密碼的順序敏感特性。
問題是為什么我們要使用短延遲方塊/dt-\。如果/A\激活后,第二位也成功輸入,那么B激活,(非B)變?yōu)榈碗娖健5?dāng)(非B)仍然為高電平時(shí),按鍵觸發(fā)事件也被激活,A會(huì)被錯(cuò)誤地復(fù)位——但這一切沒有發(fā)生。/dt-\方塊的應(yīng)用使得在按鍵觸發(fā)事件被激活之前/B\可以有充足的時(shí)間作出反應(yīng)。
對(duì)于/C\來說,只需要引自B的人工復(fù)位端即可以防止C在B激活之前被錯(cuò)誤激活,同時(shí)也能保證在人工復(fù)位端復(fù)位/A\與/B\時(shí),/C\也可以被復(fù)位。
優(yōu)缺點(diǎn):
+
您可以在不改變電路的前提下改變每一位密碼。
+
您可以依據(jù)同樣原理擴(kuò)展比較模塊電路以使密碼鎖支持更多位數(shù)的密碼。
+
您可以通過將除了最后一位之外的任何位為(0000)二進(jìn)制來減少密碼位數(shù)。
+
您可以將最后一位設(shè)為(0000)二進(jìn)制來直接使門打開。
-
想要支持越多的位數(shù),輸入欄就越長。您可以選擇被編碼的按鍵以保持電路的小規(guī)模——但要小心,事實(shí)上輸入編碼電路比起由于位數(shù)增加而使背后巨大的裝置規(guī)模變得更大來說,是微不足道的。
嚴(yán)格來說不算缺點(diǎn)的缺點(diǎn):本電路中當(dāng)密碼是311時(shí)可能會(huì)出現(xiàn)剛輸入到第二位,密碼鎖就打開了。為了防止這種情況,用中繼器在(非A)與(復(fù)位B)之間加一個(gè)延遲即可。
如果您修復(fù)了這一點(diǎn),電路會(huì)因密碼長度差異而具有以下的加密強(qiáng)度:( ||位數(shù)|| = 2n-1,密碼組合數(shù):||位數(shù)||長度?)
長度
1位數(shù)
2位數(shù)
3位數(shù)
4位數(shù)
5位數(shù)
2 位
3
9
27
81
243
3 位
7
49
343
2401
16807
4 位
15
225
3375
50625
759375
5 位
31
961
29791
923521
28629151
雜項(xiàng)
對(duì)順序不敏感的密碼門
只要特定組合的拉桿拉下或是按鈕按下,門就會(huì)打開。 (注:您需要對(duì)邏輯門有一定的了解才能理解本設(shè)備的構(gòu)造)
RS或非密碼鎖
把一系列的按鈕連接到RS鎖存器陣列的S端,然后根據(jù)需要將這些RS鎖存器的Q端或Q端連入一系列與門的輸入,將與門的輸出接到鐵門那里。最后,用一個(gè)單獨(dú)的復(fù)位用按鈕連接所有RS鎖存器的R端。RS鎖存器使用的是Q端(需要按按鈕)還是Q端(不需按按鈕)決定了密碼組合。
簡單的例子:
?
這個(gè)例子不具有自動(dòng)關(guān)門功能。如果加入自動(dòng)復(fù)位電路就可以解決這個(gè)問題。
與門密碼鎖
基于與門的組合鎖僅僅需要拉桿開關(guān)、與門和非門。像下面的例子一樣,與門鎖具構(gòu)造極其簡單,但在復(fù)雜系統(tǒng)中不具有動(dòng)態(tài)變化能力,也沒有自動(dòng)復(fù)位裝置。密碼組合取決于拉桿所附著方塊后面是否有火把附著(起到非門的作用)。您可以像這個(gè)例子一樣在最末端的與門處放一個(gè)具有最高權(quán)限的拉桿,只有拉桿拉下時(shí),輸入正確密碼才能開門。
?
或門密碼鎖
或門密碼鎖就更為簡便了,當(dāng)所有輸入全部錯(cuò)誤時(shí),輸出才會(huì)無信號(hào)。
由于或門密碼鎖的高壓縮性與快速反應(yīng)能力,本裝置對(duì)于地址解碼器與可尋址存儲(chǔ)器(RAM)極其有用。
設(shè)計(jì)方案A。密碼由輸入端那里的紅石火把決定(圖中為1001)。
?
您也可以通過把輸入端后的紅石線改成中繼器,從而能夠讓拉桿門都靠在一起。
同理,您可以擴(kuò)展更多的輸入端。
設(shè)計(jì)方案B。密碼由藍(lán)色區(qū)域那里的反相器決定(圖中為001001)。
?
N為輸入端數(shù)量 K為您希望設(shè)置的密碼中“1”的個(gè)數(shù)
設(shè)計(jì)方案
A
B
尺寸
2N-1x3x1
Nx6x2
紅石火把數(shù)量
K
2N-K
紅石粉數(shù)量
3N-K-1
2.5N + 2K
信號(hào)分類輸出裝置
?
深色方格為裝置本體,淺色方格標(biāo)明擴(kuò)展方式
本裝置構(gòu)造簡單,實(shí)質(zhì)上只有一個(gè)或門與一個(gè)與門。
輸入端為右側(cè)和下側(cè)。這個(gè)設(shè)備將輸入信號(hào)分類,兩輸入均為“1”時(shí),上側(cè)輸出才為“1”;兩輸入均為“0”,左側(cè)輸出才為0,這樣您就可以統(tǒng)計(jì)兩個(gè)輸入端1與0的個(gè)數(shù)或持續(xù)時(shí)間了。 如圖所示,本設(shè)計(jì)方案十分容易擴(kuò)展。淺色的方格展示了擴(kuò)展的方法與輸入、輸出端的位置。依照?qǐng)D示,將同樣的裝置對(duì)應(yīng)端口接入即可。
3位分類輸出裝置的真值表:
A
B
C
1
2
3
0
0
0
0
0
0
1
0
0
1
0
0
0
1
0
1
0
0
0
0
1
1
0
0
1
1
0
1
1
0
0
1
1
1
1
0
1
0
1
1
1
0
1
1
1
1
1
1
順序敏感的RS或非密碼鎖
這種密碼鎖只有當(dāng)以特定順序按下按鍵時(shí),門才會(huì)打開。
注:您需要對(duì)邏輯門與MCRS符號(hào)有一定的了解才能理解本設(shè)備的構(gòu)造。
做一系列的按鈕,并只連接其中一個(gè)到RS或非鎖。然后把RS或非鎖與第二個(gè)按鈕連接至通向另一個(gè)RS或非鎖的與門,繼續(xù)這個(gè)步驟下去直到你連接了所有的按鈕或者對(duì)這個(gè)鎖滿意了。把最后一個(gè)的RS或非鎖和一個(gè)來自輸入按鈕的信號(hào)連接到一個(gè)單獨(dú)的與門,接出到輸出的RS或非鎖。然后把所有剩余的按鈕都連接到其他RS或非鎖的復(fù)位以將重置信號(hào)發(fā)送到每一個(gè)RS或非鎖。在門旁邊放置一個(gè)壓力板可以將電路重置。這種類型的鎖的安全性有嚴(yán)格的限制。比如說,不是所有按鈕都能被使用,否則這個(gè)系統(tǒng)將無法重置。
對(duì)于一個(gè)可任意組合大小,使用到了所有的按鈕以及附帶一個(gè)錯(cuò)誤重置系統(tǒng)的鎖,你需要使用不同的方法重置它。為了建造這個(gè)電路,將一組按鈕(任何數(shù)字,最好在四個(gè)以上)連接到一系列對(duì)應(yīng)的中繼器上。進(jìn)行必要的方向翻轉(zhuǎn)以便所有的中繼器都能夠被對(duì)應(yīng)的按鈕充能或去能。這些中繼器為一排方塊提供信號(hào)。在方塊的頂部,放一個(gè)對(duì)應(yīng)于第一個(gè)數(shù)字的錯(cuò)誤按鈕的火把。用紅石粉將正確的按鈕和對(duì)應(yīng)的RS或鎖存器連接起來,使該按鈕能激活RS或鎖存器。在連接著錯(cuò)誤按鈕的火把上方放上一排方塊,并在頂部放上紅石粉。然后將這些紅石粉連接到第一個(gè)RS或鎖存器的復(fù)位。只有按下正確的按鈕才能激活RS或鎖存器,而按下其他的按鈕將會(huì)重置整個(gè)電路。將RS或鎖存器的輸出連接到與門的一半。在第一排復(fù)位火把之后,放置另一排中繼器和另一排方塊。再把連接錯(cuò)誤的按鈕的紅石線放在連接正確的按鈕的紅石線下面。將正確的按鈕連接到與門的另一半。只有滿足按對(duì)了第一個(gè)按鈕激活第一個(gè)RS或鎖存器并且正確地按下第二個(gè)按鈕的條件下,與門才會(huì)發(fā)送一個(gè)信號(hào)來激活第二個(gè)RS或鎖存器。同樣,將連接錯(cuò)誤的按鈕的火把連接到第二個(gè)RS或鎖存器的復(fù)位線。注:第二個(gè)按鈕也會(huì)重置第一個(gè)RS或鎖存器,你需要用一個(gè)最大延遲的中繼器來延遲重置信號(hào),以確保在激活第二個(gè)RS或鎖存器之后,重置上一個(gè)RS或鎖存器。繼續(xù)以相同的方式構(gòu)建電路,直到達(dá)到所需的位數(shù)為止。在操作中,當(dāng)一個(gè)按鈕被按下時(shí),每個(gè)RS或鎖存器檢查(通過與門)是否為先前RS或鎖存器被激活,并且這個(gè)RS或鎖存器正確的按鈕已被按下。只有當(dāng)以正確的順序按下按鈕時(shí),信號(hào)才能通過條件RS或鎖存器才能把信號(hào)輸出到最后。將最后一個(gè)RS或鎖存器的輸出連接到門上,并將一條線連接到門內(nèi)的壓力板上,以重置RS或鎖存器。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
目錄
·?1概述
·?1.1應(yīng)用
·?1.2計(jì)算機(jī)的基礎(chǔ)功能
·?1.3計(jì)算機(jī)的部件
·?2第一章 建造一臺(tái)計(jì)算機(jī)
·?2.1介紹與條件
·?2.2MASIC計(jì)算機(jī)
·?2.3步驟1:內(nèi)存和地址解碼器(理論)
·?2.4步驟1:內(nèi)存和地址解碼器(實(shí)踐)
·?2.4.1地址解碼器
·?2.5步驟2:構(gòu)建算術(shù)邏輯單元(理論)
·?2.5.1兩個(gè)數(shù)字相加
·?2.5.1.1分?jǐn)?shù)數(shù)字
·?2.5.2兩個(gè)數(shù)字相減
·?2.5.3兩個(gè)數(shù)字相乘
·?2.6步驟2:構(gòu)建算術(shù)邏輯單元(實(shí)踐)
·?2.7步驟3:指令集和機(jī)器結(jié)構(gòu)(理論)
·?2.7.1必要條件
·?2.7.2MASIC指令集
·?2.7.3編寫程序
·?2.7.4指令周期
·?2.8步驟3:指令集和機(jī)器結(jié)構(gòu)(實(shí)踐)
·?3第二章 紅石計(jì)算機(jī)的規(guī)劃
·?3.1執(zhí)行模型
·?3.1.1哈佛結(jié)構(gòu)
·?3.1.2馮·諾依曼結(jié)構(gòu)
·?3.2位數(shù)大小
·?3.2.1數(shù)據(jù)字
·?3.2.2命令字
·?3.3指令集
·?3.4構(gòu)建CPU
·?3.4.1總線
·?3.4.2部件
·?4第三章 計(jì)算機(jī)的設(shè)計(jì)
·?4.1指令集架構(gòu)
·?4.1.1狀態(tài)
·?4.1.1.1信號(hào)
·?4.1.1.2數(shù)
·?4.2歸類
·?4.2.1映射
·?4.2.1.1數(shù)字
·?4.2.2形式化
·?4.2.2.1變量
·?4.2.3語義
·?4.2.3.1數(shù)據(jù)
·?4.3機(jī)器架構(gòu)
·?4.3.1算術(shù)邏輯單元(簡稱ALU)
·?4.3.1.1(數(shù)據(jù))總線
·?4.3.2存儲(chǔ)
·?4.3.2.1主存
·?4.3.2.2寄存器與標(biāo)志寄存器
·?4.3.2.3緩沖存儲(chǔ)器
·?4.3.2.4隨機(jī)存取存儲(chǔ)器
·?4.3.2.5二級(jí)存儲(chǔ)器
·?4.3.2.6三級(jí)存儲(chǔ)器
·?4.3.3機(jī)器狀態(tài)
·?4.3.3.1程序計(jì)數(shù)器
·?5提示
·?6參見
·?7注釋
概述
計(jì)算機(jī)促進(jìn)了人們通過編程與其交流的想法的實(shí)現(xiàn)。
這篇文章將會(huì)為在Minecraft中設(shè)計(jì)與建造計(jì)算機(jī)打下基礎(chǔ),假定讀者相當(dāng)熟悉傳統(tǒng)紅石電路并且有基本水平的計(jì)算機(jī)知識(shí)。
?事實(shí)上在不了解計(jì)算機(jī)是如何工作的情況下是無法建造計(jì)算機(jī)的。此教程旨在解釋你需要知道的所有內(nèi)容,但也確實(shí)需要一點(diǎn)對(duì)計(jì)算機(jī)科學(xué)的了解。涉及的最深層次達(dá)到IGCSE[注 1]?CS(計(jì)算機(jī)科學(xué))。
為了在Minecraft中建造計(jì)算機(jī)能有一個(gè)良好的開始,你應(yīng)該學(xué)習(xí)計(jì)算機(jī)科學(xué)。有非常多的資源與教程可以用來學(xué)習(xí)計(jì)算機(jī)科學(xué),但是推薦觀看Crash Course Computer Science作為入門課程,尤其是1-8節(jié)。盡管它不夠透徹,但其內(nèi)容可以作為你理解計(jì)算機(jī)的基礎(chǔ)。
在Minecraft中,大多數(shù)計(jì)算機(jī)是由紅石粉,紅石火把以及紅石中繼器組成的,以引起黏性活塞或者紅石燈的變化。它們被一系列的按鈕,拉桿,壓力板等等所控制。另外一些方法(本文沒有涉及)利用了漏斗,礦車或船與紅石。
應(yīng)用
計(jì)算機(jī)與計(jì)算器的區(qū)別在于計(jì)算器在沒有用戶輸入時(shí)無法連續(xù)執(zhí)行復(fù)雜的指令,而計(jì)算機(jī)可以連續(xù)比較并處理指令來完成任務(wù)。計(jì)算機(jī)可以被用在很多方面,從創(chuàng)造一個(gè)智能房屋到運(yùn)行一張冒險(xiǎn)地圖。但是,由于Minecraft對(duì)于計(jì)算機(jī)的限制(將會(huì)在后文說明),它們?nèi)匀恢皇莻€(gè)抽象概念,但也是理解CPU結(jié)構(gòu)與嵌入式系統(tǒng)的良好工具。
由于Minecraft中的紅石計(jì)算機(jī)非常慢并且臃腫,很難為它們找到實(shí)際應(yīng)用。即使是最快的紅石計(jì)算機(jī)也要花數(shù)秒來完成一次計(jì)算,還有著數(shù)千方塊大的體積。因?yàn)槊罘綁K的速度快且有著清晰且高級(jí)的指令,所以它們相比于紅石計(jì)算機(jī)有很大的優(yōu)勢(shì)。
有一些Mod可以改變計(jì)算機(jī)的速度,比如TickrateChanger能改變游戲刻速率。
計(jì)算機(jī)的基礎(chǔ)功能
計(jì)算機(jī)具有以下能力:
·?從有地址的內(nèi)存中讀寫;
·?可以對(duì)內(nèi)存的狀態(tài)進(jìn)行比較,并據(jù)此執(zhí)行操作,包含了重寫內(nèi)存;
·?可以基于寫在內(nèi)存中的內(nèi)容運(yùn)行一個(gè)功能。我們把這樣的內(nèi)容叫作“程序+數(shù)據(jù)”,并將其編寫為程序。
一個(gè)值得注意的例子是最基本的計(jì)算機(jī)概念,即圖靈機(jī),它能從一條無窮長的編碼和指令中讀取信息,以完成一個(gè)功能。
在Minecraft中設(shè)計(jì)和建造圖靈機(jī)是可以實(shí)現(xiàn)的。然而,由于我們要設(shè)計(jì)更基本的一些東西,所以我們不討論這個(gè)。
計(jì)算機(jī)的部件
一個(gè)現(xiàn)代計(jì)算機(jī)有五個(gè)基礎(chǔ)部件。為了保證正常運(yùn)行,并通過執(zhí)行計(jì)算來處理數(shù)據(jù),這些部件是必不可少的。
?
計(jì)算機(jī)的五個(gè)組成部分
1.?運(yùn)算單元(ALU)(這不是必需的,但通常存在)
·?執(zhí)行加減乘除(也有的計(jì)算機(jī)有例如移位的功能);
·?通過邏輯門進(jìn)行布爾運(yùn)算。
2.?控制單元(CU)
·?執(zhí)行接收到的指令;
·?控制其他單元。
3.?數(shù)據(jù)存儲(chǔ)器(Data Memory)
·?存儲(chǔ)與返回?cái)?shù)據(jù)。
4.?指令存儲(chǔ)器(Instruction Memory)
·?返回指令,并發(fā)送到CU;
·?可以被設(shè)置,但不需要向數(shù)據(jù)存儲(chǔ)器那樣頻繁。
·?在馮諾依曼結(jié)構(gòu)下是不必須的(指令將會(huì)和數(shù)據(jù)存儲(chǔ)在一起)
5.?輸入/輸出設(shè)備(I/O)
·?允許計(jì)算機(jī)與玩家和世界交互;
·?可以將信息輸入到計(jì)算機(jī)(按下按鈕,或通過陽光探測(cè)器);
·?可以從計(jì)算機(jī)中輸出信息(通過紅石燈、音符盒等)。
第一章 建造一臺(tái)計(jì)算機(jī)
介紹與條件
紅石的邏輯緊密地反映了二進(jìn)制邏輯,即紅石元件可以是激活或非激活的,可以被解釋為0或1。在本教程中,我們將提到基礎(chǔ)的二進(jìn)制邏輯與眾多簡單的計(jì)算機(jī)科學(xué)術(shù)語。這里有一篇文章,很好地解釋了二進(jìn)制以及如何轉(zhuǎn)化到二進(jìn)制。請(qǐng)讀計(jì)算機(jī)的結(jié)構(gòu)一節(jié),因?yàn)榻酉聛砦覀儗?duì)于計(jì)算機(jī)的設(shè)計(jì)是基于此的。
這一章會(huì)關(guān)注于知識(shí)的運(yùn)用與紅石的操作,以來創(chuàng)造一臺(tái)簡單的8位計(jì)算機(jī),并且會(huì)解釋如何建造以及它是如何工作的。
所有的內(nèi)容被分為了理論與實(shí)踐兩部分。理論部分會(huì)深入解釋會(huì)發(fā)生什么,而實(shí)踐部分會(huì)說明如何在Minecraft中建造,它應(yīng)該是什么樣子,可能會(huì)提供存檔。
·?我們將要建造的計(jì)算機(jī)(MASIC計(jì)算機(jī))
·?步驟1:內(nèi)存和地址解碼器(理論)?(未完成)
·?步驟1:內(nèi)存和地址解碼器(實(shí)踐)
·?步驟2:構(gòu)建算術(shù)邏輯單元(理論)
·?步驟2:構(gòu)建算術(shù)邏輯單元(實(shí)踐)?(未完成)
·?步驟3:指令集和機(jī)器結(jié)構(gòu)(理論)
·?步驟3:指令集和機(jī)器結(jié)構(gòu)(實(shí)踐)?(未完成)
MASIC計(jì)算機(jī)
我們將在本教程中制作的計(jì)算機(jī)擁有8比特、16字節(jié)的內(nèi)存。我們將要制作的輸入輸出系統(tǒng)是一個(gè)七段的數(shù)字顯示器(以顯示十六進(jìn)制數(shù)字)和一個(gè)控制面板。
?
MASIC計(jì)算機(jī)旨在成為一種適合所有人的計(jì)算機(jī),并且不專門從事一項(xiàng)任務(wù),因此它可以通過讀取其自己的內(nèi)存進(jìn)行完全編程(在第7節(jié):指令集中進(jìn)行了說明)。簡單的I/O(輸入/輸出)非常適合多種用途,并且存儲(chǔ)器大小足夠。它以相當(dāng)快的速度運(yùn)行(由于其體積?。?。
步驟1:內(nèi)存和地址解碼器(理論)
解碼器將二進(jìn)制的數(shù)字轉(zhuǎn)換成十進(jìn)制。例如,看著8位解碼器,00點(diǎn)亮代表0的第一個(gè)燈,01點(diǎn)亮代表1的第二個(gè)燈,10點(diǎn)亮代表2的第三個(gè)燈,11點(diǎn)亮代表3的最后一個(gè)燈。
步驟1:內(nèi)存和地址解碼器(實(shí)踐)
地址解碼器
?
0000 0000(注意第一條輸出已亮起)
?
0000 0001(注意第二條輸出已亮起)
?
0000 0010
?
0000 0011
這是我們要構(gòu)建的地址解碼器的設(shè)計(jì)。
?
上面是一個(gè)簡單的2位狀態(tài),因此它有兩個(gè)輸入(通過左右中繼器)。輸出是在圖片最上方的紅石線,當(dāng)所有條件滿足時(shí)會(huì)關(guān)閉。狀態(tài)是紅石信號(hào)輸入是否會(huì)關(guān)閉上面的紅石線; 如果是,則狀態(tài)為紅石輸入。在上面例子中,必須是左側(cè)輸入為OFF(0),右側(cè)輸入為ON(1),才能關(guān)閉頂部的紅石線。因此,它期望的狀態(tài)為(OFF,ON)(即二進(jìn)制01)。
這里,顏色為藍(lán)色的方塊應(yīng)設(shè)為ON(1),以便停止激活頂部的紅石線。一旦每一位都停止激活紅石線,紅石線就會(huì)關(guān)閉。
這些基本上是每條輸入用一個(gè)或兩個(gè)非門,多條匯入到一個(gè)或門,然后用非門后輸出。
?
上面是一個(gè)8位狀態(tài),它期望8個(gè)輸入的順序正好是0000 1101。紅石火把正好按照0000 1101的順序放置,所以我們看到頂部的紅石線熄滅。
現(xiàn)在,如果將它們中的多個(gè)放在一起,我們就可以用藍(lán)色位以二進(jìn)制數(shù)進(jìn)行計(jì)數(shù),以獲得8位的所有255個(gè)狀態(tài)。下面的一個(gè)是8位,并具有四個(gè)狀態(tài)期望。查看右側(cè)的圖像以查看實(shí)際效果。現(xiàn)在,每個(gè)綠色輸出可以是一個(gè)存儲(chǔ)單元,如果我們繼續(xù)以二進(jìn)制進(jìn)行計(jì)數(shù),它將計(jì)到255。
?
輸入為0000 0011(紅石火把為輸入),藍(lán)色位與當(dāng)前狀態(tài)匹配時(shí),綠色輸出為ON。
·?0000 0000 - 第一個(gè)信號(hào)輸出(在右側(cè)的圖像上)
·?0000 0001 - 第二個(gè)信號(hào)輸出
·?0000 0010 - 第三個(gè)信號(hào)輸出
·?0000 0011 - 第四個(gè)信號(hào)輸出
因此,現(xiàn)在我們繼續(xù)以二進(jìn)制數(shù)進(jìn)行計(jì)數(shù),直到數(shù)到0000 1111并停止。現(xiàn)在我們應(yīng)該有24(16)個(gè)狀態(tài)期望值,這就說明我們完成了地址解碼器。由于指令集的局限性,我們不會(huì)繼續(xù)計(jì)數(shù)到1111 1111。
步驟2:構(gòu)建算術(shù)邏輯單元(理論)
算術(shù)邏輯單元(ALU)會(huì)比較并執(zhí)行二進(jìn)制數(shù)的數(shù)學(xué)運(yùn)算,并將結(jié)果與控制單元(CU,即計(jì)算機(jī)的中心組件)進(jìn)行交互。本來也應(yīng)與CPU交互,但它將與計(jì)算機(jī)本身一樣大。許多教程都希望讀者首先構(gòu)建ALU,因此該主題在網(wǎng)上被廣泛涉及。
我們將要構(gòu)建的ALU可以在兩個(gè)輸入上執(zhí)行四個(gè)重要操作,并返回正確的輸出。A,B均為8位輸入。
·?A + B(A加上B)
·?A >>(右移一位,與二進(jìn)制除以2相同)
·?<< A(左移一位,與二進(jìn)制乘以2相同)
·?非A(將A每位取反)
由于某些程序需要大量操作才能運(yùn)行,因此計(jì)算機(jī)內(nèi)部還可以有多個(gè)ALU,這些操作不依賴于先前的操作,因此可以進(jìn)行線程化。 所以將它們委派給不同的ALU可以顯著提高該程序的速度。
?
二進(jìn)制加法器
兩個(gè)數(shù)字相加
在一個(gè)加法單元中,對(duì)于每個(gè)位(對(duì)于我們的計(jì)算機(jī),我們需要四個(gè),因此需要4位)都要有一個(gè)全加器。全加器將接收三個(gè)輸入,每個(gè)輸入可以是1或0。前兩個(gè)將是用戶的輸入,第三個(gè)將是“進(jìn)位”輸入?!斑M(jìn)位”輸入是上一個(gè)全加器的輸出,稍后將對(duì)此進(jìn)行說明。全加器將輸出兩個(gè)結(jié)果:首先是輸出,然后是“進(jìn)位”輸出,該輸出作為輸入發(fā)送到下一個(gè)全加器中,占一個(gè)位。 例如,希望將數(shù)字0101和1011相加。第一個(gè)全加器將把第一位的值1和1作為它們的兩個(gè)輸入(我們從右到左閱讀)。由于這是第一次加法計(jì)算,因此沒有“進(jìn)位”輸入。全加器將把1和1相加;它是0,并將進(jìn)位的1送到下一個(gè)全加器的進(jìn)位輸入。下一個(gè)全加器將把0和1相加,進(jìn)位輸入為1。因此將0、1和1相加,得0,并且下一個(gè)進(jìn)位輸入為1。重新回顧二進(jìn)制加法,應(yīng)該能解決疑惑。
?
全加器
為了執(zhí)行加法運(yùn)算,所有ALU都需要多個(gè)全加器。每兩位送入一個(gè)全加器,所有全加器互相連接,產(chǎn)生的輸出是兩個(gè)字節(jié)的和。每個(gè)全加器具有一個(gè)輸入、一個(gè)輸出、一個(gè)進(jìn)位輸入和一個(gè)進(jìn)位輸出,就像人執(zhí)行9 + 1或01 + 01的加法操作一樣。全加器由幾個(gè)邏輯門構(gòu)成,這可以通過二進(jìn)制的命名法實(shí)現(xiàn)。?教程/算術(shù)邏輯給出了全加器和半加器的非常詳細(xì)的介紹,目前,有一個(gè)構(gòu)造方法的示意圖。它提供四個(gè)輸入/輸出,應(yīng)與其他加法器連接以創(chuàng)建一個(gè)單元。對(duì)于此示例,我們將在四位計(jì)算機(jī)中將四個(gè)加法器連接在一起,以便我們可以將所有四個(gè)位都取為輸出。第一個(gè)加法器將缺少輸入進(jìn)位,這是因?yàn)橹暗奈唬ǖ谝晃唬]有任何進(jìn)位。輸入進(jìn)位將保持為零。第四加法器還將缺少輸出進(jìn)位,并且由于我們只能支持四個(gè)位,因此將忽略該輸出。附加的第四個(gè)進(jìn)位輸出連接到溢出標(biāo)志,表示無法完成該操作。這稱為二進(jìn)制溢出。
因此,基本上,進(jìn)入Minecraft并構(gòu)建一個(gè)完整的二進(jìn)制加法器(如圖所示)并將其連接起來。應(yīng)該有八個(gè)輸入和輸出。嘗試將拉桿和紅石燈分別放在兩端以測(cè)試。因此0010 + 0011應(yīng)該算出0101(2 + 3 = 5,我們從右往左讀)。
分?jǐn)?shù)數(shù)字
計(jì)算機(jī)通過浮點(diǎn)算術(shù)的形式處理小數(shù),僅在較大位計(jì)算機(jī)(16-64位)和需要使用小數(shù)的計(jì)算機(jī)中有用。浮點(diǎn)運(yùn)算或高精度算法可以實(shí)現(xiàn)此目的。另一種更簡單但效率較低的方法是為所有數(shù)字分配2的一個(gè)冪,以使它們和選定的2的冪“相乘”。玩家必須對(duì)每個(gè)數(shù)字都執(zhí)行此操作,并假設(shè)單位1是您選擇的2的冪的1倍。例如5 = 1012,因此5 × 23?= 1010002,即5(1012)向左移動(dòng)了3位(1010002)。因此,現(xiàn)在,新系統(tǒng)中的值為1 × 23?= 10002,這將為0.12、0.012或0.0012留下表示方法;0.012?× 23?= 102。這將導(dǎo)致您的計(jì)算機(jī)設(shè)置更為復(fù)雜。
兩個(gè)數(shù)字相減
?
一個(gè)全部帶正負(fù)符號(hào)的加法器(加減混合計(jì)算元件)
數(shù)字減法非常簡單。ALU首先必須更改第二個(gè)數(shù)字(即減數(shù)),將其從正數(shù)轉(zhuǎn)換為負(fù)數(shù)。一個(gè)數(shù)取負(fù),對(duì)應(yīng)的二進(jìn)制補(bǔ)碼是反轉(zhuǎn)原二進(jìn)制數(shù)補(bǔ)碼(0變?yōu)?,1變?yōu)?)后再加1。
示例:10減去9
1. 0000 1001
(9的二進(jìn)制補(bǔ)碼,我們希望將它轉(zhuǎn)換為-9)
2. 1111 0110
(將9取反,所有0變?yōu)?,1變?yōu)?)
3. 1111 0111
(加1,這是-9的二進(jìn)制補(bǔ)碼)
4. 0000 1010
(10的二進(jìn)制補(bǔ)碼)
+ 1111 0111
(加上-9的二進(jìn)制補(bǔ)碼)
----
?
0000 0001
結(jié)果(10 +(-9)= 1)(存在溢出,這僅意味著結(jié)果不是負(fù)數(shù))
這帶來了帶符號(hào)數(shù)字的復(fù)雜性,但這是二進(jìn)制數(shù)的作用,用來將其指定為正數(shù)或負(fù)數(shù)。結(jié)果是負(fù)數(shù)還是正數(shù)由溢出標(biāo)志確定。如果有溢出,則表示數(shù)字為正,否則為負(fù)。
為實(shí)現(xiàn)這一功能,可以讓ALU做3個(gè)操作。 實(shí)現(xiàn)A減B的操作是:A SUB B
·?NOT B (將B的每一位取反)
·?B ADD 1 (將B自加1)
·?A ADD B (將A加B的值存到A)
·?RETURN A (A即為返回值)
兩個(gè)數(shù)字相乘
乘法是重復(fù)的加法,因此最簡單(但效率低下)是將A多次加到變量B上。
這是它的偽機(jī)代碼:
操作: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行繼續(xù)執(zhí)行)
·?RETURN C (C為返回值)
但是,有更高效的方法做乘法。一個(gè)好方法是將第一個(gè)數(shù)字重復(fù)位移到第二個(gè)數(shù)字中每個(gè)1的位置,然后求和。
下標(biāo)2表示二進(jìn)制,粗體表示十進(jìn)制。
操作
說明
?
?
?
?
?
1
1
代表3,注意有2個(gè)1
×
?
?
1
0
1
1
代表11
?
?
?
?
?
?
1
1
將112左移0位,因?yàn)槎M(jìn)制數(shù)10112的第1位是12
+
?
?
?
1
1
0
將112左移1位,因?yàn)槎M(jìn)制數(shù)10112的第2位是12
+
?
1
1
0
0
0
將112左移3位,因?yàn)槎M(jìn)制數(shù)10112的第4位是12
?
二進(jìn)制數(shù)10112的第3位是02,因此不用加
?
1
0
0
0
0
1
結(jié)果為33
因此這對(duì)更大的數(shù)操作起來更高效。
操作:A * B
1.?C = 0
2.?D = 0
3.?JUMP IF (BIT (D) OF B == 0) TO LINE 5 (如果B的第D+1位是0,則跳到第5行)
4.?(Set C to) C ADD A (將C+A的值存入C)
5.?(Set D to) D ADD 1 (將D自加1)
6.?(Set A to) << A (將A左移1位)
7.?JUMP IF (D < LENGTH OF B) TO LINE 3 (如果D比B的位數(shù)小,即沒有超出,則跳到第3行)
8.?RETURN C (C即為返回值)
不要忘記:
<< A (左移1位)等價(jià)于A * 2
>> A (右移1位)等價(jià)于A / 2
假如這些數(shù)字是唯一確定的或者CPU必須做大量的相似數(shù)字處理,可以考慮使用一個(gè)可查的窮舉表來頻繁調(diào)用乘法。因此,在極端情況下,你可以通過硬編碼的方式來得到答案。
?
步驟2:構(gòu)建算術(shù)邏輯單元(實(shí)踐)
步驟3:指令集和機(jī)器結(jié)構(gòu)(理論)
詳細(xì)說明在第2章:指令集。我們可以創(chuàng)建自己的一套。
對(duì)于我們正在建造的MASIC計(jì)算機(jī),有一個(gè)8位的系統(tǒng),所以這意味著在堆棧內(nèi)存的每個(gè)插槽上的每條指令都是8位。堆棧內(nèi)存是存儲(chǔ)任何信息并存儲(chǔ)在RAM中的內(nèi)存。所以將會(huì)有一個(gè)計(jì)數(shù)器,稱為程序計(jì)數(shù)器,它每周期遞增1次。循環(huán)是指CPU獲取指令,解碼指令(找出該指令是做什么的)和執(zhí)行指令(執(zhí)行它讓它做的事情)。然后,通過遞增程序計(jì)數(shù)器并在堆棧內(nèi)存中讀取位于該位置的信息,移動(dòng)到下一個(gè)內(nèi)存地址。
因此,堆棧內(nèi)存中的每個(gè)字節(jié)都有8位供我們使用。有些指令需要一個(gè)地址,比如將內(nèi)存加載到寄存器中,這樣我們就可以對(duì)其執(zhí)行操作。每條指令將被分成兩部分,每部分4位。第一種是類型,類型將指定計(jì)算機(jī)必須做什么;地址將是我們將執(zhí)行操作的值所在位置。
操作碼/操作數(shù)
憑借這個(gè)4位數(shù)據(jù)組,我們可以有24種操作碼,即代表16種不同的操作。我們的電腦將有兩個(gè)寄存器,所以因此操作碼的一位用于指定操作將在其上執(zhí)行的寄存器,并在下文用x表示。
指令與內(nèi)存將被放在同一位置,由于指令的地址部分只有四位,我們只能從1-16行引用內(nèi)存,需要一些巧妙的編程來適應(yīng)更大的程序。每個(gè)程序的內(nèi)存也限制為16字節(jié)。值和指令本質(zhì)上是相同的,因此,如果您編寫一條指令將其存儲(chǔ)到先前存儲(chǔ)指令的行上,這將有效地用一個(gè)值覆蓋該指令。
意外執(zhí)行值是一個(gè)問題,因此必須設(shè)定并使用STOP命令來防止任何錯(cuò)誤。這需要理解的東西太多了,所以自己去找找基礎(chǔ)教程吧。另外,不要忘記為您的IGCSE同時(shí)使用客戶端/服務(wù)器端和信息通信技術(shù)。
必要條件
本節(jié)將介紹計(jì)算機(jī)中常見的簡單主題和組件。?看懂下文你需要:看懂計(jì)算機(jī)的部件和第2章中的信息及第3章中的概念,如ALU、RAM、寄存器和二進(jìn)制操作。
MASIC指令集
因?yàn)檫@里的計(jì)算機(jī)是指令集的草稿,只有基本要素。這是基于其他匯編語言的,但經(jīng)過更改以適應(yīng)我們的體系結(jié)構(gòu)。有兩個(gè)寄存器,所以我們需要指令在兩個(gè)寄存器上執(zhí)行操作。
二進(jìn)制碼
操作碼
效果注釋
0000
LOAD R1
將地址加載到寄存器1中
0001
STORE R1
將寄存器1的內(nèi)容存儲(chǔ)到該地址中
0010
JUMP R1 IF
如果寄存器1的值為0,則跳到地址一行
0011
ADD R1
將地址處的內(nèi)容添加到寄存器1
0100
<<R1
在寄存器1中向左移位
0101
NOT R1
按位非寄存器1(對(duì)寄存器1按位取反)
0110
JUMP OPERAND
跳到第OPERAND行
0111
STOP
終止程序
1000
LOAD R2
將地址加載到寄存器2中
1001
STORE R2
將寄存器1的內(nèi)容存儲(chǔ)到該地址中
1010
JUMP R2 IF
如果寄存器2的值為0,則跳到地址一行
1011
ADD R2
將地址處的內(nèi)容添加到寄存器1
1100
<<R2
在寄存器2中向左移位
1101
NOT R2
按位非寄存器2(對(duì)寄存器2按位取反)
1110
OUT R1
輸出寄存器1
1111
OUT R2
輸出寄存器2
解釋:
1000 0011表示將地址3的數(shù)加載到R2寄存器,因?yàn)?000為加載到寄存器2中,0011為3。
這些可以在一個(gè)過程中進(jìn)行,以便可以執(zhí)行功能。
編寫程序
下面這個(gè)程序能計(jì)算斐波那契數(shù)列:(0,1,1,2,3,5,8……)
地址
二進(jìn)制指令
實(shí)際指令
注釋
0
0000 1110
LOAD R1 14
將寄存器1設(shè)置為地址14的值
1
1000 1111
LOAD R2 15
將寄存器2設(shè)置為地址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,重復(fù)執(zhí)行
...
?
?
?
14
0000 0001
1
?
15
0000 0001
1
?
前面是低級(jí)匯編語言的一個(gè)例子。如果它是用高級(jí)語言編寫的,比如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;}
指令周期
?
圓角矩形為元件,矩形為不同單元,綠色箭頭為路線
指令集是低級(jí)匯編語言,所以我們希望將它更多地集成到硬件里。這圍繞著“獲取→解碼→執(zhí)行”循環(huán)(見上)在運(yùn)行。 在CPU中,有4個(gè)重要寄存器:
·?程序計(jì)數(shù)器(PC)跟蹤計(jì)算機(jī)目前運(yùn)行到哪里;
·?存儲(chǔ)地址寄存器(MAR)跟蹤下一個(gè)內(nèi)存地址的位置;
·?存儲(chǔ)數(shù)據(jù)寄存器(MDR)跟蹤當(dāng)前內(nèi)存在哪一個(gè)位置;
·?現(xiàn)行指令寄存器(CIR)跟蹤哪條指令正在被執(zhí)行;
·?ALU累加器(ACC)跟蹤ALU的輸入和輸出。
還有四個(gè)組件需要記?。旱刂方獯a器、內(nèi)存、指令解碼器和ALU。
獲?。‵etch)
程序會(huì)獲得下一條指令。
1.?PC將指令碼發(fā)送到MAR;
2.?PC自己增加1,為下一條指令做準(zhǔn)備;
3.?地址解碼器將地址解碼,并從內(nèi)存中獲取相應(yīng)地址中的信息;
4.?MDR接收到需要的信息。(在這個(gè)圖片的例子中,如果MAR為0001,MDR會(huì)接收到“LOAD R1 1”,即將地址1的數(shù)據(jù)加載到寄存器R1中)
解碼(Decode)
程序會(huì)識(shí)別獲取到的是什么指令。
1.?CIR通過信息流,從MDR中接收到信息;
2.?指令解碼器將指令解碼,知道接下來要做什么。
執(zhí)行(Execute)
程序會(huì)執(zhí)行這條指令。
1.?在本圖片例子中,程序接收到“LOAD R1 1”這條指令,指令解碼器將這條指令拆分為操作碼和操作對(duì)象。操作碼是“LOAD R1”,操作對(duì)象是“1”。
2.?操作對(duì)象被送到MAR,以便獲取對(duì)應(yīng)地址的信息。
3.?MDR接收到那個(gè)地址的信息。(在這個(gè)例子中,是同一行)
取決于指令,有四種情況可能發(fā)生。
·?如果指令是加(ADD),ACC就會(huì)被要求從信息流中獲取信息,ALU會(huì)對(duì)其執(zhí)行操作,再次輸出到ACC。
·?如果指令是加載(LOAD),控制單元(CU)會(huì)將指令加載到寄存器中。
·?如果指令是存儲(chǔ)(STORE),CU會(huì)將指定位置的值設(shè)置(SET)為內(nèi)存中MAR指定的值。
·?如果指令是輸出(OUT),CU會(huì)將指令送到外部輸出設(shè)備。
重復(fù)(Repeat)
指令周期會(huì)重復(fù)進(jìn)行,直到運(yùn)行到停止(STOP)指令,或是用完內(nèi)存。
步驟3:指令集和機(jī)器結(jié)構(gòu)(實(shí)踐)
第二章 紅石計(jì)算機(jī)的規(guī)劃
在Minecraft中,為了讓你的紅石計(jì)算機(jī)最適合你手頭的任務(wù),需要有以下三個(gè)主要的設(shè)計(jì)目標(biāo)。而有些得失需要進(jìn)行考慮,比如當(dāng)計(jì)算機(jī)的規(guī)模更大時(shí),運(yùn)行就會(huì)更慢,因?yàn)橹欣^器的數(shù)量會(huì)隨著距離的增加而增加。越多的內(nèi)存,意味著速度就越慢,體積越大。
緊湊程度
這臺(tái)計(jì)算機(jī)的規(guī)模有多???在Minecraft中,設(shè)計(jì)一臺(tái)生存模式的計(jì)算機(jī)很大可能會(huì)強(qiáng)調(diào)這一點(diǎn)。所需的重復(fù)次數(shù)將隨著大小的增加而增加。
內(nèi)存大小
它能容納多少的內(nèi)存?它可以計(jì)算多少數(shù)字和字節(jié)?這對(duì)于大規(guī)模的計(jì)算機(jī)來說是很重要的,如那些可以完成更復(fù)雜算法和更大規(guī)模指令集的計(jì)算機(jī)(例如說,計(jì)算平方根或是三角學(xué))內(nèi)存大小或者位體系結(jié)構(gòu)越大,計(jì)算機(jī)越復(fù)雜。
速度/性能
它能以多快的速度執(zhí)行操作呢?它是否達(dá)到了最大優(yōu)化的程度以執(zhí)行工作呢?使用定制設(shè)計(jì)構(gòu)建一個(gè)計(jì)算機(jī)可以將更多的任務(wù)和分配給硬件,從而大大地提升計(jì)算機(jī)的性能。這在現(xiàn)實(shí)世界中的某些超級(jí)計(jì)算機(jī)中表現(xiàn)得很明顯,這些超級(jí)計(jì)算機(jī)可以非常高效地進(jìn)行一些操作。Minecraft中的紅石計(jì)算機(jī)速度是非常慢的,一些模組,例如TickrateChanger可以更改Minecraft游戲客戶端的游戲刻速度,以提高計(jì)算機(jī)速度。
紅石計(jì)算機(jī)可以像真實(shí)計(jì)算機(jī)一樣運(yùn)作,遵循計(jì)算機(jī)設(shè)計(jì)和硬件架構(gòu)中的原則。有幾個(gè)關(guān)鍵的設(shè)計(jì)決策會(huì)影響架構(gòu);你對(duì)計(jì)算機(jī)預(yù)期的大小和功能應(yīng)該在構(gòu)建部件之前具體確定。建造紅石計(jì)算機(jī)需要理解這四個(gè)概念,并考慮最合適的方法,這對(duì)計(jì)算機(jī)是最實(shí)用的。
一些事情需要考慮:
·?執(zhí)行模型(內(nèi)存的計(jì)算機(jī)組織與程序存儲(chǔ)和執(zhí)行)
·?字節(jié)大?。ㄐ畔⒌拇笮?,你的紅石計(jì)算機(jī)用這些執(zhí)行命令)
·?命令集(紅石計(jì)算機(jī)的一個(gè)結(jié)構(gòu))
·?內(nèi)存大?。〝?shù)據(jù)可以存儲(chǔ)在內(nèi)存中,可存儲(chǔ)數(shù)據(jù)多少取決于內(nèi)存大?。?/p>
有一個(gè)這里確定的選擇將在你的計(jì)算機(jī)各種組件的設(shè)計(jì)中提供強(qiáng)有力的指導(dǎo)。
我們會(huì)在本章最后一節(jié)應(yīng)用這些內(nèi)容并計(jì)劃構(gòu)建CPU。這個(gè)CPU會(huì)在下一章建造。
執(zhí)行模型
在內(nèi)存中存儲(chǔ)命令塊的技術(shù)叫做程序,允許計(jì)算機(jī)同時(shí)執(zhí)行各種不同的任務(wù)。由計(jì)算機(jī)來存儲(chǔ)和檢索這些程序使用的設(shè)備是計(jì)算機(jī)的執(zhí)行模型。世界上最成功的兩種執(zhí)行模型,哈佛和馮·諾依曼,幾乎在今天可用的100%的計(jì)算機(jī)上運(yùn)行。
哈佛結(jié)構(gòu)
哈佛結(jié)構(gòu)物理分離檢索組成活躍程序的指令的設(shè)備和程序在執(zhí)行期間訪問的數(shù)據(jù)訪問器。
為使用哈佛結(jié)構(gòu)的電腦編寫的程序執(zhí)行訪問主存總線的任務(wù)最多可能快100%。但是要注意,哈佛結(jié)構(gòu)的某些記憶電路體積會(huì)很大。
馮·諾依曼結(jié)構(gòu)
馮·諾依曼結(jié)構(gòu)使用一個(gè)兩步的過程來執(zhí)行命令。首先,加載包含下一個(gè)命令的內(nèi)存,然后加載的新命令執(zhí)行時(shí)被允許訪問相同的內(nèi)存,使用同一個(gè)內(nèi)存的程序和數(shù)據(jù)推動(dòng)元編程技術(shù),像編譯器和自修改代碼。
馮·諾依曼體系結(jié)構(gòu)是第一個(gè)提出的計(jì)算模型,幾乎所有現(xiàn)實(shí)中的計(jì)算機(jī)都使用馮·諾依曼結(jié)構(gòu)。
位數(shù)大小
位數(shù)大小是計(jì)算機(jī)物理尺寸的主要因素。 在Minecraft中,從1位一直到32位的機(jī)器已經(jīng)被成功構(gòu)建出來。 常見的位數(shù)大小的組合:
數(shù)據(jù)
指令
4
8
8
8
8
16
16
16
數(shù)據(jù)字
計(jì)算機(jī)在任何特定時(shí)間可以操作的信息量被計(jì)算機(jī)的數(shù)據(jù)字大小代表了。
在數(shù)字二進(jìn)制中,計(jì)算機(jī)的數(shù)據(jù)字大?。ㄒ晕粸閱挝唬┑扔谟?jì)算機(jī)主總線中通道的寬度或數(shù)目。
數(shù)據(jù)字通常表示整數(shù),即編碼為二進(jìn)制數(shù)字模式的整數(shù)。
二進(jìn)制整數(shù)編碼可表示的最大容量是2數(shù)據(jù)字所占位數(shù)?- 1。
比如,有8位數(shù)據(jù)字大小的計(jì)算機(jī)在總線上有八個(gè)通道(一組導(dǎo)線和連接部件),因此,最多能計(jì)算到28?- 1 = 255。8位模式下計(jì)算超過255的數(shù)字是不可能的,因?yàn)橛?jì)算255 + 1會(huì)帶來額外的一個(gè)進(jìn)位,這需要第9個(gè)位才能儲(chǔ)存,于是發(fā)生了二進(jìn)制溢出。最后結(jié)果返回一個(gè)不正確的0。
這個(gè)過程可以用下表形象描述:
?
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
一些常見的整數(shù)數(shù)據(jù)大小是:
最大可表示的數(shù)量
所需的位數(shù)
1 = 21?- 1
1
7 = 23?- 1
3
15 = 24?- 1
4
255 = 28?- 1
8
65535 = 216?- 1
16
4294967295 = 232?- 1
32
數(shù)據(jù)字大小還決定了可以由計(jì)算機(jī)的ALU(算術(shù)和邏輯單元)處理的數(shù)字的最大大小。
命令字
計(jì)算機(jī)完成一條命令所需的數(shù)據(jù)量被計(jì)算機(jī)命令字大小代表。
計(jì)算機(jī)的命令字大小通常是其數(shù)據(jù)字大小的倍數(shù),這有助于在程序執(zhí)行期間檢索命令時(shí)最小化存儲(chǔ)偏移。
指令集
這里是一系列指令,控制單元(CU)能將它們解碼,然后執(zhí)行。
指令是計(jì)算機(jī)運(yùn)行的基本功能。一些例子包括:
·?加、減、乘和除
·?從RAM/ROM/三級(jí)存儲(chǔ)器中讀寫數(shù)據(jù)
·?從RAM中加載和卸載數(shù)據(jù)
·?分支到代碼的其他部分
·?與寄存器比較
·?選擇一個(gè)邏輯運(yùn)算(與非、或非、非……)
指令可以被編碼進(jìn)RAM,從ROM中讀取,或直接被拉桿或按鈕激活。每條指令都有自己指定的二進(jìn)制字符串(例如,0000可以代表從寄存器中讀取數(shù)據(jù),0001代表A與B相加,1011代表將RAM的數(shù)據(jù)保存到三級(jí)寄存器,等等),并且可能將自身的二進(jìn)制編碼轉(zhuǎn)為十進(jìn)制(將BIN碼轉(zhuǎn)為BCD碼),再到十進(jìn)制解碼器,最后通過總線到ALU或寄存器。
構(gòu)建CPU
所有的計(jì)算機(jī)系統(tǒng)都至少有一個(gè)處理單元。在運(yùn)行時(shí),處理單元執(zhí)行存儲(chǔ)在計(jì)算機(jī)內(nèi)存中的指令。在計(jì)算機(jī)內(nèi)部,有一個(gè)中央處理單元(簡稱CPU,不要與CPU內(nèi)部的控制單元(CU)混淆),在現(xiàn)實(shí)生活中,這是一個(gè)非常小卻很強(qiáng)大的組件,或多或少地充當(dāng)計(jì)算機(jī)的大腦。
在Minecraft中,很難將其壓縮到我們?cè)诂F(xiàn)實(shí)生活中看到的規(guī)模,所以如果它看起來像是錯(cuò)誤的,請(qǐng)不要擔(dān)心。
在下一章中,我們將首先設(shè)計(jì)我們的4位中央處理單元,因?yàn)榭紤]到執(zhí)行模型(CPU的通信和組織方法),這是我們計(jì)算機(jī)中最重要的事情,我們可以繪制計(jì)算機(jī)的構(gòu)建圖。
?
CPU的構(gòu)建圖,基于哈佛執(zhí)行模型
CPU遵循著一個(gè)循環(huán),一共有四個(gè)步驟,獲取、解碼、執(zhí)行和存儲(chǔ)來執(zhí)行指令。CPU首先從RAM獲取指令,解碼其含義(指令很可能是一個(gè)數(shù)字,CPU必須找出它是什么數(shù)字),一旦它理解了指令是什么,它將執(zhí)行該操作。有時(shí)需要將數(shù)據(jù)放回存儲(chǔ)器,因此它會(huì)存儲(chǔ)數(shù)據(jù)。然后重復(fù)循環(huán)。
總線
CPU中共有五條總線,每條總線將信息從一個(gè)組件傳送到下一個(gè)組件。總線是連接每個(gè)組件的紅石通道。因?yàn)槲覀冋诮ㄔ煲慌_(tái)4位計(jì)算機(jī),所以我們的總線只需要四個(gè)通道。這些是連接中央處理單元內(nèi)部組件的紅線和藍(lán)線。請(qǐng)注意,藍(lán)色總線少于四條線,這是因?yàn)樗鼈儾粩y帶數(shù)據(jù)。由于總線只能單向傳輸數(shù)據(jù)(在Minecraft中,雙向中繼器以外的中繼器只能單向工作),所以有兩條總線將中央處理單元連接到外部計(jì)算機(jī)。
1.?數(shù)據(jù)總線,將輸入/輸出設(shè)備或存儲(chǔ)器信息與CU連接,以傳輸信息。指令同樣通過數(shù)據(jù)總線傳輸。CU也可以通過數(shù)據(jù)總線傳輸給ALU。ALU不能通過此條總線傳輸,因?yàn)樗荒軉蜗騻鬏?。一旦?shù)據(jù)由ALU接收,這條線路就會(huì)切斷。
2.?數(shù)據(jù)總線,專門用來將ALU的計(jì)算數(shù)據(jù)傳回給CU。同樣地,由于單向傳輸,CU不能將數(shù)據(jù)通過此線傳輸?shù)紸LU。但CU可將信息傳回到存儲(chǔ)單元,從而更改存儲(chǔ)設(shè)備的值。
3.?地址總線,CU通過這條線路傳輸存儲(chǔ)器地址信息。這就是信息“居住”的地方。例如,CU請(qǐng)求獲取位于地址0001的字節(jié)。CU通過地址總線,發(fā)送“0001”,接著RAM通過第一條數(shù)據(jù)總線返回地址里面的值。需要注意的是,此處的“0001”指的是內(nèi)存中的地址,不是該地址中存儲(chǔ)的值。
4.?控制總線,CU通過這條總線與RAM交互。例如,一條線路告訴RAM,將對(duì)應(yīng)字節(jié)處的內(nèi)容設(shè)置為CU傳輸過來的值。另一條線路告訴RAM,從CU指定的地址處獲取字節(jié)信息。
5.?控制總線,連接到ALU,能接收來自ALU的信號(hào)。這些信號(hào)就是標(biāo)記,可以指示錯(cuò)誤信息。比如,CU要求ALU將15和1相加。假設(shè)這是一個(gè)4位機(jī)器,計(jì)算15 + 1會(huì)得到0,這就是二進(jìn)制溢出(如上所述)。這時(shí)就會(huì)有個(gè)信號(hào)指示錯(cuò)誤,ALU會(huì)通過這條總線告訴CU。CPU也可以將數(shù)據(jù)傳送至ALU,讓ALU對(duì)那個(gè)數(shù)據(jù)執(zhí)行另一操作。
部件
控制單元(CU)能從ROM(只讀內(nèi)存)指令中取指令。對(duì)于其他計(jì)算機(jī)來說,這些指令是可以更改的,那就是存到RAM(隨機(jī)存取存儲(chǔ)器)中。但是對(duì)我們來說,我們要運(yùn)行一個(gè)固定的程序,并不需要更改這些指令。這能大大簡化工程,我們只需要ROM即可。然后控制單元會(huì)對(duì)指令解碼,通常是將數(shù)字轉(zhuǎn)換成可識(shí)別的操作。接著,控制單元執(zhí)行操作,有時(shí)會(huì)根據(jù)指令要求,通過控制總線將結(jié)果存入RAM中。在執(zhí)行過程中,控制單元也會(huì)接收ALU的執(zhí)行信號(hào)??刂茊卧材苷?qǐng)求ALU執(zhí)行操作(比如加減法)。具體交互操作請(qǐng)見上文總線一節(jié)。
算術(shù)邏輯單元(ALU)會(huì)執(zhí)行控制單元發(fā)送的指令,處理二進(jìn)制數(shù),再將結(jié)果告訴控制單元。ALU能執(zhí)行加法、減法,如果組合起來還能做乘法與整數(shù)除法(當(dāng)然,進(jìn)一步改造,也可做所有除法)。內(nèi)部通常是邏輯門,用來處理邏輯值,比如非門、與非門。
現(xiàn)在我們可以選擇一種總線設(shè)計(jì),每一種都能達(dá)到一開始提到的三種關(guān)鍵設(shè)計(jì)目標(biāo),建成Minecraft中的計(jì)算機(jī)。
第三章 計(jì)算機(jī)的設(shè)計(jì)
指令集架構(gòu)
狀態(tài)
存儲(chǔ)器是一系列的位。在Minecraft中,盡管曾經(jīng)成功創(chuàng)造過32位和64位[1]計(jì)算機(jī),但是通常情況下存儲(chǔ)器有8位或16位。每一位都是兩種可能的狀態(tài)中的一種:開或關(guān)。而存儲(chǔ)器就是一系列的開和關(guān),用于完成特定的任務(wù)。
信號(hào)
現(xiàn)實(shí)世界計(jì)算機(jī)使用二進(jìn)制,一系列的1和0?!?”表示“開”和“0”表示“關(guān)”。在Minecraft中,最好的體現(xiàn)是紅石:有信號(hào)意味著“1”,沒有信號(hào)表示“0”。然而,根據(jù)紅石線到存儲(chǔ)器的距離,“0”可以是從0到14的任何信號(hào)強(qiáng)度。你也可以設(shè)計(jì),使“1”信號(hào)強(qiáng)度從1到15。
數(shù)
我們常規(guī)的十進(jìn)制是一種以10為基數(shù)的數(shù)字系統(tǒng)。在電腦中使用的數(shù)制——二進(jìn)制,則是以2為基數(shù)。為了比較兩者,我們看一下兩位數(shù)。在十進(jìn)制中,左邊的那一位是十位。在二進(jìn)制中,則是“二位”。比如在十進(jìn)制中,“10”表示“十”。而在二進(jìn)制中,“10”表示“二”。有兩種常用的十進(jìn)制轉(zhuǎn)二進(jìn)制的方法:
1. 最高位優(yōu)先:這種方法需要一點(diǎn)直覺。我們以42為例。首先我們找小于等于42的最大的2的冪(如32 = 25或65536 = 216)。在這個(gè)例子中,是32。然后我們用例子中的數(shù)字來減它,42-32=10。那么最左邊的一位就是“1”。隨后我們繼續(xù)找下一個(gè)2的冪,看它是否小于等于當(dāng)前的數(shù)字。對(duì)于這個(gè)例子來說,下一個(gè)是16,16大于10,所以接下來這一位是“0”。一直找下去直到數(shù)字為0為止。無論二的冪是小于還是等于當(dāng)前的數(shù)字,都要減掉它,并且記下一位為“1”。否則下一位就是“0”。用表格來表示這一過程,就是
比較
計(jì)算
結(jié)果
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的二進(jìn)制表示就是“101010”。
2. 最低位優(yōu)先:這個(gè)方法不需要記憶許多2的指數(shù)。相反,它重復(fù)將數(shù)字除以2,使用商作為下一個(gè)被除數(shù),余數(shù)作為二進(jìn)制位。但請(qǐng)記住,此方法從右到左寫入二進(jìn)制數(shù),而不是像前一種方法一樣從左到右寫入。讓我們重用我們的例子,42:
計(jì)算
余數(shù)
說明
42/2=21
0
最右邊的數(shù)字是0
21/2=10
1
向左邊一位的數(shù)是1
10/2=5
0
向左邊一位的數(shù)是0
5/2=2
1
向左邊一位的數(shù)是1
2/2=1
0
向左邊一位的數(shù)是0
1/2=0
1
向左邊一位的數(shù)是1
商數(shù)為0,所以我們停止。 我們同樣得到了二進(jìn)制數(shù)“101010”,與之前相同。
歸類
映射
數(shù)字
符號(hào)可以用紅石燈或者活塞的推拉方塊產(chǎn)生凸凹顯示:
?
注:如果用紅石燈的話不要用黃色的方塊做面板,不然不容易分辨。
形式化
變量
變量是數(shù)字、字符串、字符(套)或布爾值(真/假)存儲(chǔ)在RAM中的空間。例如,布爾值可以用來保存程序是否已經(jīng)達(dá)到某種狀態(tài)的信息。一個(gè)變量的以下信息需要保存:名稱,類型(數(shù)字、字符串或布爾),和變量值。變量,顧名思義,改變。命令操作可以改變變量。在運(yùn)行程序時(shí)創(chuàng)建變量,一旦程序結(jié)束,變量值會(huì)被從內(nèi)存中刪除。當(dāng)一個(gè)程序重啟,變量會(huì)被重置。在Minecraft中也是如此。
語義
數(shù)據(jù)
數(shù)據(jù)是計(jì)算機(jī)處理的信息,使用二進(jìn)制表示。
機(jī)器架構(gòu)
算術(shù)邏輯單元(簡稱ALU)
?
ALU是計(jì)算機(jī)最重要的組件之一,在現(xiàn)實(shí)生活和Minecraft中。首先,你必須選擇你希望能夠?qū)崿F(xiàn)的功能。大多數(shù)時(shí)候,這些都是加法、減法和一組邏輯選項(xiàng)。
與,或,與非,或者你所喜歡的。你必須建立單位和所有你想要的邏輯門和數(shù)學(xué)函數(shù)和選擇哪一個(gè)的輸出顯示。
(數(shù)據(jù))總線
用總線允許您的計(jì)算機(jī)的組件相互通信。
一條總線可以通過使用創(chuàng)建紅石布線連接你的計(jì)算機(jī)的運(yùn)算器,隨機(jī)儲(chǔ)存器,只讀儲(chǔ)存器,中央處理器和寄存器在一起,這樣他們就可以互相之間發(fā)送數(shù)據(jù)。通常是重要的計(jì)劃,建立你的電腦的組件,否則你創(chuàng)建總線過長,或者更糟的是,沒有空間來創(chuàng)建總線,在這種情況下,您可以刪除的組件并重建一個(gè)適當(dāng)?shù)奈恢?,或者使用像WorldEdit移動(dòng)組件到其他地方。
存儲(chǔ)
在Minecraft或是現(xiàn)實(shí)生活中有很多種方式存儲(chǔ)數(shù)據(jù)。存儲(chǔ)狀態(tài)通常為二進(jìn)制的,非開即關(guān),可通過邏輯運(yùn)算來執(zhí)行。
在計(jì)算機(jī)中,有三種存儲(chǔ)器。要知道,增加硬件的容量亦即增加尺寸,因此每一種存儲(chǔ)器都有自己適合的速度與容量。
主存
主存,也為內(nèi)存,對(duì)于CPU來說可以直接且最快訪問。因此,在容量上它也通常很小。
寄存器與標(biāo)志寄存器
最快的是存儲(chǔ)在CPU中的內(nèi)存。如下圖,這些是寄存器和標(biāo)志寄存器,它們幾乎可以立即設(shè)置,并且不需要向其發(fā)送任何地址,因?yàn)槊總€(gè)寄存器中只能存儲(chǔ)一個(gè)字節(jié)。
可以切換的紅石位非常大,但可以在2刻內(nèi)切換。這需要很大的空間,但非常適合緩存和寄存器。邏輯門(未顯示)也需要紅石來設(shè)置位,如圖中所示,輸入脈沖會(huì)導(dǎo)致位翻轉(zhuǎn)。門會(huì)占用更多的空間。寄存器還可以利用鎖定紅石中繼器和精確計(jì)時(shí),這將在下面的RAM中解釋。使用計(jì)算機(jī)時(shí)鐘時(shí),可能不需要建立寄存器。當(dāng)數(shù)據(jù)在CU或ALU準(zhǔn)備處理之前通過線路時(shí),寄存器非常有用。它會(huì)將其保存到寄存器中,并等待CU或ALU執(zhí)行其功能。
?
緩沖存儲(chǔ)器
第二快的是緩沖存儲(chǔ)器(緩存),將信息輸入處理器。現(xiàn)實(shí)中,它被分為幾個(gè)等級(jí),每個(gè)等級(jí)都有獨(dú)立的速度與能力[2]。和寄存器原因相同,它很有用。
隨機(jī)存取存儲(chǔ)器
第三快的是隨機(jī)存取存儲(chǔ)器(RAM),這比寄存器和緩存慢得多,是因?yàn)樗械刂废到y(tǒng)。它與三條總線(數(shù)據(jù)總線、控制總線和地址總線)連接。數(shù)據(jù)通過數(shù)據(jù)總線傳送,無論是設(shè)置RAM中數(shù)據(jù)的值或是從RAM中獲得信息??刂瓶偩€能控制RAM,要“獲取”還是“設(shè)置”信息。地址總線能告訴RAM操作的是哪個(gè)字節(jié)。參見計(jì)算機(jī)的結(jié)構(gòu)來更加深入了解。RAM非常有用,可以完全替代三級(jí)存儲(chǔ)器(是因?yàn)樗贛inecraft中不易失)。易失的意思是,在現(xiàn)實(shí)中,RAM斷電時(shí)會(huì)丟失所有的信息,這在Minecraft中不會(huì)發(fā)生。因此RAM是存儲(chǔ)信息的極佳方法。
在第一種情況下,RAM使用具有正確定時(shí)的鎖定紅石中繼器。這需要一點(diǎn)規(guī)劃,但非常節(jié)省空間。將總線轉(zhuǎn)換為多條線路以鎖定紅石中繼器也需要設(shè)置定時(shí)。這非常耗時(shí),遠(yuǎn)遠(yuǎn)超過寄存器,但是,它非常緊湊且高效。地址總線(綠色部分)將以二進(jìn)制方式解鎖某個(gè)字節(jié),由控制總線讀取或設(shè)置(第二行,左側(cè))。
?
在大多數(shù)情況下,其易失性在Minecraft中不會(huì)生效,因此最簡單的方法是使用D觸發(fā)器并添加讀寫功能。如下圖所示,它沒有鎖定中繼器,而是使用D觸發(fā)器,空間效率更低,但構(gòu)建更簡單。D觸發(fā)器的工作原理或多或少類似于鎖定的紅石中繼器,一個(gè)輸入如果打開,將解鎖,直到輸入關(guān)閉,另一個(gè)將在解鎖后將其設(shè)置。輸出可以讀取為一個(gè)位,使用與非門可以忽略它或?qū)⑵浞诺娇偩€上。這在第一章“建造一臺(tái)計(jì)算機(jī)”中有詳細(xì)介紹。
?
二級(jí)存儲(chǔ)器
這相當(dāng)于HDD和SSD。下面介紹一種非常緊湊的存儲(chǔ)技術(shù),要涉及到紅石比較器,能夠存儲(chǔ)高達(dá)1KB的實(shí)際數(shù)據(jù)大小。
介紹視頻請(qǐng)見此處。
三級(jí)存儲(chǔ)器
第三,也是最后一點(diǎn),是第三級(jí)內(nèi)存,它需要大量的時(shí)間來讀/寫,犧牲速度但可以存儲(chǔ)大量信息。在現(xiàn)實(shí)世界中,三級(jí)存儲(chǔ)器使用的是一種老式的掛載內(nèi)存的機(jī)制,而且現(xiàn)在也很少使用了。在Minecraft中,這種系統(tǒng)要用潛影盒來完成,潛影盒中的方塊必須由排序系統(tǒng)進(jìn)行排序,以表示某種形式的數(shù)據(jù)。由于這些工作需要大量的紅石比較器和大量的時(shí)間,所以讀/寫速度相當(dāng)慢。然而,利用某些mod可以加快游戲tick的速度并消除這個(gè)問題。這用于存儲(chǔ)長期數(shù)據(jù),這些數(shù)據(jù)需要在程序開始時(shí)加載。相當(dāng)于一臺(tái)真正的計(jì)算機(jī)的機(jī)械硬盤或固態(tài)硬盤。
機(jī)器狀態(tài)
程序計(jì)數(shù)器
程序計(jì)數(shù)器用于告訴CPU應(yīng)該運(yùn)行哪行代碼。在每個(gè)時(shí)鐘周期,解碼器將訪問這個(gè)計(jì)數(shù)器來獲取下一個(gè)要執(zhí)行的命令。一些命令會(huì)比另一個(gè)訪問不同的數(shù)據(jù)量,或無任何數(shù)據(jù),因此解碼器將按由下一個(gè)命令確定的量增加程序計(jì)數(shù)。計(jì)數(shù)器也被跳轉(zhuǎn)命令用于控制程序流。
現(xiàn)實(shí)中,程序計(jì)數(shù)器自身并不是一個(gè)元器件,只是在其他寄存器旁邊的一個(gè)寄存器。然而在Minecraft中,應(yīng)該建造一個(gè)獨(dú)立的寄存器,用來存儲(chǔ)程序計(jì)數(shù),這并不奇怪。
提示
·?你也可以使用一些像是WorldEdit的模組。
·?如果你在生存模式?jīng)]有太多的紅石中繼器,你可以用兩個(gè)紅石火把代替。
·?利用顏色進(jìn)行分區(qū)(例如用藍(lán)色羊毛建造RAM(隨機(jī)存取存儲(chǔ)器),黃色羊毛建造ALU(算術(shù)邏輯部件運(yùn)算器)等)。
·?結(jié)構(gòu)方塊對(duì)移動(dòng)部件、組合多個(gè)部件來說很有用。然而,它只能通過命令獲得。
?