一個非常簡單的CPU的設(shè)計_第1頁
一個非常簡單的CPU的設(shè)計_第2頁
一個非常簡單的CPU的設(shè)計_第3頁
一個非常簡單的CPU的設(shè)計_第4頁
一個非常簡單的CPU的設(shè)計_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、一個非常簡單的cpu的設(shè)計 1、組合邏輯控制器、組合邏輯控制器 2、微程序控制器、微程序控制器 1. cpu定義定義 我們按照應(yīng)用的需求來定義計算我們按照應(yīng)用的需求來定義計算 機,本文介紹一個非常簡單的機,本文介紹一個非常簡單的cpu的的 設(shè)計,它僅僅用來教學(xué)使用的。我們設(shè)計,它僅僅用來教學(xué)使用的。我們 規(guī)定它可以存取的存儲器為規(guī)定它可以存取的存儲器為64byte, 其中其中1byte=8bits。所以這個。所以這個cpu就有就有 6位的地址線位的地址線a5:0,和,和8位的數(shù)據(jù)線位的數(shù)據(jù)線 d7:0。 我們僅定義一個通用寄存器我們僅定義一個通用寄存器ac(8bits寄存器),寄存器), 它僅

2、僅執(zhí)行它僅僅執(zhí)行4條指令如下:條指令如下: instructioninstruction codeoperation add00aaaaaaac ac+maaaaaa and01aaaaaaac acmaaaaaa jmp10aaaaaagoto aaaaaa inc11xxxxxxacac+1 除了寄存器除了寄存器ac外,我們還需要外,我們還需要 以下幾個寄存器:以下幾個寄存器: 地址寄存器地址寄存器 a5:0, 保存保存6位地址。位地址。 程序計數(shù)器程序計數(shù)器 pc5:0,保存下一條,保存下一條 指令的地址。指令的地址。 數(shù)據(jù)寄存器數(shù)據(jù)寄存器 d7:0,接受指令和存,接受指令和存 儲器來的

3、數(shù)據(jù)。儲器來的數(shù)據(jù)。 指令寄存器指令寄存器 ir1:0,存儲指令操作,存儲指令操作 碼。碼。 2 .取指設(shè)計取指設(shè)計 在處理器執(zhí)行指令之前,必須從存儲器取出在處理器執(zhí)行指令之前,必須從存儲器取出 指令。其中取指執(zhí)行以下操作:指令。其中取指執(zhí)行以下操作: 1. 通過地址端口通過地址端口a5:0從地址到存儲器從地址到存儲器 2. 等待存儲器準(zhǔn)備好數(shù)據(jù)后,讀入數(shù)據(jù)。等待存儲器準(zhǔn)備好數(shù)據(jù)后,讀入數(shù)據(jù)。 由于地址端口數(shù)據(jù)由于地址端口數(shù)據(jù)a5:0是從地址寄存器中是從地址寄存器中 讀出的,所以取指第一個執(zhí)行的狀態(tài)是讀出的,所以取指第一個執(zhí)行的狀態(tài)是 fetch1: arpc 接下來接下來cpu發(fā)出發(fā)出rea

4、d信號,并把數(shù)據(jù)從存儲信號,并把數(shù)據(jù)從存儲 器器m中讀入數(shù)據(jù)寄存器中讀入數(shù)據(jù)寄存器dr中。同時中。同時pc加一。加一。 fetch2: drm,pcpc+1 接下來把接下來把dr7:6送送ir,把,把dr5:0送送ar fetch3: irdr7:6,ardr5:0 3.指令譯碼指令譯碼 cpu在取指后進行譯碼后才知在取指后進行譯碼后才知 道執(zhí)行什么指令,對于本文中的道執(zhí)行什么指令,對于本文中的 cpu來說只有來說只有4條指令也就是只有條指令也就是只有 4個執(zhí)行例程,狀態(tài)圖如下:個執(zhí)行例程,狀態(tài)圖如下: 4. 指令執(zhí)行指令執(zhí)行 對譯碼中調(diào)用的對譯碼中調(diào)用的4個例程我們分別討論:個例程我們分別討

5、論: 4.1 add指令指令 add指令需要指令需要cpu做以下兩件事情:做以下兩件事情: 1. 從存儲器取一個操作數(shù)從存儲器取一個操作數(shù) 2. 把這個操作數(shù)加到把這個操作數(shù)加到ac上,并把結(jié)果存到上,并把結(jié)果存到 ac,所以需要以下操作:所以需要以下操作: add1: drm add2: acac+dr 4.2 and指令指令 and指令執(zhí)行過程和指令執(zhí)行過程和add相似,需要以下操作:相似,需要以下操作: and1: drm and2: acacdr 4.3 jmp指令指令 jmp指令把指令把cpu要跳轉(zhuǎn)的指令地址送要跳轉(zhuǎn)的指令地址送pc,執(zhí)行,執(zhí)行 以下操作以下操作: jmp1: pcd

6、r5:0 4.4inc指令指令 inc指令執(zhí)行指令執(zhí)行ac+1操作操作: inc1:acac+1 5. 建立數(shù)據(jù)路徑建立數(shù)據(jù)路徑 這一步我們來實現(xiàn)狀態(tài)圖和相應(yīng)的寄存器傳輸。這一步我們來實現(xiàn)狀態(tài)圖和相應(yīng)的寄存器傳輸。 首先看下面的狀態(tài)及對應(yīng)的寄存器傳輸:首先看下面的狀態(tài)及對應(yīng)的寄存器傳輸: fetch1: arpc fetch2: drm,pcpc+1 fetch3: irdr7:6,ardr5:0 add1:drm add2:acac+dr and1:drm and2:acacdr jmp1:pcdr5:0 inc1:acac+1 為了設(shè)計數(shù)據(jù)路徑,我們可以采用為了設(shè)計數(shù)據(jù)路徑,我們可以采用

7、兩種辦法:兩種辦法: 1. 創(chuàng)造直接的兩個要傳輸組件之間的直接路創(chuàng)造直接的兩個要傳輸組件之間的直接路 徑徑 2. 在在cpu內(nèi)部創(chuàng)造總線來傳輸不同組件之間內(nèi)部創(chuàng)造總線來傳輸不同組件之間 的數(shù)據(jù)的數(shù)據(jù) 首先我們回顧一下可能發(fā)生的數(shù)據(jù)傳輸,首先我們回顧一下可能發(fā)生的數(shù)據(jù)傳輸, 以便確定各個組件的功能。特別的我們要以便確定各個組件的功能。特別的我們要 注意把數(shù)據(jù)載入組件的各個操作。首先我注意把數(shù)據(jù)載入組件的各個操作。首先我 們按照他們改變了那個寄存器的數(shù)據(jù)來重們按照他們改變了那個寄存器的數(shù)據(jù)來重 組這些操作。得到如下的結(jié)果:組這些操作。得到如下的結(jié)果: ar:arpc;ardr5:0 pc:pcpc

8、+1;pcdr5:0 dr:drm ir:irdr7:6 ac:acac+dr;acacdr; acac+1 現(xiàn)在我們來看每個操作來決定每個組件執(zhí)現(xiàn)在我們來看每個操作來決定每個組件執(zhí) 行什么樣的功能,行什么樣的功能,ar,dr,ir三個組件經(jīng)常三個組件經(jīng)常 從其他的組件載入數(shù)據(jù)(從總線),所以只從其他的組件載入數(shù)據(jù)(從總線),所以只 需要執(zhí)行一個并行輸入的操作。需要執(zhí)行一個并行輸入的操作。pc和和ac能夠能夠 載入數(shù)據(jù)同時也能夠自動加一操作。下一步載入數(shù)據(jù)同時也能夠自動加一操作。下一步 我們把這些組件連接到總線上來,如圖所示:我們把這些組件連接到總線上來,如圖所示: 如上圖所示,各個組件與總?cè)?/p>

9、上圖所示,各個組件與總 線之間通過三態(tài)連接,防止出現(xiàn)總線之間通過三態(tài)連接,防止出現(xiàn)總 線競爭。線競爭。ar寄存器送出存儲器的寄存器送出存儲器的 地址,地址,dr寄存器用于暫存存數(shù)起寄存器用于暫存存數(shù)起 來的數(shù)據(jù)。到現(xiàn)在為止我們還沒有來的數(shù)據(jù)。到現(xiàn)在為止我們還沒有 討論有關(guān)的控制信號,我們現(xiàn)在只討論有關(guān)的控制信號,我們現(xiàn)在只 是保證了所有的數(shù)據(jù)傳輸能夠產(chǎn)生,是保證了所有的數(shù)據(jù)傳輸能夠產(chǎn)生, 我們將在后面章節(jié)來使這些數(shù)據(jù)傳我們將在后面章節(jié)來使這些數(shù)據(jù)傳 輸正確的產(chǎn)生輸正確的產(chǎn)生-控制邏輯??刂七壿嫛?現(xiàn)在我們來看以下者寫數(shù)據(jù)傳輸中有現(xiàn)在我們來看以下者寫數(shù)據(jù)傳輸中有 沒有不必要的傳輸:沒有不必要的傳

10、輸: 1. ar僅僅提供數(shù)據(jù)給存儲器,所以他不需要連接僅僅提供數(shù)據(jù)給存儲器,所以他不需要連接 到總線上。到總線上。 2. ir不通過總線提供數(shù)據(jù)給任何組件,所以他可不通過總線提供數(shù)據(jù)給任何組件,所以他可 以直接輸出到控制單元。以直接輸出到控制單元。 3. ac不提供數(shù)據(jù)到任何的組件,可以不連接到總不提供數(shù)據(jù)到任何的組件,可以不連接到總 線上。線上。 4. 總線是總線是8bit寬度的,但是有些傳輸是寬度的,但是有些傳輸是6bit或者或者 2bit的,我們必須制定寄存器的那幾位送到總的,我們必須制定寄存器的那幾位送到總 線的那幾位。線的那幾位。 5. ac要可以載入要可以載入ac和和dr的和或者邏

11、輯與的值,的和或者邏輯與的值, 數(shù)據(jù)路徑中還需要進行運算的數(shù)據(jù)路徑中還需要進行運算的alu。 由此我們做以下工作:由此我們做以下工作: 1.去掉去掉ar,ir, ac與總線的連接。與總線的連接。 2.我們約定寄存器連接是從總線的低位我們約定寄存器連接是從總線的低位 開始的。開始的。ar,pc連接到連接到bus5:0, 由于由于ir是接受是接受dr7:6的,所以可以的,所以可以 連接到總線的連接到總線的bus7:6。 3.我們設(shè)定,我們設(shè)定,ac作為作為alu的一個輸入,的一個輸入, 另一個輸入來自總線另一個輸入來自總線bus。 下面我們檢查是否有爭用總線的情下面我們檢查是否有爭用總線的情 況,

12、幸運的是這里沒有。修改后的況,幸運的是這里沒有。修改后的 cpu內(nèi)部組織圖如下:內(nèi)部組織圖如下: 6. alu設(shè)計設(shè)計 這個這個cpu的的alu執(zhí)行的功能就是兩個操作數(shù)相執(zhí)行的功能就是兩個操作數(shù)相 加、邏輯與。這里不作詳細(xì)介紹。電路如如下:加、邏輯與。這里不作詳細(xì)介紹。電路如如下: 7. 控制單元控制單元 現(xiàn)在我們來考慮如何產(chǎn)生數(shù)據(jù)路徑所需的現(xiàn)在我們來考慮如何產(chǎn)生數(shù)據(jù)路徑所需的 控制信號,有兩種方法:控制信號,有兩種方法:硬布線邏輯硬布線邏輯和和微程微程 序控制序控制。這里我們用硬布線邏輯來實現(xiàn)。這里我們用硬布線邏輯來實現(xiàn)。 這個簡單的這個簡單的cpu需要的控制邏輯由三個需要的控制邏輯由三個

13、部件組成:部件組成: 1. 計數(shù)器:計數(shù)器: 用于保存現(xiàn)在的狀態(tài)用于保存現(xiàn)在的狀態(tài) 2. 譯碼器:譯碼器: 生成各個狀態(tài)的控制信號生成各個狀態(tài)的控制信號 3. 其他的組合邏輯來產(chǎn)生控制信號其他的組合邏輯來產(chǎn)生控制信號 一個通用的控制單元原理圖如下:一個通用的控制單元原理圖如下: 對于這個對于這個cpu來說,一共有來說,一共有9個狀態(tài)。個狀態(tài)。 所以需要一個所以需要一個4bit的計數(shù)器和一個的計數(shù)器和一個4-16的譯碼器。的譯碼器。 接下來的工作就是按照前面的狀態(tài)轉(zhuǎn)換圖來對狀接下來的工作就是按照前面的狀態(tài)轉(zhuǎn)換圖來對狀 態(tài)進行賦值。態(tài)進行賦值。 首先考慮如何的對譯碼輸出狀態(tài)進行賦值才首先考慮如何的

14、對譯碼輸出狀態(tài)進行賦值才 能達(dá)到最佳狀態(tài)。我們按照以下規(guī)則:能達(dá)到最佳狀態(tài)。我們按照以下規(guī)則: 1給給fetch1賦計數(shù)器的賦計數(shù)器的0值,并用計數(shù)器的清零值,并用計數(shù)器的清零 端來達(dá)到這個狀態(tài)。由這個端來達(dá)到這個狀態(tài)。由這個cpu的狀態(tài)圖可以看的狀態(tài)圖可以看 出,除了出,除了fetch1狀態(tài)外的其他狀態(tài)都只能由一狀態(tài)外的其他狀態(tài)都只能由一 個狀態(tài)轉(zhuǎn)化而來,個狀態(tài)轉(zhuǎn)化而來,fetch1需要從需要從4個分支而來,個分支而來, 這這4個分支就可以發(fā)出清零信號(個分支就可以發(fā)出清零信號(clr)來轉(zhuǎn)移)來轉(zhuǎn)移 到到fetch1。如圖如圖 2把連續(xù)的狀態(tài)賦連續(xù)的計數(shù)器值,這樣把連續(xù)的狀態(tài)賦連續(xù)的計數(shù)器

15、值,這樣 就可以用計數(shù)器的就可以用計數(shù)器的inc輸入來達(dá)到狀態(tài)的轉(zhuǎn)輸入來達(dá)到狀態(tài)的轉(zhuǎn) 移。移。 3給每個例程的開始狀態(tài)賦值時,要基于給每個例程的開始狀態(tài)賦值時,要基于 指令的操作碼和這個例程的最大狀態(tài)數(shù)。指令的操作碼和這個例程的最大狀態(tài)數(shù)。 這樣就可以用操作碼來生成計數(shù)器的這樣就可以用操作碼來生成計數(shù)器的ld信信 號達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先,在號達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先,在fetch3 狀態(tài)發(fā)出狀態(tài)發(fā)出ld信號,然后要把正確的例程地信號,然后要把正確的例程地 址放到計數(shù)器的輸入端。對這個址放到計數(shù)器的輸入端。對這個cpu來說,來說, 我們考慮以地址我們考慮以地址1 ir 0作為計數(shù)器的預(yù)置作為

16、計數(shù)器的預(yù)置 輸入。則得到狀態(tài)編碼如下:輸入。則得到狀態(tài)編碼如下: 這樣就可以用操作碼來生成計數(shù)器的這樣就可以用操作碼來生成計數(shù)器的 ld信號達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先,信號達(dá)到正確的狀態(tài)轉(zhuǎn)移。首先, 在在fetch3狀態(tài)發(fā)出狀態(tài)發(fā)出ld信號,然后要把信號,然后要把 正確的例程地址放到計數(shù)器的輸入端。正確的例程地址放到計數(shù)器的輸入端。 對這個對這個cpu來說,我們考慮以地址來說,我們考慮以地址1 ir 0作為計數(shù)器的預(yù)置輸入。則得到作為計數(shù)器的預(yù)置輸入。則得到 狀態(tài)編碼如下:狀態(tài)編碼如下: instructionstateircounter fetchfetch10000 fetch20001

17、fetch30010 addadd1001000 add2001001 andand1011010 and2011011 incinc1101100 jmpjmp1111110 如上表所示,下面我們需如上表所示,下面我們需 要設(shè)計產(chǎn)生計數(shù)器的要設(shè)計產(chǎn)生計數(shù)器的ld、inc、 clr等信號,總的控制單元的等信號,總的控制單元的 邏輯如下圖:邏輯如下圖: 下面我們用這些譯碼信號來產(chǎn)生數(shù)據(jù)路徑控下面我們用這些譯碼信號來產(chǎn)生數(shù)據(jù)路徑控 制所必需的制所必需的ar、pc、dr、ir、m和和alu的的 控制信號。首先考慮寄存器控制信號。首先考慮寄存器ar,他在,他在fetch1 狀態(tài)取狀態(tài)取pc的值,并在的

18、值,并在fetch3狀態(tài)取狀態(tài)取dr5:0 的值,所以我們得到的值,所以我們得到 arload=fetch1 or fetch3。 以此類推我們可以得到如下結(jié)果:以此類推我們可以得到如下結(jié)果: pcload=jmp1 pcinc=fetch2 drload=fetch1 or add1 or and1 acload=add2 or and2 irload=fetch3 對于對于alu的控制信號的控制信號alusel是是 用來控制用來控制alu做邏輯或者算數(shù)運算的,做邏輯或者算數(shù)運算的, 所以有:所以有: alusel=and2 對于片內(nèi)總線的控制較為復(fù)雜,對于片內(nèi)總線的控制較為復(fù)雜, 我們先來

19、看我們先來看dr,對于,對于dr他只在他只在fetch3、 and2 、add2和和jmp1狀態(tài)占用總線進狀態(tài)占用總線進 行相信的數(shù)據(jù)傳輸,所以有:行相信的數(shù)據(jù)傳輸,所以有: drbus=fetch3 or and2 or add2 or jmp1 其他類似有:其他類似有: membus=fetch2 or add1 or and1 pcbus=fetch1 最后,控制單元需要產(chǎn)生存儲器最后,控制單元需要產(chǎn)生存儲器 的讀信號(的讀信號(read),它發(fā)生在),它發(fā)生在 fetch2、add1、and1三個狀態(tài):三個狀態(tài): read=fetch2 or add1 or and1 這樣我們得到了總

20、的控制邏輯,這樣我們得到了總的控制邏輯, 完成了整個完成了整個cpu的設(shè)計。的設(shè)計。 8設(shè)計驗證設(shè)計驗證 我們執(zhí)行如下指令進行設(shè)計驗證,我們執(zhí)行如下指令進行設(shè)計驗證, 0: add 4 1: and 5 2: inc 3: jmp 0 4: 27h 5: 39h 指令執(zhí)行過程如下(初始化所有寄存器指令執(zhí)行過程如下(初始化所有寄存器 為全零態(tài)):為全零態(tài)): instructionstateactive signalsoperationsnext state add 4fetch1pcbus、 arload ar0fetch2 fetch2read、 membus drload、 pcinc d

21、r04h pcpc+1 fetch3 fetch3drbus、 arload irload ir00 ar04h add1 add1read、 membus drload dr27hadd2 add2drbus、 acload ac0+27hfetch1 and 5fetch1 fetch2 fetch3 add1 add2 incfetch1 fetch2 fetch3 inc1 jmp 0fetch1 fetch2 fetch3 jmp1 1基本的微程序設(shè)計基本的微程序設(shè)計 當(dāng)我們設(shè)計一個當(dāng)我們設(shè)計一個cpu的控制單元的時候我的控制單元的時候我 們往往是先給出一個們往往是先給出一個cpu的

22、狀態(tài)圖,然后的狀態(tài)圖,然后 設(shè)計一個有限狀態(tài)機。硬布線邏輯是根據(jù)設(shè)計一個有限狀態(tài)機。硬布線邏輯是根據(jù) cpu的現(xiàn)態(tài)和輸入(包括操作碼和標(biāo)志寄的現(xiàn)態(tài)和輸入(包括操作碼和標(biāo)志寄 存器的內(nèi)容)來進行狀態(tài)轉(zhuǎn)移,同時輸出存器的內(nèi)容)來進行狀態(tài)轉(zhuǎn)移,同時輸出 數(shù)據(jù)路徑個組件的控制信號。數(shù)據(jù)路徑個組件的控制信號。 1.1微序列操作微序列操作 一個微一個微程序程序控制器也是一個有限狀態(tài)機,控制器也是一個有限狀態(tài)機, 一個通用的微一個通用的微程序程序控制器如下圖:控制器如下圖: 說明:說明: 1. 圖中寄存器用來存儲圖中寄存器用來存儲cpu狀態(tài)圖中的一個狀態(tài)圖中的一個 狀態(tài),把它作為微代碼存儲器的地址訪問狀態(tài),

23、把它作為微代碼存儲器的地址訪問 微代碼存儲器。微代碼存儲器。 2. 微代碼存儲器輸出微指令,可以分成兩個微代碼存儲器輸出微指令,可以分成兩個 部分:一個部分是微操作,這些信號被輸部分:一個部分是微操作,這些信號被輸 出到出到cpu的其他部分用以產(chǎn)生的其他部分用以產(chǎn)生cpu數(shù)據(jù)數(shù)據(jù) 路徑中的控制信號。另一部分被用來產(chǎn)生路徑中的控制信號。另一部分被用來產(chǎn)生 下一個訪問微代碼存儲器的地址。這一部下一個訪問微代碼存儲器的地址。這一部 分加上操作碼、標(biāo)志寄存器以及分加上操作碼、標(biāo)志寄存器以及cpu現(xiàn)在現(xiàn)在 的狀態(tài)(也就是的狀態(tài)(也就是register中的內(nèi)容)一起中的內(nèi)容)一起 產(chǎn)生下一次訪問微代碼存儲

24、器的地址。產(chǎn)生下一次訪問微代碼存儲器的地址。 3. 下一個地址產(chǎn)生單元接受操作碼、標(biāo)下一個地址產(chǎn)生單元接受操作碼、標(biāo) 志寄存器內(nèi)容和微代碼存儲器的輸出,志寄存器內(nèi)容和微代碼存儲器的輸出, 然后根據(jù)現(xiàn)在然后根據(jù)現(xiàn)在cpu所處的狀態(tài)決定產(chǎn)所處的狀態(tài)決定產(chǎn) 生下一次訪問微代碼存儲器的地址。生下一次訪問微代碼存儲器的地址。 它生成所有可能的轉(zhuǎn)移地址,然后選它生成所有可能的轉(zhuǎn)移地址,然后選 擇正確的輸出到寄存器中。擇正確的輸出到寄存器中。 一個可能的地址就是微代碼存儲器現(xiàn)一個可能的地址就是微代碼存儲器現(xiàn) 在地址加一。在地址加一。 另一個可能的地址是要跳轉(zhuǎn)的絕對地另一個可能的地址是要跳轉(zhuǎn)的絕對地 址。址。

25、 每個微程序控制其還需要能夠正確地每個微程序控制其還需要能夠正確地 訪問執(zhí)行例程,這就需要用到影射邏訪問執(zhí)行例程,這就需要用到影射邏 輯。把取指得到的操作碼影射到執(zhí)行輯。把取指得到的操作碼影射到執(zhí)行 子例程的第一條微指令的地址上。這子例程的第一條微指令的地址上。這 個影射操作時在每個取指周期結(jié)束時個影射操作時在每個取指周期結(jié)束時 進行的。進行的。 像所有高級語言編程一樣,微代碼也像所有高級語言編程一樣,微代碼也 可以有子程序。當(dāng)幾條指令執(zhí)行同一可以有子程序。當(dāng)幾條指令執(zhí)行同一 段微代碼時,這段微代碼就可以用一段微代碼時,這段微代碼就可以用一 個子程序來實現(xiàn)。當(dāng)調(diào)用此子程序時,個子程序來實現(xiàn)。當(dāng)

26、調(diào)用此子程序時, 這個子程序的微代碼地址就被作為一這個子程序的微代碼地址就被作為一 個跳轉(zhuǎn)的絕對地址賦給寄存器,而當(dāng)個跳轉(zhuǎn)的絕對地址賦給寄存器,而當(dāng) 前地址加一的地址則被保存為返回地前地址加一的地址則被保存為返回地 址。(需要硬件的寄存器或者堆棧來址。(需要硬件的寄存器或者堆棧來 實現(xiàn))實現(xiàn)) 4.一個微程序控制器最基本的四個部分就是:一個微程序控制器最基本的四個部分就是: 現(xiàn)在地址加一現(xiàn)在地址加一 絕對地址絕對地址 影射邏輯地址影射邏輯地址 子例程返回地址子例程返回地址 1.2微指令格式微指令格式 每個微程序控制器可以有它自己的微指令格式。每個微程序控制器可以有它自己的微指令格式。 但是每條

27、微指令必須包含以下幾個部分的內(nèi)容:但是每條微指令必須包含以下幾個部分的內(nèi)容: 下面我們分別介紹這幾個部分的內(nèi)容:下面我們分別介紹這幾個部分的內(nèi)容: 1. select域域 select域用于指名下條指令地址的來源。它僅僅域用于指名下條指令地址的來源。它僅僅 是指名下條指令地址的來源,而不直接給出下條指令是指名下條指令地址的來源,而不直接給出下條指令 的地址。例如:取指例程最后一條指令時,它的的地址。例如:取指例程最后一條指令時,它的 select域會指名下一條地址將來自影射邏輯。域會指名下一條地址將來自影射邏輯。 對于條件轉(zhuǎn)移指令,執(zhí)行子例程的執(zhí)行需要根據(jù)標(biāo)對于條件轉(zhuǎn)移指令,執(zhí)行子例程的執(zhí)行需

28、要根據(jù)標(biāo) 志為的判斷來進行。對于這樣的指令志為的判斷來進行。對于這樣的指令select域要有域要有 相應(yīng)的標(biāo)志寄存器的選擇。然后根據(jù)所選擇的標(biāo)志寄相應(yīng)的標(biāo)志寄存器的選擇。然后根據(jù)所選擇的標(biāo)志寄 存器以及存器以及select域的內(nèi)容來決定下一地址的來源。域的內(nèi)容來決定下一地址的來源。 2. addr域域 addr域就是來指名下一條指令執(zhí)行的絕對地址的。域就是來指名下一條指令執(zhí)行的絕對地址的。 例如當(dāng)執(zhí)行完一個例程需要進入取指例程時,對指明例如當(dāng)執(zhí)行完一個例程需要進入取指例程時,對指明 了下一個地址來源的微指令來說,了下一個地址來源的微指令來說,addr域是無用的。域是無用的。 例如:影射邏輯地址

29、。例如:影射邏輯地址。 3.micor-operation域域 micro-operation域用來描述要域用來描述要 執(zhí)行的微操作,有三種描述方法:執(zhí)行的微操作,有三種描述方法: 3.1水平微代碼水平微代碼 為了實現(xiàn)水平微代碼,我們先列為了實現(xiàn)水平微代碼,我們先列 出出cpu執(zhí)行的所有微操作。然后我們執(zhí)行的所有微操作。然后我們 給每個微操作賦給每個微操作賦micro-operation 域中的域中的1bit。這將導(dǎo)致。這將導(dǎo)致micro- operation域的位數(shù)很多。而且這域的位數(shù)很多。而且這 種編碼方法將使很多的種編碼方法將使很多的micro- operation域中的位在大多數(shù)時間域

30、中的位在大多數(shù)時間 無用。無用。 3.2垂直微代碼垂直微代碼 為了實現(xiàn)垂直微代碼,為了實現(xiàn)垂直微代碼,cpu可以執(zhí)行可以執(zhí)行 的微操作被分組,然后每個微操作被賦予的微操作被分組,然后每個微操作被賦予 一個組合的二進制數(shù),例如:一個組合的二進制數(shù),例如:16個微操作個微操作 可以用可以用4bit的的micro-operation域來描域來描 述(述(00001111)。事實上我們用)。事實上我們用4bit只能只能 表示表示15個微操作,因為我們必須空出一個個微操作,因為我們必須空出一個 狀態(tài)來描述空操作。垂直微代碼的編碼方狀態(tài)來描述空操作。垂直微代碼的編碼方 式需要很少的式需要很少的micro-

31、operation域的位域的位 數(shù),但是它需要一個譯碼器來產(chǎn)生真正的數(shù),但是它需要一個譯碼器來產(chǎn)生真正的 微操作信號。微操作信號。 3.3直接生成控制信號直接生成控制信號 在以上兩種方法中,在以上兩種方法中,cpu都必須都必須 要把微操作信號轉(zhuǎn)換成控制信號來進要把微操作信號轉(zhuǎn)換成控制信號來進 行數(shù)據(jù)路徑的載入(行數(shù)據(jù)路徑的載入(load)、清零)、清零 (clr)、加一()、加一(inc)、)、alu控制以控制以 及總線上各個及總線上各個buffers的開關(guān)等操作。的開關(guān)等操作。 第三種微代碼的編碼方法就是把控制第三種微代碼的編碼方法就是把控制 信號直接存儲到微指令中,這種方法信號直接存儲到微

32、指令中,這種方法 不需要另外的組合邏輯,但是它可讀不需要另外的組合邏輯,但是它可讀 性差,不宜于調(diào)試。性差,不宜于調(diào)試。 2、設(shè)計和實現(xiàn)、設(shè)計和實現(xiàn)a very simple cpu的微的微 程序控制單元程序控制單元 為了驗證一個微程序控制器的設(shè)計過程,我們首為了驗證一個微程序控制器的設(shè)計過程,我們首 先來考慮前一章中的先來考慮前一章中的very simple cpu的控制單的控制單 元的設(shè)計。本節(jié)將用微程序控制器重新設(shè)計其控元的設(shè)計。本節(jié)將用微程序控制器重新設(shè)計其控 制單元。我們將不在重新講述指令集、有限狀態(tài)制單元。我們將不在重新講述指令集、有限狀態(tài) 機、數(shù)據(jù)路徑以及機、數(shù)據(jù)路徑以及alu的

33、設(shè)計。我們只講述控制的設(shè)計。我們只講述控制 信號的產(chǎn)生過程。信號的產(chǎn)生過程。 2.1基本流程基本流程 這個這個very simple cpu的微程序控制器的基的微程序控制器的基 本框圖如下:本框圖如下: 在這個在這個very simple cpu中只有兩種可能的地中只有兩種可能的地 址,一個是操作碼影射地址另一個是絕對跳轉(zhuǎn)址,一個是操作碼影射地址另一個是絕對跳轉(zhuǎn) 地址。參看前面的地址。參看前面的very simple cpu的狀態(tài)圖,的狀態(tài)圖, 我們可以知道:我們可以知道: 1. 從從fetch3到執(zhí)行子例程需要一個地址影射邏輯,到執(zhí)行子例程需要一個地址影射邏輯, 影射到要執(zhí)行指令的地址處。影

34、射到要執(zhí)行指令的地址處。 2. 地址加一可以用地址加一可以用microde memory 產(chǎn)生產(chǎn)生addr 作為絕對地址跳轉(zhuǎn)實現(xiàn),每個執(zhí)行子例程結(jié)束作為絕對地址跳轉(zhuǎn)實現(xiàn),每個執(zhí)行子例程結(jié)束 后還需要一個地址跳轉(zhuǎn)回到取指后還需要一個地址跳轉(zhuǎn)回到取指fetch1微操作。微操作。 因為有兩種地址輸入,所以可以用一個因為有兩種地址輸入,所以可以用一個 2選選1邏輯邏輯 來實現(xiàn)下一地址生成模塊。選擇控來實現(xiàn)下一地址生成模塊。選擇控 制信號是由微代碼存儲器產(chǎn)生的。制信號是由微代碼存儲器產(chǎn)生的。 接下來我們考慮用多少位來表示接下來我們考慮用多少位來表示microde memory(控制存儲器控制存儲器)輸出

35、的絕對地址?輸出的絕對地址? 這個這個cpu一共有一共有9個狀態(tài),每個狀態(tài)用一個個狀態(tài),每個狀態(tài)用一個 微指令表示。需要的最少的數(shù)據(jù)位數(shù)是微指令表示。需要的最少的數(shù)據(jù)位數(shù)是4位。位。 而而ir譯碼后的影射邏輯地址也是譯碼后的影射邏輯地址也是4bit,所以,所以 用用4bit來表示地址。來表示地址。 2.2生成微程序并且設(shè)計影射邏輯生成微程序并且設(shè)計影射邏輯 現(xiàn)在我們通過有限狀態(tài)機的狀態(tài)來設(shè)計微代碼現(xiàn)在我們通過有限狀態(tài)機的狀態(tài)來設(shè)計微代碼 序列。首先我們給每個狀態(tài)賦予一個微代碼的地序列。首先我們給每個狀態(tài)賦予一個微代碼的地 址。與硬布線邏輯不同的是,它不是必須直接的址。與硬布線邏輯不同的是,它不

36、是必須直接的 把連續(xù)的地址賦給取指或者執(zhí)行的各個狀態(tài),然把連續(xù)的地址賦給取指或者執(zhí)行的各個狀態(tài),然 而那樣賦值能夠使微代碼易于閱讀調(diào)試。賦值中而那樣賦值能夠使微代碼易于閱讀調(diào)試。賦值中 考慮的首要問題是:執(zhí)行子例程的第一個狀態(tài)的考慮的首要問題是:執(zhí)行子例程的第一個狀態(tài)的 地址賦值,因為它決定了影射邏輯的實現(xiàn)。對這地址賦值,因為它決定了影射邏輯的實現(xiàn)。對這 個個cpu來說,我們用和硬布線邏輯實現(xiàn)時同樣的來說,我們用和硬布線邏輯實現(xiàn)時同樣的 影射邏輯,也就是影射邏輯,也就是ir譯碼的影射邏輯是譯碼的影射邏輯是1,ir1: 0,0。這樣產(chǎn)生了。這樣產(chǎn)生了add1、and1、jmp1、 inc1的地址

37、分別為的地址分別為1000、1010、1100、1110。 相應(yīng)的影射邏輯也就可以簡單的如下表示:相應(yīng)的影射邏輯也就可以簡單的如下表示: 其余狀態(tài)的地址賦值如下表:其余狀態(tài)的地址賦值如下表: stateaddressstateaddress fetch10000fetch20001 fetch30010add11000 add21001and11010 and21011jump11100 inc11110 現(xiàn)在我們來通過這些狀態(tài)來建立微代碼序列。現(xiàn)在我們來通過這些狀態(tài)來建立微代碼序列。 為了實現(xiàn)狀態(tài)的轉(zhuǎn)移,為序列控制器在為了實現(xiàn)狀態(tài)的轉(zhuǎn)移,為序列控制器在addr 域提供其要轉(zhuǎn)移狀態(tài)的地址,并且

38、在域提供其要轉(zhuǎn)移狀態(tài)的地址,并且在select 域選擇它。例如:為了從域選擇它。例如:為了從fetch1轉(zhuǎn)移到轉(zhuǎn)移到fetch2 狀態(tài),微程序控制器需要設(shè)定狀態(tài),微程序控制器需要設(shè)定sel=0(選擇(選擇 addr作為輸入,而不是作為輸入,而不是ir影射邏輯),影射邏輯), addr=0001(fetch2的地址)的地址)-也就是微代也就是微代 碼存儲器碼存儲器0000處處addr域的內(nèi)容存儲的是域的內(nèi)容存儲的是0001 這個地址。除了這個地址。除了fetch3狀態(tài)外其他的狀態(tài)都可狀態(tài)外其他的狀態(tài)都可 以這樣得到微代碼存儲器中以這樣得到微代碼存儲器中sel和和addr的值的值 (微操作(微操作

39、uop的值后面再講)。的值后面再講)。fetch3狀態(tài)需狀態(tài)需 要選擇影射邏輯作為訪問微代碼存儲器的地址。要選擇影射邏輯作為訪問微代碼存儲器的地址。 此時此時addr中的值將是無用的,所以可以不用中的值將是無用的,所以可以不用 考慮,而考慮,而sel=1??偟奈⒋a存儲器內(nèi)容如下??偟奈⒋a存儲器內(nèi)容如下 表(除去微操作表(除去微操作uop) stateaddressseladdr fetch1000000001 fetch2000100010 fetch300101xxxx add1100001001 add2100100000 and1101001011 and2101100000 jmp

40、1110000000 inc1111000000 2.3用水平編碼方式設(shè)計微操作 首先我們注意到一個微程序控制器有首先我們注意到一個微程序控制器有 兩個任務(wù):兩個任務(wù): 1. 生成正確的微操作生成正確的微操作 2. 正確的流動狀態(tài)正確的流動狀態(tài) 上面我們已經(jīng)考慮了怎么樣正確的進上面我們已經(jīng)考慮了怎么樣正確的進 行狀態(tài)的流動,下面我們的任務(wù)就是生成行狀態(tài)的流動,下面我們的任務(wù)就是生成 正確的微操作和相關(guān)的控制信號。正確的微操作和相關(guān)的控制信號。 在水平編碼的微代碼方式中,每一個微操在水平編碼的微代碼方式中,每一個微操 作用作用1bit表示。首先我們列出表示。首先我們列出cpu所有的所有的 微操作

41、,然后用助記憶符來進行表示如下:微操作,然后用助記憶符來進行表示如下: 助記符助記符微操作微操作 arpcarpc ardrardr5:0 pcinpcpc+1 pcdrpcdr5:0 drmdrm irdrirdr7:6 plusacac+dr andacacdr acinacac+1 這個這個cpu一共有一共有9個微操作,每個微代個微操作,每個微代 碼字需要碼字需要9bit來表示它們。用來表示它們。用1表示執(zhí)表示執(zhí) 行這個微操作,用行這個微操作,用0表示不執(zhí)行這個微表示不執(zhí)行這個微 操作。我們把這些表示微操作的值填操作。我們把這些表示微操作的值填 入到上面的微代碼存儲器的表格中就入到上面的

42、微代碼存儲器的表格中就 得到了最后的微代碼存儲器的內(nèi)容,得到了最后的微代碼存儲器的內(nèi)容, 如下表:如下表: stateaddressselar pc ar dr pc in pc dr dr m ir dr pl us an d ac in addr fetch1000001000000000001 fetch20001000 10100000010 fetch300101010001000xxxx add1100000000100001001 add2100100000001000000 and1101000000100001011 and2101100000000100000 jmp111

43、0000001000000000 inc1111000000000010000 在生成控制信號之前,我們先來在生成控制信號之前,我們先來 對微代碼存儲器中的微代碼進行優(yōu)對微代碼存儲器中的微代碼進行優(yōu) 化。注意到:對于所有的狀態(tài)來說,化。注意到:對于所有的狀態(tài)來說, ardr和和irdr都與相同的值,所都與相同的值,所 以我們可以用以我們可以用1bit(aidr)來表)來表 示這兩個微操作。得到最后的結(jié)果示這兩個微操作。得到最后的結(jié)果 如下表如下表 stateaddres s selar pc ai dr pc in pc dr dr m pl us an d ac in addr fetch1

44、00000010000000001 fetch20001000 1010000010 fetch30010101000000xxxx add110000000010001001 add210010000001000000 and110100000010001011 and210110000000100000 jmp111000000100000000 inc111100000000010000 最后,我們用這些微操作信號最后,我們用這些微操作信號 來生成數(shù)據(jù)路徑中相應(yīng)的控制信號。來生成數(shù)據(jù)路徑中相應(yīng)的控制信號。 例如,對于寄存器例如,對于寄存器ar來說,來說, arload信號必須在信號必須在

45、arpc和和aidr 兩個微操作有效時有效。于是就把這兩個微操作有效時有效。于是就把這 兩個微操作進行兩個微操作進行or操作產(chǎn)生操作產(chǎn)生 arload信號。其他的控制信號同信號。其他的控制信號同 理可得,最后的控制信號如下表:理可得,最后的控制信號如下表: signalvalue arloadarpc or aidr pcloadpcdr pcincpcin drloaddrm acloadplus or and acinc acin irloadaidr aluseland membusdrm pcbusarpc drbusaidr or pcdr or plus or and readdr

46、m 2.4用垂直編碼方法產(chǎn)生微操作碼用垂直編碼方法產(chǎn)生微操作碼 由于水平編碼方式代碼利用率由于水平編碼方式代碼利用率 太低,所以考慮用垂直編碼方式。太低,所以考慮用垂直編碼方式。 垂直編碼方式的微代碼存儲器輸出垂直編碼方式的微代碼存儲器輸出 的并不是直接的微操作的控制信號的并不是直接的微操作的控制信號 需要進行譯碼,其原理如下圖:需要進行譯碼,其原理如下圖: 現(xiàn)在我們來用垂直編碼的方法來現(xiàn)在我們來用垂直編碼的方法來 設(shè)計這個設(shè)計這個very simple cpu的控制單的控制單 元。我們還是從指令集、狀態(tài)圖、數(shù)元。我們還是從指令集、狀態(tài)圖、數(shù) 據(jù)路徑和據(jù)路徑和alu等開始分析。數(shù)據(jù)路徑等開始分

47、析。數(shù)據(jù)路徑 和硬布線邏輯相同,微程序代碼控制和硬布線邏輯相同,微程序代碼控制 器的影射邏輯、以及微代碼存儲器中器的影射邏輯、以及微代碼存儲器中 的的sel和和addr的內(nèi)容與水平編碼的設(shè)的內(nèi)容與水平編碼的設(shè) 計也相同。我們現(xiàn)在的任務(wù)就是給微計也相同。我們現(xiàn)在的任務(wù)就是給微 操作分配不同的微操作碼。我們按照操作分配不同的微操作碼。我們按照 以下規(guī)則進行:以下規(guī)則進行: 1. 當(dāng)兩個微操作在同各狀態(tài)發(fā)生時,把當(dāng)兩個微操作在同各狀態(tài)發(fā)生時,把 它們分在不同的域。也就是要求每個它們分在不同的域。也就是要求每個 域在一個狀態(tài)只能夠輸出一個值。域在一個狀態(tài)只能夠輸出一個值。 2. 如果需要的話每個域中都

48、可以包含如果需要的話每個域中都可以包含 nop操作。當(dāng)此域中沒有操作要執(zhí)行操作。當(dāng)此域中沒有操作要執(zhí)行 時輸出空操作。時輸出空操作。 3. 把其余的微操作分布到各個域中,盡把其余的微操作分布到各個域中,盡 可能的充分利用每個域能表示的狀態(tài)??赡艿某浞掷妹總€域能表示的狀態(tài)。 各個域的字長可以不同。各個域的字長可以不同。 4. 把在同一個域中修改同一個寄存器的把在同一個域中修改同一個寄存器的 微操作組成一組。因為兩個微操作不微操作組成一組。因為兩個微操作不 能同時修改同一個寄存器。能同時修改同一個寄存器。 首先我們檢查同時進行的微操作首先我們檢查同時進行的微操作 有哪些,注意到有哪些,注意到dr

49、m和和pcin都在都在 fetch2發(fā)生,所以必須被分到兩個不發(fā)生,所以必須被分到兩個不 同的域中。所以這個同的域中。所以這個cpu至少需要兩至少需要兩 個域個域m1和和m2。在每個域中加上。在每個域中加上nop 操作得到:操作得到: m1 m2 nop nop drm pcin 由于由于pcin和和pcdr都修改都修改pc,我,我 們把們把pcdr加到加到m2中。接下來我們把中。接下來我們把 修改同一個寄存器的操作放到同一個修改同一個寄存器的操作放到同一個 域中得到一個狀態(tài)分配方案如下:域中得到一個狀態(tài)分配方案如下: m1m2 nopnop drmpcin acinpcdr plusarpc

50、 andaidr 每個域中有每個域中有5個微操作,所以每個域都個微操作,所以每個域都 需要需要3bit來表示??偣残枰獊肀硎???偣残枰?bit來表示。來表示。 我們對之進行優(yōu)化,可以把我們對之進行優(yōu)化,可以把aidr從從m2 移動到移動到m1中,這樣中,這樣m1可以用可以用3bit表示表示 m2只需要只需要2bit表示了。我們還可以進表示了。我們還可以進 一步的優(yōu)化把一步的優(yōu)化把arpc和和pcdr也從也從m2 移動到移動到m1中,這樣中,這樣m1有有8個狀態(tài),個狀態(tài),m2 有有2個狀態(tài)。所以一共可以用個狀態(tài)。所以一共可以用4bit來表來表 示。最后結(jié)果如下表:示。最后結(jié)果如下表: m1m2 value micro-operationvaluemicro-operation 000nop0nop 001drm1pcin 010arpc 011aidr 100pcdr 101plus 110and 111acin 接下來我們用這些數(shù)值來生成最終的接下來我們用這些數(shù)值來生成最終的 微代碼存儲器的內(nèi)容,結(jié)果如下表:微代碼存儲器的內(nèi)容,結(jié)果如下表: stateaddressselm1m2addr fetch10000000100001 fetch20

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論