# 計算機組織與結構 L4 處理器 : 資料路徑與控制 計算機實作規格有兩種 - **單一時脈計算機** - 所有指令的執行都要在一個時脈週期內完成 - 時脈週期長度取決於最長執行時間的指令 - 效率不佳 - **多重時脈計算機** - 將指令分成好幾個步驟,每個步驟都是一個時脈週期 - 執行時間較長的指令需要較多的步驟 - 減少單一時脈造成的時間浪費 ## 抽象化設計 **指令集 :** 建構計算機的規格 **Design Abstraction :** 設計複雜系統時,將較低層的細節掩藏起來,以簡化抽象化設計原則 - 基本零件 - **Register File :** ![image](https://hackmd.io/_uploads/rk5LPkdq6.png =40%x) - **ALU :** ![image](https://hackmd.io/_uploads/Skz9wkd5p.png =40%x) - **Data Memory :** ![image](https://hackmd.io/_uploads/Sk0nwyOcp.png =40%x) - **Instruction Memory :** ![image](https://hackmd.io/_uploads/B1n1_yO9T.png =40%x) - **Adder :** ![image](https://hackmd.io/_uploads/rkRNOkOc6.png =40%x) - **Sign Extension Unit :** ![image](https://hackmd.io/_uploads/B1bwOy_5T.png =40%x) - **Program Counter :** ![image](https://hackmd.io/_uploads/BJMYOyd56.png =40%x) - **Processor (CPU) :** - 包含 Datapath 和 Control Unit ## 單一時脈計算機 (Single Cycle Machine) Datapath 的建構 **RTL (Register Transfer Language) :** 暫存器轉移敘述 1. **Instruction Fetch** ![image](https://hackmd.io/_uploads/SJTDtJuqT.png =50%x) 2. **R-Tpye Instruction** ![image](https://hackmd.io/_uploads/H1C5o1O5T.png =60%x) 3. **Load Word** ![image](https://hackmd.io/_uploads/Hyo-21_cp.png =60%x) 4. **Store Word** ![image](https://hackmd.io/_uploads/BJHShyO5p.png =60%x) 5. **Branch On Equal** ![image](https://hackmd.io/_uploads/H1HDhyuqT.png =60%x) ![image](https://hackmd.io/_uploads/rknu2JOqT.png =60%x) 6. **Memory & R-Tpye (2, 3, 4)** ![image](https://hackmd.io/_uploads/ByGy61O96.png =60%x) 7. **Memory & R-Type & Instruction Fetch (1, 2, 3, 4)** ![image](https://hackmd.io/_uploads/r1wGpku9a.png =60%x) 8. **Memory & R-Type & Instruction Fetch & Branch (1, 2, 3, 4, 5)** ![image](https://hackmd.io/_uploads/B1hYp1dc6.png =60%x) 9. ⭐**With Control Unit** ![image](https://hackmd.io/_uploads/SJ7eA1Oc6.png =80%x) 10. **With Jump** ![image](https://hackmd.io/_uploads/HyFLCJ_c6.png =80%x) ## 單一時脈計算機的 Control Unit - 用 **Control Unit** 的其中兩根訊號線 **ALUOp** 控制 **ALU Control** - 降低主要控制單元的尺寸 - 加快控制單元的速度 ![image](https://hackmd.io/_uploads/r1wWgg_cp.png =70%x) ![image](https://hackmd.io/_uploads/BJV9lgOqT.png =70%x) - | 控制信號 | Effect When Deasserted | Effect When Asserted | | -------- | -------- | -------- | | **RegDst** | 寫入的目的暫存器是 **rt** | 寫入的目的暫存器是 **rd** | | **RegWrite** |None|允許寫入資料| |**ALUSrc** | ALU 的第二個運算元為 **register 第二個輸出** | ALU 第二個運算元為 **sign extend 後的結果** | |**PCSrc**| PC 為 **PC + 4** |PC 為**分支目的位址**| |**MemRead**|None|允許要被讀的資料輸出記憶體| |**MemWrite**|None|允許要被寫的資料輸入記憶體| |**MemtoReg**|要寫入 register 的資料是來自 **ALU 的計算結果**| 要寫入 register 的資料是來自 **memory**| - | 指令 | RegDst | ALUSrc | MemtoReg | RegWrite | | -------- | -------- |---|---|---| | **R-Type** | 1 | 0 | 0 | 1 | | **lw** | 0 | 1 | 1 | 1 | | **sw** | x | 1 | x | 0 | | **beq** | x | 0 | x | 0 | | **addi** | 0 | 1 | 0 | 1 | | 指令 | MemRead | MemWrite | Branch | ALUOp1 | ALUOp0 | | -------- | -------- | -- | -- |---|---| | **R-Type** | 0 | 0 | 0 | 1 | 0 | | **lw** | 1 | 0 | 0 | 0 | 0 | | **sw** | 0 | 1 | 0 | 0 | 0 | | **beq** | 0 | 0 | 1 | 0 | 1 | | **addi** | 0 | 0 | 0 | 0 | 0 | - **PLA (Programmable Logic Array) :** 是 Control Unit 的其中一種電路方式 ![image](https://hackmd.io/_uploads/r1lbHl_9a.png =70%x) - **Dataflow Chart** - **Dataflow for R-Type** - **PIR MAMR** ![image](https://hackmd.io/_uploads/BJD9gMF5p.png =80%x) - **Dataflow for lw** - **PIR ADMR** ![image](https://hackmd.io/_uploads/HJLAlft9p.png =80%x) - **Dataflow for sw** - **PIR AD** ![image](https://hackmd.io/_uploads/S1DHbzt9T.png =80%x) - **Dataflow for Branch** - **PIR MAaM** ![image](https://hackmd.io/_uploads/HkDtbzY9T.png =80%x) - **Dataflow for addi** - **PIR AMR** ![image](https://hackmd.io/_uploads/rJ3FUxO9p.png =80%x) - **Dataflow for Jump** - **PI SCM** ![image](https://hackmd.io/_uploads/ryrAWztcT.png =80%x) - **Chart Comparision** ![image](https://hackmd.io/_uploads/r1c3LeucT.png =70%x) ## 多重時脈計算機 (Multi Cycle Machine) - **每個步驟**只能使用**一個主要功能單元** - **Memory** - **Register** - **ALU** - 指令執行步驟分為 - **Instruction Fetch (IF)** - **Instruction Decode & Register Fetch (ID)** - **Execution, Memory Address Computation or Branch Completion (EXE)** - **Memory Access or R-Type Instruction Completion (MEM)** - **Memory Read Completion (WB)** ![image](https://hackmd.io/_uploads/B102DxO9a.png)