- 計算機系統解密:從理解計算機到編寫高效代碼
- (美)喬納森·E.斯坦哈特
- 1896字
- 2021-09-27 16:57:07
4.5 最終設計
我們把到目前為止的所有片段組合到一臺實際的計算機中。我們需要在幾處使用“膠水”才能讓一切正常。
4.5.1 指令寄存器
你可能會誤以為計算機在執行計算斐波那契數序列的程序時,一次只執行一條指令。但后臺其實處理了更多事情。執行一條指令需要什么?圖4-20所示的狀態機將執行以下兩個步驟。

圖4-20 獲取–執行循環
要做的第一件事是從內存中取得指令。獲得指令后,就可以考慮該如何執行該指令。
執行指令通常涉及訪問內存。這意味著在使用內存執行其他任務時,需要有一個地方來保存指令。因此,我們向CPU添加一個指令寄存器來保存當前指令,如圖4-21所示。

圖4-21 增加一個指令寄存器
4.5.2 數據通路和控制信號
復雜的部分來了。我們需要將程序計數器的內容輸入內存地址總線的方法,以及將內存數據輸入指令寄存器的方法。可以做一個類似的練習來確定實現指令集中所有內容(見表4-4)所需的不同連接,最后得到了圖4-22。圖4-22可能看起來很混亂,但它實際上只是些我們之前見過的東西:寄存器、選擇器、ALU和三態緩沖器。

圖4-22 數據通路和控制信號
雖然它看起來很復雜,但它就像一張路線圖,比真正的城市地圖簡單多了。地址選擇器只是一個三路交叉口,而數據選擇器是一個四路交叉口。對于將在第6章中討論的I/O設備,存在掛載到地址總線和數據總線的連接。
圖4-22中唯一的新內容是間接地址寄存器。之所以需要它是因為我們需要在某個地方保存從內存中獲取的間接地址,就像需要指令寄存器保存從內存中獲取的指令一樣。
為了簡單起見,圖4-22省略了所有寄存器和內存中的系統時鐘。在簡單寄存的情況下,假設寄存器被加載到下一個時鐘(如果啟用)。同樣,程序計數器和內存在每個時鐘上按其控制信號的指示執行程序。所有其他組件(比如選擇器)都只是純粹地進行了組合,不使用時鐘。
4.5.3 流量控制
既然已經熟悉了所有的輸入和輸出,現在是時候構建流量控制單元了。我們來看幾個關于它需要如何運行的例子。
獲取指令、獲取數對所有指令都是通用的,涉及以下信號:
- 地址源必須設置為選擇程序計數器。
- 必須啟用內存,讀寫信號
必須設置為讀取(1)。
- 指令寄存器必須啟用。
比如,把累加器的內容存儲在指令中地址所指向的內存地址(間接尋址),仍然可以像上面那樣獲取地址。
從內存獲取間接地址:
- 地址源必須設置為選擇指令寄存器,它可以獲取指令的地址部分。
- 啟用內存,
設置為讀取(1)。
- 啟用間接地址寄存器。
將累加器存儲在該地址中:
- 地址源必須設置為選擇間接地址寄存器。
- 必須設置數據總線啟用。
- 啟用內存,
設置為寫入(0)。
- 程序計數器遞增。
因為獲取和執行指令涉及多個步驟,所以需要一個計數器來跟蹤它們。計數器內容加上指令的操作碼和方式部分就可以生成所有的控制信號。我們需要2位計數器,因為執行最復雜的指令需要三種狀態,如圖4-23所示。

圖4-23 隨機邏輯流量控制
圖4-23所示的是一個裝滿隨機邏輯的大盒子。到目前為止,我們看到的所有邏輯圖都遵循某種規律。功能塊(如選擇器和寄存器)以一種清晰的方式由簡單的塊組裝而成。有時,例如當實現流量控制單元時,必須有一組輸入被映射到一組輸出以完成一個沒有規律的任務。這張示意圖看起來就像一個老鼠窩一樣的連接,因此表示出了“隨機”。
還有另一種可以實現流量控制單元的方法。該方法用大量的內存來代替隨機邏輯。地址將由計數器輸出加上指令的操作碼和方式部分組成,如圖4-24所示。圖4-25展示了每一個19位的內存字。

圖4-24 基于內存的流量控制

圖4-25 微碼字布局
圖4-25可能會讓你覺得有些奇怪。一方面,它只是另一個使用內存而不是隨機邏輯實現的狀態機。另一方面,它看起來確實像一臺簡單的計算機。以上兩種解釋都正確。之所以說它是狀態機是因為計算機就是狀態機。但它也是一臺計算機,因為它是可編程的。
這種類型的實現稱為微編碼,內存的內容稱為微碼。通常一臺小型計算機可以作為大型計算機實現的一部分。
我們來看微指令的一部分,如圖4-26所示,它實現了我們討論過的例子。

圖4-26 微碼示例
正如你所料,一個好主意很難不被濫用。有些機器有一個納米編碼塊,它實現了可以實現指令集的微編碼塊。
使用ROM作為微碼存儲器是有一定意義的,否則我們就需要在其他地方保存一份微碼的副本,并且需要額外的硬件來加載微碼。然而,在某些情況下,RAM或者ROM和RAM的混合體也是合理的。有些Intel CPU有可寫微碼,可以通過修補來修復bug。有些機器,如HP-2100系列,有一個可寫的控制存儲器,它是可以用來擴展基本指令集的微碼RAM。
當今擁有可寫微碼的設備很少允許用戶修改,原因有以下幾個。制造商不希望用戶依賴用戶自己為應用程序編寫的微碼,因為一旦用戶開始依賴它,制造商就很難打破這點。此外,有缺陷的微碼也會損壞設備,例如它可以同時打開CPU中的內存使能和數據總線使能以可能燒壞晶體管的方式連接圖騰柱輸出。
- 少兒人工智能趣味入門:Scratch 3.0動畫與游戲編程
- JavaScript前端開發模塊化教程
- Getting Started with React
- 信息可視化的藝術:信息可視化在英國
- 編寫高質量代碼:改善Python程序的91個建議
- Dependency Injection in .NET Core 2.0
- 假如C語言是我發明的:講給孩子聽的大師編程課
- Visual Basic程序設計實驗指導(第4版)
- 手把手教你學C語言
- Python漫游數學王國:高等數學、線性代數、數理統計及運籌學
- Unity Game Development Scripting
- Python數據結構與算法(視頻教學版)
- Mastering Android Development with Kotlin
- Java系統化項目開發教程
- C++20高級編程