6.1 基本CPU設計模式 從組成元件認識資料路徑 從指令執行週期看CPU結構
6.1.1 從組成元件認識資料路徑 傳統說法: 現代電腦: 6.1.1 從組成元件認識資料路徑 傳統說法: CPU主要由算術與邏輯運算單元(arithmetic/logic unit,ALU)以及控制單元(control unit,CU)兩大部分所組成。 現代電腦: ALU、CU 暫存器 加入其他加速運算的元件 浮點運算器(floating-point processing unit,FPU) 延伸指令處理器
6.1.1 從組成元件認識資料路徑 現代CPU大致的組成架構:
6.1.1 從組成元件認識資料路徑 資料路徑(datapath): 6.1.1 從組成元件認識資料路徑 資料路徑(datapath): 將所有執行指令與處理資料所需要的元件妥善整合之後,就形成完整的資料路徑(datapath)。 設計CPU時最重要的工作,就是架構一個資料路徑,並完成正確的控制。
6.1 基本CPU設計模式 從組成元件認識資料路徑 從指令執行週期看CPU結構
CPU執行指令的三個階段(phase): 1.指令擷取階(fetching phase) 2.指令解碼階(decoding phase) 3.指令執行階(execution phase)
6.1.2 從指令執行週期看CPU結構 資料路徑: 控制單元: 指令執行的流程: 元件與元件間互連的通道合稱為資料路徑。 資料依指令種類的不同而流經幾個不同元件,以接受對應之處理的過程。 元件與元件間互連的通道合稱為資料路徑。 控制單元: 安排資料進入正確運算單元、並及時啟動運算單元的元件。
6.1.2 從指令執行週期看CPU結構 CPU可視為資料路徑與控制單元的組合,圖中虛線框內即為資料路徑
指令擷取階段(fetching phase) 6.1.2 從指令執行週期看CPU結構 指令擷取階段(fetching phase) 先利用一個專門存放下一個指令位址的暫存器(通常稱為程式計數器program counter,簡稱PC)自記憶體中擷取正確的程式指令到另一個特定的暫存器中(通常稱為指令暫存器instruction register,簡稱IR);擷取到指令之後,還會自動計算出下一個要擷取的指令位址,並存入PC中。這個階段雖然並未真正執行程式中的指令,但卻是指令執行過程不可或缺的步驟;而且它涉及的其實也都是暫存器與記憶體之間的資料存取、還有針對PC的算術運算,所以也算是資料路徑上的動作。
指令解碼階段(decoding phase) 6.1.2 從指令執行週期看CPU結構 指令解碼階段(decoding phase) 此階段幾乎完全仰賴控制單元。通常控制單元會依據指令集的定義,先將指令中的運算碼(op_code)欄位取出,並將其進行解碼;之後再依照解碼所得的結果,將指令剩下的部分拆解成各種不同定址型態的運算元(例如常數、暫存器編號、或直/間接位址值),以取得該指令的所有參數。而為了正確執行運算,控制單元還必須根據解碼的結果將指令進一步拆解成一或數個資料路徑動作可以處理的微指令,並產生對應的控制訊號給暫存器、記憶體與算術/邏輯等所有運算單元。它會對各個數位元件的控制線發出正確的控制訊號,讓指令的執行以預期的形式、內容、與順序完成。
指令執行階段(execution phase) 6.1.2 從指令執行週期看CPU結構 指令執行階段(execution phase) 經過解碼階段將指令中的訊息都解讀出來,並且將指令中所包含的參數取出之後,下一階段便是依照時脈的驅動與控制碼的指示,讓資料進入CPU內部的特定處理單元,例如邏輯、算術、位元移位等元件之一去進行運算,最後將運算結果存入適當的暫存器或記憶體。
6.2 從簡化的指令集開始 處理器必要且基本的運算: 記憶體存取(memory fetch) 6.2 從簡化的指令集開始 處理器必要且基本的運算: 記憶體存取(memory fetch) 整數加減法運算(addition/subtraction of integer) 邏輯運算(logic operation) 位元移位運算(shift) 分支/跳躍(branch/jump)指令
6.2 從簡化的指令集開始 記憶體存取指令 整數加減法指令 邏輯運算指令 位元移位指令 分支跳躍指令
6.2.1 記憶體存取指令 兩種記憶體存取指令: 載入一個字組(load word)資料。 回存一個字組(store word)到記憶體。 6.2.1 記憶體存取指令 兩種記憶體存取指令: 載入一個字組(load word)資料。 lw A, B 讀取暫存器B中所存之記憶體位址內的字組值,並存入暫存器A。 回存一個字組(store word)到記憶體。 stw A, B 將暫存器A目前內含的字組值存入暫存器B中所存之記憶體位址內。
6.2.2 整數加減法指令 加、減法指令: 加法指令: 減法指令: add A, B, C 6.2.2 整數加減法指令 加、減法指令: 加法指令: add A, B, C 將B, C兩暫存器內的值相加後的和存入暫存器A,亦即A=B+C。 減法指令: sub A, B, C 將暫存器B內的值減去暫存器C內的值後,把所得的差值存入暫存器A,亦即A=B-C。
常用的邏輯指令有三種,由這三種便可以組合出各種不同的邏輯運算: 6.2.3 邏輯運算指令 常用的邏輯指令有三種,由這三種便可以組合出各種不同的邏輯運算: AND指令: and A, B, C 將B, C兩暫存器所存的值逐位元進行and運算,並將結果存入A暫存器,亦即A = B and C。 OR指令: or A, B, C 將B, C兩暫存器的值逐位元進行or運算,並將值存入A暫存器,亦即A = B or C。
6.2.3 邏輯運算指令 XOR指令: xor A, B, C 將B, C兩暫存器的值逐位元進行exclusive or運算,並將值存入A暫存器,亦即A = B xor C;基本上xor指令的兩個來源參數若是相同變數,則所得到的結果便會是該值的反相,即A xor A = not A。
6.2.4 位元移位指令 移位指令: 將所有位元「同時」朝「同一方向」移動n個位元的位置。 可分為以下三種: 6.2.4 位元移位指令 移位指令: 將所有位元「同時」朝「同一方向」移動n個位元的位置。 可分為以下三種: 邏輯移位(logical shift) 算術移位(arithmetic shift) 循環移位(circular shift)
6.2.4 位元移位指令 邏輯移位(logical shift) 6.2.4 位元移位指令 邏輯移位(logical shift) 不論是往左或往右移位,被移出儲存範圍的位元值將一律捨棄;移位後所空出來的位元空間則一律填入0。 指令格式如下: lsh A, n, d 將暫存器A中的值邏輯位移n位,而d則代表移位方向,當d為0時向左移n位 ,若d為1則向右移n位。
算術移位(arithmetic shift): 6.2.4 位元移位指令 算術移位(arithmetic shift): 相當於將原數值乘或除上一個2的指數,左移一位代表乘以2,右移一位則代表除以2。 須考慮到原本數值的正負符號,通常計算機會以2補數(2’ complement)的方式來儲存負值。 指令格式如下: ash A, n, d 將A暫存器中的值算術移位n個位元,d代表移位方向,當d為0則向左移n位,暫存器最右邊的n個位元則一律填入0;要注意的是當原數值最左邊n+1個位元並非相同位元值時,便會產生溢位,可能需要額外處理。反過來若d為1,則將原數值內的所有位元向右移n位,暫存器最左邊的n個位元空間則一律填入與原符號位元相同的值。
6.2.4 位元移位指令 循環移位(circular shift) 6.2.4 位元移位指令 循環移位(circular shift) 將變數所佔的暫存器空間當成一個環狀的連續空間,不論左移或右移,每移出一個位元,便將它從另外一端插入。 指令格式如下: csh A, n, d 將A暫存器中的值循環移動n位,d代表移位方向,當d為0則向左移n位,原本最左邊n個位元的值被移出後,重新依照原順序填入暫存器最右邊的n個位元空間;而若d為1時,則將原數值向右循環移動n位,原本最右邊n個位元的值被移出後,重新依照原順序填入暫存器最左邊的n個位元空間。
6.2.4 位元移位指令 32位元數經三種移位類型右移4位元後的結果:
6.2.5 分支跳躍指令 分支(branch) 跳躍(jump) 「有條件」改變執行順序的情況。 可利用旗標(flag)控制分支。 6.2.5 分支跳躍指令 分支(branch) 「有條件」改變執行順序的情況。 可利用旗標(flag)控制分支。 可搭配比較(compare)指令。 跳躍(jump) 「無條件」跳到某個特定的指令位址開始執行。
6.2.5 分支跳躍指令 比較指令: copm A, B 比較A、B兩個值的大小,事實上就等於是執行A-B的運算。當兩數相等時,便將zero旗標值設為1,否則設為0;假使A<B,則將negative旗標的值設為1,否則設為0。此2個旗標值對於是否進行分支,具有相當的重要性。
6.2.5 分支跳躍指令 分支指令: brz C brless C 6.2.5 分支跳躍指令 分支指令: brz C 當zero旗標的值等於1時,即改變指令執行順序,而下一個要執行的指令位址就是暫存器C中所存的值;但若zero旗標值不為0,則不做任何進一步動作,繼續執行目前PC所存位址中的那個指令。 brless C 當negative旗標的值等於1時,即改變指令執行順序,而下一個要執行的指令位址就是暫存器C中所存的值;但若negative旗標值不為0,則不做任何進一步動作,繼續執行目前PC所存位址中的那個指令 。
6.2.5 分支跳躍指令 跳躍指令: jp A 無條件進行跳躍,不管前一個指令的執行結果為何,下一個要執行的指令位址就是暫存器A中所存的值。
6.3 組成資料路徑的元件 解碼器與多工器 暫存器陣列 加/減法器 邏輯運算單元 移位運算器
6.3.1 解碼器與多工器 解碼器(decoder) 輸入: 輸出: 控制或選擇路徑的重要元件。 6.3.1 解碼器與多工器 解碼器(decoder) 輸入: 一個二進制的位元串。 輸出: 相當於該輸入所能表示之數值大小的輸出訊號。 控制或選擇路徑的重要元件。 當作開關時,則每次只會恰有一個開關打開,其餘的通通都會是關閉狀態。 5位元解碼器
6.3.1 解碼器與多工器 多工器(multiplexor) 輸入: 輸出: 功能: 一個二進位位元串。 6.3.1 解碼器與多工器 多工器(multiplexor) 輸入: 一個二進位位元串。 相對於二進位位元串所能表示的最大個數之輸入。 輸出: 所有輸入端所傳入資料中的其中一個。 功能: 用一組代碼自多個值當中挑選其中一個值來輸出。 4-to-1多工器
6.3 組成資料路徑的元件 解碼器與多工器 暫存器陣列 加/減法器 邏輯運算單元 移位運算器
計算機中都會有相當數量的暫存器,可分為: 6.3.2 暫存器陣列 計算機中都會有相當數量的暫存器,可分為: 特殊目的暫存器(special purpose registers) 程式計數器(PC)、指令暫存器(IR)。 通用暫存器(general purpose registers) 供使用者的程式自由使用。
6.3.2 暫存器陣列 暫存器陣列 暫存器以陣列的方式來運作。 利用索引值(index)來存取個別的暫存器。 6.3.2 暫存器陣列 暫存器陣列 暫存器以陣列的方式來運作。 利用索引值(index)來存取個別的暫存器。 索引:每個暫存器的位址(address)。 又稱暫存器檔案(register file)。 可定址(addressable)的。
6.3.2 暫存器陣列 暫存器陣列的內部結構
6.3.2 暫存器陣列 所有的暫存器不論是要寫入或是讀出,都是透過共同的輸入與輸出匯流排。 實際運作時,不可能一次對所有暫存器寫入、或是同時讀出所有的暫存器的內容。 決定資料要寫入哪一個暫存器、或是由哪一個暫存器輸出,則是分別由「寫入」與「讀出」兩個32-to-1解碼器來決定,因此一條匯流排上每次只會有一個暫存器的讀/寫會被觸發。
6.3.2 暫存器陣列 暫存器陣列架構: 輸入: 輸出: 控制: XA、YA:5位元的索引值(位址)。 6.3.2 暫存器陣列 暫存器陣列架構: 輸入: XA、YA:5位元的索引值(位址)。 ZA:5位元的索引值,指定要寫入的暫存器。 Z:寫入暫存器的值。 輸出: X、Y:讀出的值。 控制: rwe:允許寫入(register write enable ) 。 從外部看暫存器陣列元件
6.3 組成資料路徑的元件 解碼器與多工器 暫存器陣列 加/減法器 邏輯運算單元 移位運算器
32位元的整數加/減法器(adder/subtractor) 6.3.3 加/減法器 32位元的整數加/減法器(adder/subtractor) 輸入: A、B兩個輸入端,各可輸入一個32位元的整數。 輸出: F端輸出32位元的運算結果,為A+B或A-B。 控制端: 啟動加/減法器的a/su_en(adder/subtractor unit enable)。 決定要進行加法或減法運算的ā/s端。 32位元加/減法器元件
6.3 組成資料路徑的元件 解碼器與多工器 暫存器陣列 加/減法器 邏輯運算單元 移位運算器
6.3.4 邏輯運算單元 邏輯運算單元(logic unit) 專責進行邏輯運算。 常以多工器建構,每個多工器一次可以完成單一位元的運算。 6.3.4 邏輯運算單元 邏輯運算單元(logic unit) 專責進行邏輯運算。 and、or、xor 常以多工器建構,每個多工器一次可以完成單一位元的運算。
利用真值表(truth table)分別來表示and、or、及xor的邏輯函數。 6.3.4 邏輯運算單元 利用真值表(truth table)分別來表示and、or、及xor的邏輯函數。 b a 邏輯函數 and or xor LF0 1 LF1 LF2 LF3
6.3.4 邏輯運算單元 單一位元邏輯運算器 真值表建立後,利用多工器實現。 輸入: 輸出: 控制: a、b兩個位元。 6.3.4 邏輯運算單元 單一位元邏輯運算器 真值表建立後,利用多工器實現。 輸入: a、b兩個位元。 輸出: F值代表運算結果,由多工器根據ba輸入組合來選擇邏輯函數中的對應位元 。 控制: 邏輯函數LF3LF2LF1LF0。 4-to-1多工器實作出單一位元的邏輯運算器
6.3.4 邏輯運算單元 32位元邏輯運算器 將32個單位元邏輯運算器組合起來並以共同時脈來驅動。 32位元的邏輯運算器
6.3 組成資料路徑的元件 解碼器與多工器 暫存器陣列 加/減法器 邏輯運算單元 移位運算器
6.3.5 移位運算器 遞移式移位運算器: 所有位元同時朝指令所指定的方向移動,每次僅移動一個位元的位置。 6.3.5 移位運算器 遞移式移位運算器: 所有位元同時朝指令所指定的方向移動,每次僅移動一個位元的位置。 若要移位n個位元,就必須執行n次。 沒有效率、需要控制次數的額外機制。
6.3.5 移位運算器 遞移式左移過程:
多位移位器(barrel shifter) 6.3.5 移位運算器 多位移位器(barrel shifter) 可以在一個時脈中完成0到31個位元間任意位數的移位運算。 由5個更小的 移位器串接起來的,也就是分5次進行移位。 k從4到0。 將可移位位數以二進制的方式組合起來,正好可表示所有介於0到31之間的數。
6.3.5 移位運算器 多位移位器移9個位元實例:
每個階段的 移位器都可以用32個多工器來實作,其中最左或最右 個位元的移位結果將視移位種類與方向來決定。 6.3.5 移位運算器 每個階段的 移位器都可以用32個多工器來實作,其中最左或最右 個位元的移位結果將視移位種類與方向來決定。 每個 移位器的單一位元
6.3.5 移位運算器 32位元位移器: 將5個 移位器串接起來,並加上移位方向與二進制的移位位數等輸入。 多位移位器的主要結構
6.3.5 移位運算器 設置於CPU中的移位器: 輸入: 輸出: 移位器的開關:以su_en表示,用來決定是否啟動此移位器。 6.3.5 移位運算器 設置於CPU中的移位器: 輸入: 移位器的開關:以su_en表示,用來決定是否啟動此移位器。 要移位的字組:以A來代表,即字組原始的值。 要移位的方向:以d來表示。 要移位的位數:以S來表示,一個5位元的無號整數。 移位的類型:以st來表示,指明要進行何種移位運算。 邏輯移位、算術移位、循環移位。 輸出: 用F來表示,即是移位後的32位元字組。 設置於資料路徑中的移位器
6.4 基本資料路徑設計 單時脈週期資料路徑的控制方式 基本資料路徑架構 基本資料路徑的控制 基本資料路徑微指令的範例
6.4.1 單時脈週期資料路徑的控制方式 控制單元硬體設計: 將實體控制線當作實際機器指令的解碼輸出。 6.4.1 單時脈週期資料路徑的控制方式 控制單元硬體設計: 將實體控制線當作實際機器指令的解碼輸出。 稱為硬體接線式控制(hardwired control)。 優點: 執行速度快。 缺點: 電路複雜且難以設計或修改。 修改代價高。 硬體接線式的控制單元
6.4.1 單時脈週期資料路徑的控制方式 控制單元硬體設計: 6.4.1 單時脈週期資料路徑的控制方式 控制單元硬體設計: 可利用可燒錄邏輯陣列(Programming Logic Array,PLA)電路來完成單時脈處理器的控制單元硬體設計。 降低代價成本。 利用可燒錄邏輯陣列電路實作控制單元
6.4 基本資料路徑設計 單時脈週期資料路徑的控制方式 基本資料路徑架構 基本資料路徑的控制 基本資料路徑微指令的範例
6.4.2 基本資料路徑架構 最基本的單一時脈週期資料路徑
6.4 基本資料路徑設計 單時脈週期資料路徑的控制方式 基本資料路徑架構 基本資料路徑的控制 基本資料路徑微指令的範例
6.4.3 基本資料路徑的控制 控制單元: 根據指令而發出各種控制訊號,讓每個運算單元能夠正確運作的一些線路的集合。 6.4.3 基本資料路徑的控制 控制單元: 根據指令而發出各種控制訊號,讓每個運算單元能夠正確運作的一些線路的集合。 若要認識資料路徑該如何控制,得先來看整個資料路徑上之可控制端或輸入端。
6.4.3 基本資料路徑的控制 暫存器: 暫存器陣列位址: 暫存器陣列寫入開關: 兩個來源暫存器位址XA、YA 一個目的暫存器位址ZA 6.4.3 基本資料路徑的控制 暫存器: 暫存器陣列位址: 兩個來源暫存器位址XA、YA 一個目的暫存器位址ZA 長度皆是5位元。 暫存器陣列寫入開關: rwe,1個位元的控制訊號,用來決定運算結果值是否要回暫存器陣列。
6.4.3 基本資料路徑的控制 暫存器: 常數暫存器開關: 常數暫存器資料: 6.4.3 基本資料路徑的控制 暫存器: 常數暫存器開關: im_en,1個位元的控制訊號,用來決定排線Y上的資料來源,當它為0則使用暫存器陣列第二個讀出端上的資料;若為1則改用常數暫存器中的資料。 常數暫存器資料: im_va為一個常數資料,長度為32位元,用來輸入到常數暫存器以參與運算;此資料不算控制訊號,當指令解碼後,解碼線路會將常數自指令中取出,並放入此暫存器。
6.4.3 基本資料路徑的控制 加/減法器: 加/減法器開關: 加/減法切換: 6.4.3 基本資料路徑的控制 加/減法器: 加/減法器開關: a/su_en,1個位元的控制訊號,用來決定是否使用加/減法器。 加/減法切換: ā/s,當它為0時執行加法,當它為1時執行減法。
6.4.3 基本資料路徑的控制 邏輯運算器: 邏輯運算器開關: 邏輯函數: lu_en,1個位元的控制訊號,用來決定是否使用邏輯運算器。 6.4.3 基本資料路徑的控制 邏輯運算器: 邏輯運算器開關: lu_en,1個位元的控制訊號,用來決定是否使用邏輯運算器。 邏輯函數: lf,為一個4位元的訊號,分別代表輸入資料中,成對的兩個輸入位元在四種情況下的對應輸出。
6.4.3 基本資料路徑的控制 移位運算器: 移位運算器開關: 要移位的方向: 移位的類型: 6.4.3 基本資料路徑的控制 移位運算器: 移位運算器開關: su_en,1個位元的控制訊號,用來決定是否使用移位運算器。 要移位的方向: sd,1個位元的控制訊號,當它為0時向左移位;當它為1時向右移位。 移位的類型: st,2個位元的控制訊號,當它為00時表示應進行邏輯移位、01時表示應進行算術移位、10時則執行循環移位。
6.4.3 基本資料路徑的控制 CPU內部微指令: XA YA ZA rwe imm_en im_va ā/s lu_en LF sd st 6.4.3 基本資料路徑的控制 CPU內部微指令: XA YA ZA rwe imm_en im_va a/su_en ā/s lu_en LF su_en sd st 5 1 32 4 2 指令控制的位元串
6.4 基本資料路徑設計 單時脈週期資料路徑的控制方式 基本資料路徑架構 基本資料路徑的控制 基本資料路徑微指令的範例
6.4.4 基本資料路徑微指令的範例 實例一:加法基本指令運算 add R1, R2, R3 將這個加法轉成微指令: XA YA ZA 6.4.4 基本資料路徑微指令的範例 實例一:加法基本指令運算 add R1, R2, R3 將這個加法轉成微指令: XA YA ZA rwe imm_en im_va a/su_en ā/s lu_en LF su_en sd st 2 3 1 x xxxx xx
6.4.4 基本資料路徑微指令的範例 實例二:基本邏輯運算指令 將這個『或』(or)運算轉成微指令 : or R1, R2, R3 XA 6.4.4 基本資料路徑微指令的範例 實例二:基本邏輯運算指令 or R1, R2, R3 將這個『或』(or)運算轉成微指令 : XA YA ZA rwe imm_en im_va a/su_en ā/s lu_en LF su_en sd st 2 3 1 x 1110 xx
6.4.4 基本資料路徑微指令的範例 實例三:一個較複雜的算術實例 先以暫存器來對應到算術式中的各個變數: 6.4.4 基本資料路徑微指令的範例 實例三:一個較複雜的算術實例 A=(B+C+D)/2 – (E+F) 先以暫存器來對應到算術式中的各個變數: A=R1, B=R2, C=R3, D=R4, E=R5, F=R6 接下來再把原來的式子拆開來,以多個連續的基本指令來表示,其間並加入儲存過渡結果的暫存器R7: add R1, R2, R3 ;R1=B+C add R1, R1, R4 ;R1=B+C+D ash R1, 1, 1 ;R1=(B+C+D)/2 add R7, R5, R6 ;R7=E+F sub R1, R1, R7 ;R1=(B+C+D)/2 – (E+F)
6.4.4 基本資料路徑微指令的範例 實例三:一個較複雜的算術實例 最後將所有指令都轉為微指令: XA YA ZA rew imm_en 6.4.4 基本資料路徑微指令的範例 實例三:一個較複雜的算術實例 最後將所有指令都轉為微指令: XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st 2 3 1 X xxxx x xx 4 01 5 6 7
6.4.4 基本資料路徑微指令的範例 實例四:邏輯組合運算 先把所有的變數對應到暫存器 : 6.4.4 基本資料路徑微指令的範例 實例四:邏輯組合運算 A=(B or C) xor (D and E) 先把所有的變數對應到暫存器 : A=R1, B=R2, C=R3, D=R4, E=R5 接下來再把原來的式子拆開來,以多個連續的基本指令來表示: or R1, R2, R3 ;R1=B or C and R6, R4, R5 ;R6=D and E xor R1, R1, R6 ;A=R1=(B or C) xor (D and E)
6.4.4 基本資料路徑微指令的範例 實例四:邏輯組合運算 最後將所有指令都轉為微指令: XA YA ZA rew imm_en im_va 6.4.4 基本資料路徑微指令的範例 實例四:邏輯組合運算 最後將所有指令都轉為微指令: XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st 2 3 1 X x 1110 xx 4 5 6 1000 0110
6.5 更完整的資料路徑設計 連接記憶體模組 包含指令擷取階段的資料路徑
6.5.1 連接記憶體模組 架構與控制項目的變動 記憶體的資料存取也可以透過X、Y、Z三條排線來進行,因此可以直接將它當成是資料路徑上的一個元件來連接。
6.5.1 連接記憶體模組 記憶體控制端: 記憶體模組的開關: 讀/寫選擇: 以msel表示,1表示可存取記憶體,0則無法存取。 6.5.1 連接記憶體模組 記憶體控制端: 記憶體模組的開關: 以msel表示,1表示可存取記憶體,0則無法存取。 讀/寫選擇: 以r/-w來表示,1表示只可自記憶體讀出值來,0則只能寫入;但當msel=0時,r/-w便無意義,可予忽略。
6.5.1 連接記憶體模組 記憶體控制端: 容許寫回: 容許載入: 6.5.1 連接記憶體模組 記憶體控制端: 容許寫回: 以st_en表示,若為1則表示Y排線上的值可寫入記憶體中;此值與以下的容許載入值不能同時為1,以免造成錯誤。 容許載入: 以ld_en表示,若為1則表示自記憶體讀出的值可傳入Z排線上傳回;此值與以上的容許寫回值不能同時為1,以免造成錯誤。
6.5.1 連接記憶體模組 加入記憶體之後,新微指令架構: 加入記憶體之後,指令控制的位元串 5 1 32 4 2 XA YA ZA rew 6.5.1 連接記憶體模組 加入記憶體之後,新微指令架構: XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st msel r/ŵ st_en ld_en 5 1 32 4 2 加入記憶體之後,指令控制的位元串
6.5.1 連接記憶體模組 實例一:將資料寫入給定位址的記憶體空間 6.5.1 連接記憶體模組 實例一:將資料寫入給定位址的記憶體空間 lw R1, R2 這是最基本的載入指令,它會將暫存器R2中的值當成要讀取的記憶體位址,透過X輸入排線傳給記憶體去讀取該位址中的值;而所傳回的值則存入暫存器R1之中。 XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st msel r/ŵ st_en ld_en 2 X 1 xxxx x xx
6.5.1 連接記憶體模組 實例二:無條件跳躍 jp R1 基本上這個指令並不真正涉及到記憶體的存取,而只是去改變下一個要擷取的指令位址,也就是改變PC的值。 XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st msel r/ŵ st_en ld_en 1 X 31 1110 x xx
6.5.1 連接記憶體模組 實例三:提供變數位址的組合算術 以指令集中的指令將上式展開,可得: 6.5.1 連接記憶體模組 實例三:提供變數位址的組合算術 M[R1]=(M[R2]+R3+M[R4])*3 – M[R5] 以指令集中的指令將上式展開,可得: ld R6, R2 ;R6=M[R2] add R6, R6, R3 ;R6= M[R2]+R3 ld R7, R4 ;R7=M[R4] add R6, R6, R7 ;R6= M[R2]+R3+M[R4] add R8, R6, 0 ;R8= M[R2]+R3+M[R4] ash R8, 1, 0 ;R8= (M[R2]+R3+M[R4])*2 add R8, R6, R8 ;R8= (M[R2]+R3+M[R4])*3 ld R9, R5 ;R9=M[R5] sub R10, R8, R9 ;R10=(M[R2]+R3+M[R4])*3 – M[R5] stw R10, R1 ;M[R1]=(M[R2]+R3+M[R4])*3 – M[R5]
6.5.1 連接記憶體模組 實例三:提供變數位址的組合算術 XA YA ZA rew imm_en im_va a/su_en ā/s 6.5.1 連接記憶體模組 實例三:提供變數位址的組合算術 XA YA ZA rew imm_en im_va a/su_en ā/s lu_en LF su_en sd st msel r/ŵ st_en ld_en 2 X 6 1 xxxx x xx 3 4 7 8 01 5 9 10
6.5 更完整的資料路徑設計 連接記憶體模組 包含指令擷取階段的資料路徑
加上針對PC的運算之後,便可完整地實現所定義的指令集 6.5.2 包含指令擷取階段的資料路徑 指令也是資料的一部分,因此可以利用資料路徑來計算所在位址,以維持正確的執行流程。 加上針對PC的運算之後,便可完整地實現所定義的指令集