打造自己的CPU-系列文

pondahai
Feb 18, 2021

--

前言、見樹先見林
加法器是CPU裡面的基礎裝置,文中設想一個人口統計自動化問題,為了解決問題而一步一步介紹相關聯的裝置,對應的概念也會隨之出現,這些概念是為了認識CPU所需要的基礎知識。

電腦系統已經常見於生活各種角落,其中CPU(Central Processing Unit,中央處理器)這個名詞如雷貫耳,對於非專業人士來說,這似乎是個難以理解的元件,但這裏想說的,CPU其實是很簡單的東西。

常見於課本上的CPU架構圖

或許有些人知道,電腦裡面都有CPU,會俗稱它是電腦的大腦(腦中腦?😂,其實是翻譯的美麗誤會,我們都知道電腦的英文是Computer)。CPU在系統中負責執行指令,處理資料。但它是怎麼辦到的呢?對於一件未知的問題,我們可以將問題細小化,先得到小問題的解答,然後再慢慢組合成大問題的解答。

先從加減法的問題開始想,如果今天有一個裝置叫做「加法器」(Adder),而且定義它只負責兩個數字相加,那麼從實際面該如何令加法器為我們工作?首先應該是先讓加法器知道我們的兩個數字在「哪裏」?我們一般會說:「該如何輸入?」於是我們就會有「輸入裝置」,這或許是一組開關,又或者是一組鍵盤,又或者厲害一點它是一組「影像辨識輸入裝置」。無論如何它就是「輸入單元」(Input Unit)。

再來加法器算完的結果必須要呈現出來,才能讓使用者得知相加結果,對人類來說它必須是我們感官可接收的,不能只存在電子裝置內部的電子狀態,因此這可能是一組燈泡?像計算機一樣的液晶螢幕?或是一組38吋顯示器?我們可以簡稱它是「輸出單元」(Output Unit)。

有了加法器及其輸出入單元,我們就可以拿它來做加法,只能做加法的機器能做什麼事?早期的計算機就是真的只能做加法,通常是用來統計人口或是商務記帳。但即便有了這樣的機器,我們還是要待在機器旁邊,不斷做著輸入資料與觀察結果的動作,很是無聊。從古希臘神話的薛西佛斯得知人類最怕重複做無聊的事情,因此,該想個辦法讓這一切自動化。

為了讓機器能夠自動做事情,我們必須額外再設計機器,讓事情自動化。於是我們有了「控制單元」(Control Unit),把事情以及硬體的配置按照我們的需要來變化,於是我們把這些控制過程數據化,就變成了「指令」(Command or Code)。

CPU是一個有輸入輸出以及控制等單元組成的裝置,商用CPU都是根據這個原則去開發的產品,只是特別在執行效率以及附加功能上加強,最後甚至是帶動製作工藝技術與材料科學上的精進,但藉由打造一顆CPU的過程,會發現CPU一點也不神秘,拜現代科技所賜,我們每個人都可以打造自己的CPU。但或許做出自己的CPU沒有多大用處,但過程中必定可以對科技運作原理進一步瞭解,就像是發展太空科技一樣,直接的太空任務對於每一個人不見得有關聯,但是發展任務過程中所獲得的科技演進就對社會整體帶來進步。不管是不是相關領域的工作者,每一個人都應該演練一遍CPU的設計,這是一場很好的思想實驗與想像力培訓。

前面提到的加法器,是數位系統中一種常見的裝置,這些電腦裡面的運作裝置都是屬於數位系統的一部分。數位系統中會有許多不同的裝置,彼此協同作業,按部就班地將事情完成。

另一種常見的裝置叫做「閂鎖器」(Latch),用來存放二進位資料。前面說的加法器就需要閂鎖器,將加法結果存起來。在數位系統中,為了讓資料可以被機器處理,資料都會轉換成二進位來表示,二進位的數字系統只有0與1兩種數字,恰好代表電路上的開關狀態,也就讓機器可以用最簡單的方式來存放資料,一組栓鎖器可以理解成數個開關的組合,如果有八個開關組成,那麼這就是一組八位元閂鎖器。這裡講的「開關」除了原本人類理解的開關,還有一種是電學上的「電學開關」,有一種電學元件稱作「繼電器」,它就是一種電學開關。繼電器利用電磁鐵的效應,對電磁鐵通電會吸引繼電器內的金屬簧片,從而利用簧片接觸金屬接點,達到電路導通的目的。原本人類的開關需要用手指撥動或按壓讓電路導通,而電學開關做到了利用電來讓電路導通。在電腦的上古時代,還可以看見以繼電器為元件的電腦。而現代科技自從有了電晶體之後,它在某些場合就取代了繼電器成為了「無聲」的電子開關,於是現代的CPU就會說某某百萬電晶體構成。

有了閂鎖器,這裡可以想想看,要如何利用它們來與加法器搭配,進而實現自動做加法動作?

想像一種物品,是一張紙片,比平常的A4紙還要厚,上面打有孔洞,另有一部機器,會自動吸入這些紙片,並且將上面的孔洞轉換成電訊號。這裏說的就是古老的打孔卡(Punch Card)輸入過程,雖然稱它「古老」,但也才剛過一百年而已。早年就是把人口數目利用打孔卡記載起來,然後由機器自動吸入轉換成電訊號,接著交給當時的電腦做不斷加法的動作,最後完成人口統計的任務。

回想一開始的加法器,只能執行兩個數字相加,一張打孔卡上面或許有幾十組數字要加總,該如何讓這個加法器執行這幾十組數字相加呢?可以用排隊的概念,幾十組數字我們可以先加第一、二組數字,然後再將結果與第三組數字相加,以此類推,最後就會得到全部幾十組數字的加總結果。但問題是,加法器該如何將前一次加法結果保存起來,以便跟後一組數字相加呢?這時候閂鎖器就派上用場,閂鎖器可以用來保存前一次的加法結果!與此同時,也有「前後」的概念出現。這種「前一次」與「目前」甚至是「下一筆」這樣的概念在數位系統裡面我們稱它作「循序」(Sequential)。負責執行循序概念的電路就被稱為循序電路,所以栓鎖器是一種循序電路。

循序電路有一個特點, 為了要讓循序的執行正確,循序電路會依賴時脈信號。時脈信號就像是指揮,指揮著循序電路的運作。時脈信號就是高電壓、低電壓或是5V、0V又或是簡單地說1與0之間不斷地變化。時脈信號是數位系統基本的信號之一,它指揮著數位系統什麼時候動作,什麼時候停止,不斷地動作與停止,像是走路一樣,一下左腳一下右腳,於是人就會前進。數位系統的運作需要依賴穩定的時脈信號,讓一切井然有序。

在加法器這個例子裡,時脈信號會控制加法器輸出的閂鎖器,會讓栓鎖器在適當的時間「閂鎖」,把加法器算好的資料「鎖」在閂鎖器內部,然後在下一次時脈的時候,把資料放出去到加法器的第二個輸入,與此同時從打孔卡來的次一筆資料也到了,於是新的加法結果就會出現在閂鎖器的輸入,但此時已經是新的「狀態」了。隨著時脈一次一次的「脈動」,被時脈控制的電路就會處在不同的狀態,每一個狀態都是全新的事件,這種概念我們就是稱它「狀態」(State)。

相較於循序電路,加法器就是一個「組合」(Combinational)電路,他無關於狀態,只要輸入有變化,它的輸出就會立即變化。也因此加法器需要循序電路的栓鎖器的幫助,來把加法結果留住。

這裡再介紹另一個常見的裝置叫做「計數器」(Counter)。一個簡單的計數器,會在時脈信號變化時加1,時脈信號如果不斷地來,計數器就會不斷地加1。計數器計數的數量是有限制的,一個8位元計數器最多就只能從0數到255。又或者特殊設計的計數器,依照需求做不同變化的計數。

為了讓帶有輸出閂鎖的加法器能夠正常動作,我們需要一個計數器來協調這些電路,或許這個計數器只能從1數到2😊,但也就足夠了,只要把計數器的輸出加上一點簡單的邏輯電路,就可以用來控制加法器與它的輸出栓鎖,讓整個加法過程自動化。例如:

計數器數到1的時候連動到打孔卡載入
計數器數到2的時候連動到加法器的輸出栓鎖

文中提出的自動加法系統方塊圖

在連續不斷的1,2,1,2…之後,打孔卡上面的全部數字的加總數字就會出現在最後一次狀態的加法器輸出栓鎖裡了。

--

--

pondahai

有容乃大 海納百川 我是彭大海 以前是工程師 現在不是工程師 贊助鏈結: https://www.paypal.me/pondahai