1、指令周期
計算機每執行一條指令的過程,可以分解成這樣幾個步驟。
(1).Fetch(取得指令),也就是從 PC 寄存器里找到對應的指令地址,根據指令地址從內存里把具體的指令,加載到指令寄存器中,然后把 PC 寄存器自增,好在未來執行下一條指令。
(2).Decode(指令譯碼),也就是根據指令寄存器里面的指令,解析成要進行什么樣的操作,是 R、I、J 中的哪一種指令,具體要操作哪些寄存器、數據或者內存地址。
(3).Execute(執行指令),也就是實際運行對應的 R、I、J 這些特定的指令,進行算術邏輯操作、數據傳輸或者直接的地址跳轉。
(4). 重復進行 1~3 的步驟。
這樣的步驟,其實就是一個永不停歇的“Fetch - Decode - Execute”的循環,這個循環稱之為指令周期(Instruction Cycle)。
在取指令的階段,指令是放在存儲器里的,通過 PC 寄存器和指令寄存器取出指令的過程,是由控制器操作的。指令的解碼過程,也是由控制器進行的。一旦到了執行指令階段,無論是進行算術操作、邏輯操作的 R 型指令,還是進行數據傳輸、條件分支的 I 型指令,都是由算術邏輯單元(ALU)操作的,也就是由運算器處理的。一個簡單的無條件地址跳轉,可以直接在控制器里面完成,不需要用到運算器。
2、數據通路
數據通路就是處理器單元。它通常由兩類原件組成。
第一類叫操作元件,也叫組合邏輯元件(Combinational Element),就是 ALU。功能是在特定的輸入下,根據下面的組合電路的邏輯,生成特定的輸出。
第二類叫存儲元件,也有叫狀態元件(State Element)的。比如計算過程中需要用到的寄存器,無論是通用寄存器還是狀態寄存器,其實都是存儲元件。
通過數據總線的方式,把它們連接起來,就可以完成數據的存儲、處理和傳輸了,這就是所謂的建立數據通路。
3、控制器
可以看成只是機械地重復“Fetch - Decode - Execute“循環中的前兩個步驟,然后把最后一個步驟,通過控制器產生的控制信號,交給 ALU 去處理。
4、CPU需要的硬件電路
1)ALU 這樣的組合邏輯電路,實際就是一個沒有狀態的,根據輸入計算輸出結果的第一個電路。
2) 用來存儲數據的鎖存器和 D 觸發器電路,能夠進行狀態讀寫的電路元件,也就是寄存器。這個電路能夠存儲到上一次的計算結果。這個計算結果並不一定要立刻拿到電路的下游去使用,但是可以在需要的時候拿出來用。常見的能夠進行狀態讀寫的電路,就有鎖存器、D 觸發器電路。
3)用來實現 PC 寄存器的計數器電路,需要有一個“自動”的電路,按照固定的周期,不停地實現 PC 寄存器自增,自動地去執行“Fetch - Decode - Execute“的步驟。
4)用來解碼和尋址的譯碼器電路,無論是對於指令進行 decode,還是對於拿到的內存地址去獲取對應的數據或者指令,都需要通過一個電路找到對應的數據。
這四類電路,通過各種方式組合在一起,就能最終組成功能強大的 CPU 了。
5、時序邏輯電路
1)實現自動運行。時序電路接通之后可以不停地開啟和關閉開關,進入一個自動運行的狀態。
2)通過時序電路實現的觸發器,能把計算結果存儲在特定的電路里面,而不是像組合邏輯電路那樣,一旦輸入有任何改變,對應的輸出也會改變。
3)解決了各個功能按照時序協調的問題。無論是程序實現的軟件指令,還是到硬件層面,各種指令的操作都有先后的順序要求。時序電路使得不同的事件按照時間順序發生。
6、反饋電路
看圖,合上開關 A,磁性線圈就會通電,產生磁性,開關 B 就會從合上變成斷開。一旦這個開關斷開了,電路就中斷了,磁性線圈就失去了磁性。於是,開關 B 又會彈回到合上的狀態。這樣一來,電路接通,線圈又有了磁性。電路就會來回不斷地在開啟、關閉這兩個狀態中切換。這個不斷切換的過程,對於下游電路來說,就是不斷地產生新的 0 和 1 這樣的信號。如果在下游的電路上接上一個燈泡,就會發現這個燈泡在亮和暗之間不停切換。這個按照固定的周期不斷在 0 和 1 之間切換的信號,就是時鍾信號(Clock Signal)。這種電路,其實就相當於把電路的輸出信號作為輸入信號,再回到當前電路。這樣的電路構造方式,叫作反饋電路(Feedback Circuit)。
7、程序計數器
時鍾信號提供定時的輸入; D 型觸發器可以在時鍾信號控制的時間點寫入數據。把這兩個功能組合起來,就可以實現一個自動的計數器了。加法器的兩個輸入,一個始終設置成 1,另外一個來自於一個 D 型觸發器 A。加法器的輸出結果,寫到這個 D 型觸發器 A 里面。於是,D 型觸發器里面的數據就會在固定的時鍾信號為 1 的時候更新一次。這樣就有了每過一個時鍾周期,就能固定自增 1 的自動計數器了。這個自動計數器,可以拿來當PC 寄存器。也就是程序計數器(Program Counter)。
每次自增之后,可以去對應的 D 型觸發器里面取值,這也是下一條需要運行指令的地址。加法計數、內存取值,乃至后面的命令執行,最終其實都是由時鍾信號,來控制執行時間點和先后順序的,這也是需要時序電路最核心的原因。
8、譯碼器
來完成“尋址”的電路,就是譯碼器。在現在實際使用的計算機里面,內存所使用的 DRAM,並不是通過上面的 D 型觸發器來實現的,而是使用了一種 CMOS 芯片來實現的。還是可以把內存芯片,當成是很多個連在一起的 D 型觸發器來實現的。
通過一個反相器、兩個與門和一個或門,就可以實現一個 2-1 選擇器。通過控制反相器的輸入是 0 還是 1,能夠決定對應的輸出信號,是和地址 A,還是地址 B 的輸入信號一致。譯碼器的本質,就是從輸入的多個位的信號中,根據一定的開關和電路組合,選擇出自己想要的信號。
9、構造CPU過程
D 觸發器、自動計數以及譯碼器、 ALU,湊齊了一個拼裝一個 CPU 必須要的零件了。
1)自動計數器,這個自動計數器會隨着時鍾主頻不斷地自增,來作為 PC 寄存器。
2)譯碼器,連在計數器后面。譯碼器還要同時連着內存(通過大量的 D 觸發器組成的)。
3)自動計數器會隨着時鍾主頻不斷自增,從譯碼器當中,找到對應的計數器所表示的內存地址,然后讀取出里面的 CPU 指令。
4)讀取出來的 CPU 指令會通過CPU 時鍾控制,寫入到一個由 D 觸發器組成的寄存器,也就是指令寄存器當中。
5)在指令寄存器后面,再跟一個譯碼器。這個譯碼器是把拿到的指令,解析成 opcode 和對應的操作數。
6)opcode 和操作數,對應的輸出線路就要連接 ALU,開始進行各種算術和邏輯運算。對應的計算結果,則會再寫回到 D 觸發器組成的寄存器或者內存當中。