如何制造一臺(tái)計(jì)算機(jī),編程多年后我開(kāi)始思考這個(gè)問(wèn)題

周末,我高中的弟弟問(wèn)我這樣一個(gè)問(wèn)題:“為什么電腦都是從 C 盤(pán)開(kāi)始?A 盤(pán)、B 盤(pán)哪去了?”?

平時(shí)他總是問(wèn)我一些奇怪的問(wèn)題,其實(shí)這是個(gè)暴露年齡的問(wèn)題,作為零五后,他不知道,我不怪他。我想他每天玩 iPad 不知道這些也沒(méi)啥奇怪的。
于是,我拿出了我的耐心,準(zhǔn)備給他講講 C 盤(pán)的故事。
話說(shuō),20 世紀(jì)五六十年代,工程師創(chuàng)造了個(gè)人電腦。為了方便使用,工程師就將系統(tǒng)安裝在磁盤(pán)上,使用者通過(guò)磁盤(pán)驅(qū)動(dòng)器讀取。IBM 曾推出了一款在當(dāng)時(shí)看起來(lái)更加方便的存儲(chǔ)磁盤(pán)——軟盤(pán)。

其實(shí) 8 英寸這么大,還是有點(diǎn)不方便的。隨后就出現(xiàn)了 5.25 英寸軟盤(pán)和 3.5 英寸軟盤(pán),來(lái)取代 8 英寸軟盤(pán)。
A 盤(pán)的盤(pán)符就是為 3.5 英寸軟盤(pán)驅(qū)動(dòng)器準(zhǔn)備的,B 盤(pán)的盤(pán)符則是為 5.25 英寸的軟盤(pán)驅(qū)動(dòng)器準(zhǔn)備的。因?yàn)楫?dāng)時(shí)的計(jì)算機(jī)還沒(méi)有現(xiàn)在很常見(jiàn)的硬盤(pán),所以 A 和 B 兩個(gè)盤(pán)符就這樣獻(xiàn)給了軟盤(pán)。?

之后便是硬盤(pán)的時(shí)代,將系統(tǒng)安裝在硬盤(pán)并固定在機(jī)箱內(nèi),再也不用插入軟盤(pán),下次直接按下開(kāi)機(jī)鍵就可以用了。
但這時(shí)候軟驅(qū)還存于新興時(shí)代,既有軟盤(pán),又有硬盤(pán),于是硬盤(pán)便被命名為 C 盤(pán)。隨著 Windows 操作系統(tǒng)的誕生,TA 需要運(yùn)行在硬盤(pán)上,所以 Windows 系統(tǒng)的默認(rèn)軟件安裝路徑是 C 盤(pán),之后按照兼容的考慮不斷升級(jí) Windows,直到現(xiàn)在,硬盤(pán)的第一個(gè)盤(pán)還是 C 盤(pán),默認(rèn)安裝路徑也是 C 盤(pán)。
如今很少有人使用軟盤(pán)了,它也仍然沒(méi)有走遠(yuǎn)。比如“保存”和“另存為”功能的圖標(biāo)其實(shí)就是一個(gè)軟盤(pán)。軟盤(pán)的精神被塵封在了電腦里,寓意著人們對(duì)數(shù)據(jù)存儲(chǔ)的渴望。我問(wèn)弟弟:“懂了嗎?” 他點(diǎn)點(diǎn)頭,又搖搖頭!他說(shuō)沒(méi)見(jiàn)過(guò)軟盤(pán)的樣子,準(zhǔn)備買一個(gè)回來(lái)感受下。
接著他又給我拋出三個(gè)問(wèn)題。
那......
1. CPU 是什么的縮寫(xiě)?
2. Hz 又表示什么的單位呢?
3. Z80 CPU 是多少比特的 CPU?
這......我竟然有點(diǎn)發(fā)懵。不!這不應(yīng)該,被他這么一問(wèn),我發(fā)現(xiàn)有一些問(wèn)題還真無(wú)法簡(jiǎn)單地解釋清楚呢!

其實(shí),工作之后,以前這些有關(guān)硬件的底層知識(shí),差不多都還給老師了。這次要不是弟弟問(wèn)我,我都不知道自己竟然差不多忘得一干二凈了。是時(shí)候重新補(bǔ)補(bǔ)這些硬件相關(guān)的知識(shí)了。
聽(tīng)說(shuō)本周三,有這樣一節(jié)有關(guān)硬件的直播課,不僅可以幫我補(bǔ)補(bǔ)課,而且還可以帶著弟弟一起學(xué)習(xí)。這些電子時(shí)代成長(zhǎng)起來(lái)的娃們,雖說(shuō)擺弄電子產(chǎn)品很 6,但對(duì)于產(chǎn)品本身可謂是一無(wú)所知
我一直想教他學(xué) Python 的,如果先了解下計(jì)算機(jī)的構(gòu)造,估計(jì)學(xué)起來(lái)也會(huì)容易點(diǎn)。如果你跟我有一樣的煩惱,那么周三一起來(lái)聽(tīng)這場(chǎng)直播吧!

(掃碼預(yù)約直播?)
做一臺(tái)計(jì)算機(jī),可以說(shuō)我們每個(gè)人上學(xué)時(shí)都有過(guò)這樣的想法。后來(lái)因?yàn)檫@樣那樣的原因放棄了。那么,做一臺(tái)計(jì)算機(jī)究竟需要哪些步驟?上班多年后,我開(kāi)始考慮這個(gè)問(wèn)題。以下節(jié)選自《計(jì)算機(jī)是怎樣跑起來(lái)的》,通過(guò)做一臺(tái)計(jì)算機(jī),讓我們實(shí)現(xiàn)年少時(shí)的愿望吧?。ㄈf(wàn)字長(zhǎng)文,干貨滿滿,建議收藏起來(lái)慢慢讀)
1.1 制作計(jì)算機(jī)所需元件:
首先我們要一起來(lái)收集元件吧。制作微型計(jì)算機(jī)所需的基礎(chǔ)元件只有 3 個(gè),CPU、內(nèi)存和 I/O,每種元件都是作為一塊獨(dú)立的 IC 在市場(chǎng)上出售的。
CPU 是計(jì)算機(jī)的大腦,負(fù)責(zé)解釋、執(zhí)行程序。內(nèi)存負(fù)責(zé)存儲(chǔ)程序和數(shù)據(jù)。I/O 是 Input/Output(輸入/輸出)的縮寫(xiě),負(fù)責(zé)將計(jì)算機(jī)和外部設(shè)備(周邊設(shè)備)連接在一起。這里我們使用 Z80 CPU 作為微型計(jì)算機(jī)的 CPU、TC5517 作為內(nèi)存、Z80 PIO 作為 I/O。
Z80 CPU 是一款古老的 CPU,在 NEC 的 PC-8801、SHARP 的 MZ-80 等 8 比特計(jì)算機(jī)廣泛應(yīng)用的時(shí)代,曾以爆炸般的速度普及過(guò)。TC5517 是可以存儲(chǔ) 2K 的 8 比特?cái)?shù)據(jù)的內(nèi)存。
在計(jì)算機(jī)的世界里,K 表示210?= 1024。TC5517 的容量是 8 比特 ×2×1024 = 16384 比特,即 2K 字節(jié)。雖然這點(diǎn)容量與諸位所使用的個(gè)人計(jì)算機(jī)比起來(lái)相差懸殊,但是對(duì)于用于學(xué)習(xí)的微型計(jì)算機(jī)來(lái)說(shuō)是綽綽有余了。Z80 PIO 作為 I/O,經(jīng)常與 Z80 CPU 一起使用。
正如其名,PIO(Parallel I/O,并行輸入/輸出)可以在微型計(jì)算機(jī)和外部設(shè)備之間并行地(一排一排地)輸入輸出 8 比特的數(shù)據(jù)。
在計(jì)算機(jī)愛(ài)好者們沉浸在制作微型計(jì)算機(jī)的那個(gè)年代,這些元件都是常見(jiàn)的 IC。不過(guò)我要先說(shuō)一下,今天我們制作的微型計(jì)算機(jī)終歸只是用于學(xué)習(xí)的模型,并沒(méi)有什么實(shí)用的價(jià)值。

為了制作微型計(jì)算機(jī),除了 CPU、內(nèi)存和 I/O,還需要若干輔助元件。
為了驅(qū)動(dòng) CPU 運(yùn)轉(zhuǎn),稱為“時(shí)鐘信號(hào)”的電信號(hào)必不可少。這種電信號(hào)就好像帶有一個(gè)時(shí)鐘,滴答滴答地每隔一定時(shí)間就變換一次電壓的高低(如圖 1.2 所示)。輸出時(shí)鐘信號(hào)的元件叫作“時(shí)鐘發(fā)生器”。時(shí)鐘發(fā)生器中帶有晶振,根據(jù)其自身的頻率(振動(dòng)的次數(shù))產(chǎn)生時(shí)鐘信號(hào)。時(shí)鐘信號(hào)的頻率可以衡量 CPU 的運(yùn)轉(zhuǎn)速度。這里使用的是 2.5MHz(兆赫茲)的時(shí)鐘發(fā)生器。

用于輸入程序的裝置也是必不可少的。在這里我們通過(guò)撥動(dòng)指撥開(kāi)關(guān)來(lái)輸入程序,指撥開(kāi)關(guān)是一種由 8 個(gè)開(kāi)關(guān)并排連在一起構(gòu)成的元件(如照片 1.1(a) 所示)。輸出程序執(zhí)行結(jié)果的裝置是 8 個(gè) LED(發(fā)光二極管)。
到此為止,主要的元件就都備齊了。剩下的就都是些細(xì)碎的元件了。表 1.1 是所需元件的一覽表,里面也包含了之前介紹過(guò)的元件。請(qǐng)諸位粗略地瀏覽一遍。所需元件表中的 74367 和 7404 也是 IC,用于提高連接外部設(shè)備時(shí)的穩(wěn)定性。
表 1.1 本次用到的制作微型計(jì)算機(jī)的元件:

電阻是用于阻礙電流流動(dòng)、降低電壓值的元件。為了省去布線的麻煩,這里也會(huì)使用將 8 個(gè)電阻集成到 1 個(gè)元件中的集成電阻(如照片 1.1(b) 所示)。
電阻的單位是 Ω(歐姆)。電容是存儲(chǔ)電荷的元件,衡量存儲(chǔ)電荷能力的單位是 F(法拉)。要讓微型計(jì)算機(jī)運(yùn)轉(zhuǎn)起來(lái),5V(伏特)的直流電源是必不可少的。于是還需要使用一個(gè)叫作“開(kāi)關(guān)式穩(wěn)壓電源”的裝置,將 220V 的交流電變成 5V 的直流電。

1.2 電路圖的讀法
在開(kāi)始布線之前,先來(lái)介紹一下電路圖的讀法。在電路圖中,用連接著各種元件符號(hào)的直線表示如何布線。電路中有些地方有交叉,但若只是交叉在一起的話,并不表示電路在交叉處構(gòu)成通路。只有在交叉處再畫(huà)上一個(gè)小黑點(diǎn)才表示構(gòu)成通路。


本次制作的微型計(jì)算機(jī)工作在 +5V 的直流電下。雖然在實(shí)際的電路中要把 +5V 和 0V 連接到各個(gè)元件的各個(gè)引腳上,但是如果在電路圖中也把這些地方都一一標(biāo)示出來(lái)的話,就會(huì)因?yàn)榈教幎际?+5V 和 0V 的布線而顯得混亂不堪了。
所以要使用如圖 1.4 所示的兩種電路圖符號(hào)來(lái)分別表示電路連接到 +5V 和連接到 0V 的情況。IC 的引腳(所謂引腳就是 IC 邊緣露出的像蜈蚣腿一樣的部分)按照逆時(shí)針?lè)较蛞来螏в幸粋€(gè)從 1 開(kāi)始遞增的序號(hào)。數(shù)引腳序號(hào)時(shí),要先把表示正方向的標(biāo)志,比如半圓形的缺口,朝向左側(cè)。舉例來(lái)說(shuō),帶有 14 個(gè)引腳的 7404,其引腳序號(hào)就如圖 1.5 所示。

如果按照引腳序號(hào)的排列順序來(lái)畫(huà) IC 的電路圖符號(hào),那么標(biāo)示如何布線時(shí)就會(huì)很不方便。所以通常所繪制的電路圖都不受引腳實(shí)際排布的限制1。畫(huà)圖時(shí),在引腳的旁邊寫(xiě)上引腳的序號(hào),在表示 IC 的矩形符號(hào)中寫(xiě)上表明該引腳作用的代號(hào)。代號(hào)就是像 RD(Read)表示執(zhí)行讀取操作,WR(Write)表示執(zhí)行寫(xiě)入操作這樣的代表了某種操作的符號(hào)。各個(gè)代號(hào)的含義等到為引腳布線時(shí)再一一說(shuō)明。
1.3 連接電源、數(shù)據(jù)和地址總線
下面就開(kāi)始布線吧。請(qǐng)假想自己正在制作微型計(jì)算機(jī),并按照如下的說(shuō)明用紅鉛筆在電路圖中描畫(huà)相應(yīng)的電路。首先連接電源。IC 與普通的電器一樣,只有接通了電源才能工作。Z80 CPU、TC5517 和 Z80 PIO 上都分別帶有 Vcc 引腳和 GND 引腳。
Vcc 和 GND 這一對(duì)兒引腳用于為 IC 供電。下面請(qǐng)先將 +5V 電源連接到各個(gè) IC 的 Vcc 引腳上,然后將 0V 電源連接到各個(gè) IC 的 GND 引腳上。接下來(lái)還需要將 +5V 和 0V 連接到時(shí)鐘發(fā)生器上。
接通電源后這些 IC 和時(shí)鐘發(fā)生器就可以工作了。微型計(jì)算機(jī)所使用的 IC 屬于數(shù)字 IC。在數(shù)字 IC 中,每個(gè)引腳上的電壓要么是 0V、要么是 +5V,通過(guò)這兩個(gè)電壓與其他的 IC 進(jìn)行電信號(hào)的收發(fā)。用于給 IC 供電的 Vcc 引腳和 GND 引腳上的電壓是恒定不變的 +5V 和 0V,但是其他引腳上的電壓,會(huì)隨著計(jì)算機(jī)的操作在 +5V 和 0V 之間不斷地變化。
稍微說(shuō)一點(diǎn)題外話,只要想成 0V 表示數(shù)字 0、+5V 表示數(shù)字 1,那么數(shù)字 IC 就是在用二進(jìn)制數(shù)的形式收發(fā)信息。也正因?yàn)槿绱?,二進(jìn)制數(shù)在計(jì)算機(jī)當(dāng)中才如此重要。
有關(guān)二進(jìn)制的內(nèi)容,請(qǐng)先記住以下知識(shí)點(diǎn):通常將 1 個(gè)二進(jìn)制數(shù)(也就是數(shù)字 IC 上 1 個(gè)引腳所能表示的 0 或者 1)所表示的信息稱作“1 比特”,將 8 個(gè)二進(jìn)制數(shù)(也就是 8 比特)稱作“1 字節(jié)”。比特是信息的最小單位,字節(jié)是信息的基本單位。
這里制作的微型計(jì)算機(jī)是一臺(tái) 8 比特微型計(jì)算機(jī),因此是以 8 比特為一個(gè)單位收發(fā)信息的。下面回到正題。計(jì)算機(jī)以 CPU 為中心運(yùn)轉(zhuǎn)。CPU 可以與內(nèi)存或 I/O 進(jìn)行數(shù)據(jù)的輸入輸出。為了指定輸入輸出數(shù)據(jù)時(shí)的源頭或目的地,CPU 上備有“地址總線引腳”。Z80 CPU 的地址總線引腳共有 16 個(gè),用代號(hào) A0~A15 表示,其中的 A 表示 Address(地址)。
后面的數(shù)字 0~15 表示一個(gè) 16 位的二進(jìn)制數(shù)中各個(gè)數(shù)字的位置,0 對(duì)應(yīng)最后一位、15 對(duì)應(yīng)第一位。16 個(gè)地址總線引腳所能指定的地址共有 65536 個(gè),用二進(jìn)制數(shù)表示的話就是 0000000000000000~1111111111111111。因此 Z80 CPU 可以指定 65536 個(gè)數(shù)據(jù)存取單元(內(nèi)存存儲(chǔ)單元或 I/O 地址),進(jìn)行信息的輸入輸出。
一旦指定了存取數(shù)據(jù)的地址,就可以使用數(shù)據(jù)總線引腳進(jìn)行數(shù)據(jù)的輸入輸出了。Z80 CPU 的數(shù)據(jù)總線引腳共有 8 個(gè),用代號(hào) D0~D7 表示。其中的 D 表示 Data(數(shù)據(jù)),后面的數(shù)字 0~7 與地址總線引腳代號(hào)的規(guī)則相同,也表示二進(jìn)制數(shù)中各個(gè)數(shù)字的位置。Z80 CPU 可以一次性地輸入輸出 8 比特的數(shù)據(jù),這就意味著如果想要輸入輸出位數(shù)(比特?cái)?shù))大于 8 比特的數(shù)據(jù),就要以 8 比特為單位切分這個(gè)數(shù)據(jù)。
作為內(nèi)存的 TC5517 上也有地址總線引腳(A0~A10)和數(shù)據(jù)總線引腳(D0~D7)。這些引腳需要同 Z80 CPU 上帶有相同代號(hào)的引腳相連。一塊 TC5517 上可以存儲(chǔ) 2048 個(gè) 8 比特的數(shù)據(jù)(如圖 1.6 所示)??墒怯捎谟糜谳斎氤绦虻闹笓荛_(kāi)關(guān)是以 8 比特為一個(gè)單位指定內(nèi)存地址的,所以我們只使用 TC5517 上的 A0~A7 這 8 個(gè)引腳,并把剩余的 A8~A10 引腳連接到 0V 上(這些引腳上的值永遠(yuǎn)是 0)。雖然總共有 2048 個(gè)存儲(chǔ)單元,最終卻只能使用其中的 256 個(gè),稍微有些浪費(fèi)。下面就請(qǐng)諸位用紅鉛筆把 Z80 CPU 和 TC5517 的 D0~D7 以 及 A0~A7 引腳分別連接起來(lái)。

1.4 連接 I/O
下面開(kāi)始連接 I/O。只有了解了作為 I/O 的 Z80 PIO 的結(jié)構(gòu),才能理解為什么要這樣布線。諸位都知道“寄存器”這個(gè)詞嗎?寄存器是位于 CPU 和 I/O 中的數(shù)據(jù)存儲(chǔ)器。
Z80 PIO 上共有 4 個(gè)寄存器。2 個(gè)用于設(shè)定 PIO 本身的功能,2 個(gè)用于存儲(chǔ)與外部設(shè)備進(jìn)行輸入輸出的數(shù)據(jù)。這 4 個(gè)寄存器分別叫作端口 A 控制、端口 A 數(shù)據(jù)、端口 B 控制和端口 B 數(shù)據(jù)。
所謂端口就是 I/O 與外部設(shè)備之間輸入輸出數(shù)據(jù)的場(chǎng)所,可以把端口(Port)想象成是輪船裝卸貨物的港口。Z80 PIO 有 2 個(gè)端口,端口 A 和端口 B,最多可以連接 2 個(gè)用于輸入輸出 8 比特?cái)?shù)據(jù)的外部設(shè)備(如圖 1.7 所示)。

后面還有
1.5 連接時(shí)鐘信號(hào)
1.6 連接用于區(qū)分讀寫(xiě)對(duì)象是內(nèi)存還是 I/O 的引腳
1.7 連接剩余的控制引腳
1.8 連接外部設(shè)備,通過(guò) DMA 輸入程序
1.9 連接用于輸入輸出的外部設(shè)備
1.10 輸入測(cè)試程序并進(jìn)行調(diào)試
以上這些步驟。

