本文為《BUT HOW DO IT KNOW – The Basic Principles of Computer for everyone 》筆記,文章絕大部分圖片來自于這本書,用visio重新繪制,并增加不同的顔色,更便于閱讀。
任何一個計算機核心都是有必不可少的部分:一個是RAM,另一個就是CPU(Central Processing Unit),如下圖所示:
RAM負責數據存儲,CPU負責數據處理。右側是RAM部分,我們已經介紹過了,具體見J Pan:(1)計算機是如何讀懂0和1的?- RAM ,現在開始介紹CPU如何構成。
對于CPU而言,主要的任務就是幹活。那怎麼樣才能有效的完成這個任務?——我們也可以類比一下人類社會。原始部落的幹活效率是很低的,主要靠個人的體力生活,身強力壯的就能成為頭領。随着生産力的發展,後來産生了組織,對整體行為進行某種 “調度”,完成這種工作的人就是組織的“神經中樞”——比如部落的酋長等,此時,酋長不一定是最強壯的那個人,更多的需要“大腦”進行工作。到現代社會,就有了“政府”的概念,整個國家的行為進行規劃和管理。可以設想一下,在現代社會一個沒有“政府”或者“政府”組織混亂的國家是什麼樣。有了這樣的概念,我們就知道了,要想有效的幹活(特别是大型勞動),需要兩個條件:大量幹活的個體以及把這些個體連接起來的“調度”。對于CPU來說,我們把具體幹活的部分稱之為ALU,把起調度功能的部分稱之為“Control section”,即控制單元。
CPU的基本構型如下:
首先能看到的是總線繞了一個大圈,分别連接在RAM的數據端和地址端。有六個寄存器挂在總線上,分别是:R0, R1, R2, R3, TMP, ACC。其中R0, R1, R2, R3是CPU用于短期存儲數據的寄存器,他們的輸入輸出都是通過總線與外界連接,這四個寄存器用處很多,稱得上是萬金油寄存器,通用叫法是“通用寄存器”。TMP稱為臨時寄存器,它的輸入來自總線數據,輸出到一個粉色的框框,隻有“寫”指令,沒有“讀”指令,也就是說這個寄存器會一直輸出。ACC稱為累加器,它接受來自問号框框的數據,輸出連接到總線上,所以它的輸出數據可以搬運到任何總線到達的地方。
中間有一個大框,寫着“Control Section”稱之為控制單元,是CPU中最複雜的部分,它控制了CPU和RAM中所有“讀”和“寫”(s和e)使能情況,這個後面會詳細講。
左側還有一個帶“問号”的框框是什麼呢?——它的名字叫ALU(Arithmetic and Logic Unit),也就是算數與邏輯單元。我們先來研究一下它。
在介紹ALU之前,我們有必要再學複習幾種新的邏輯門電路,具體如下:
分别為與非門、與門、或門及異或門門。前三個都比較簡單,簡單說一下異或門,從真值表上可以看出,它的邏輯是通入相同為0,不同為1。為什麼說它呢?——因為加法器會用到它。
說道算數與邏輯,一個首先要解決的問題就是加法問題。我們先從最簡單的1位加法開始。
對于1位加法器,我們知道:
我們把上述語法用邏輯門電路來實現,非常簡單,一個與門,一個異或門:
其中,a和b為1位的輸入,sum為和,carry為進位,這稱之為半加器,我們可以把它抽象成:
現在難度升級,假如輸入也有進位,該如何處理呢?——那就在加一個半加器呗!兩個半加器隻要有一個有進位,那carry out就是1,因此可以用一個或門來實現。
這稱之為全加器,其真值表為:
具體實現為:
能看出來其中的邏輯嗎?我們把全加器抽象為:
有了一位全加器,還會發愁8位全加器嗎?
8位全加器可以抽象為:
前面我們解決了加法問題,那乘法問題如何解決呢?——移位器。
舉個例子,加入有一個二進制數是00010000,轉換成10進制是16,現在左移一位,變成00100000,轉換成10進制就變成了32,這說明什麼?——在二進制中,左移就是乘以2,右移就是除以2,這樣就把乘法和除法解決了。
我們來看看左移具體是怎麼實現的?
很簡單,就是兩個寄存器,連線的時候左移1位即可。當R1的“e”處于on時,R2的“s”先on後off,這樣R1中所有數據就會傳遞到R2中,不過數據左移了一位。通常情況下,shift in會和shift out連接。
和左移類似,右移就是兩個寄存器連線的時候右移1位。
我們可以把左移和右移抽象成如下形式:
顧名思義,比較器的功能就是對輸入的兩個數據進行比較,輸出兩個标志位:是否相等;若不等,誰大?
相等是比較容易實現的,用異或門就可以實現:每一位輸出相同,則異或門輸出off,如果所有位的輸出都是off,則兩個輸入相等。
如果是8位的話,可以将輸入輸出端用總線表示:
也就是說我們可用用異或門實現兩個輸入是否相同;要比較兩個數誰大,事需要一點小技巧的。要從最開始為進行比較,開始位若不同,則為1的那個數大;若開始位不同,則比較下一位;如此往複,直至最後一位。
就需要的異或門的基礎上,再增加4個邏輯門,比較器中每一位的實現邏輯如下:
每一位比較器的輸入有2個:a和b;
從上一位傳遞過來的另外2個輸入(前面位的比較結果):all bits above are equal,“a”larger。
輸出是截止至當前位的比較結果:all bits equal so far,“a”larger。
下面具體分析一下:
如果非門2當前位輸出為on,且從之前位傳過來的标志也為on,表明截止至當前位,輸入a和b是相同的,這個可以通過與門3來實現;
與門4輸出為on時需要滿足三個條件:1)當前位a和b不同;2)a的狀态為on;3)所有之前位都是相等的。當着三個條件都滿足時,表示a大;
當與門4輸出為on時,或門5輸出為on;并且在當前位之後的所有位置,或門5都是on。
當b大的時候,equal标志位和a larger 标志位都為off。
把8個1位比較器堆積起來,就是一個8位比較器了,如下所示:
可以簡單抽象成:
比較器可以和異或門共用一部分電路,同時增加兩個輸出标志equal和a larger。
前面我們已經建立了4個邏輯電路:加法器、移位器(左)、移位器(右)、比較器。加上我們已經很熟悉的三個邏輯電路:與門、非門、或門,我們就可以做成一個ALU(算數與邏輯單元)了,組成如下:
仔細觀察上圖,所有的單元都有輸入a,對于需要兩個輸入的單元,b也被連接。所有單元的輸入端一直保持連接,輸出端都增加了使能器E,使能器的控制端來自譯碼器,也就是說,同時隻會有一個單元被使能。譯碼器有一位輸出并未連接至任何使能器,當該位為on時,7個單元均未被選擇,大家都不工作,僅有a larger和equal有輸出,代表的比較運算。通過op操作碼,可以選擇不同的邏輯或算數單元。
可進一步抽象,如下所示:
op操作碼所對應的選擇為:
其中CMP(比較器)的标志位輸出一直工作。
在文章最開始的時候,我們已經認識了非門,如下圖所示:
它的輸出是0101010101…,如果我們把圖畫出來,會呈現出這個樣子:
高低電平交互出現,周期和信号傳遞需要的時間相關,倘若我們信号傳輸電纜的長度:
就可以得到不同頻率的波形:
可以将時鐘信号抽象成如下樣式:
假如我們将輸出信号的延長,就可以得到一個 相位之後的時鐘信号:
将兩路信号用與門和或門處理一下:
就可以的得到如下波形:
其中clk e為“讀”使能信号,clk s為“寫”使能信号。抽象模型如下:
由于CPU的任務衆多,我們需要用流水線的形式分成多步來實現,比如我們可以分成7步:
我們不妨稱之為stepper,這個stepper是怎麼實現的呢?——抽絲剝繭,一步一步來。首先是把步與步之間區分開來:
輸入是一個時鐘信号,通過非門産生一個相差180°的時鐘信号,如下圖所示:
除兩個時鐘信号外,還有12個1位寄存器(隻有“寫”控制端),交替分成了2組,其中一組的“寫”控制信号為clk,另一組為not clk。最左側第一個寄存器的輸入信号為高電平。不難分析,這個電路的功能就是逐漸的将高電平信号從最左側傳遞到最右側。
顯然,這不是我們想要的最終信号,我們想要隻在當前step是高電平信号,其餘為低電平。怎麼辦呢?再加一點邏輯:
這樣我們就可以得到最終的stepper信号:
Stepper的抽象模型如下:
如果将step 7和reset連接起來:
就可以生成連續不斷的控制信号:
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!