基于proteus的一个微程序CPU
基于proteus的一個微程序CPU
- 指令集與CPU架構
- 微程序控制器
- 取指與中斷處理
- 寄存器及IO操作指令
- 存儲器及堆棧操作指令
- 跳轉系列指令
- 算術邏輯運算系列指令
- 參考資料
指令集與CPU架構
本文將設計一個微程序CPU,微程序的原理請參見前述博客基于proteus的CPU控制器設計(微程序版)。設計CPU之初,首先要定義一套較完備的機器指令集,該指令集應滿足用戶所需的全部功能,包括程序結構(順序、循環及分支),算術邏輯運算,IO外設控制等等。
本文所述CPU的指令集如下1所示,指令格式定義如下:指令OP碼為指令第一字節的高四位,即指令寄存器IR的{I7,I6,I5,I4}位。而RA和RB是指由{I3,I2}和{I1,I0}定義的邏輯寄存器,RA或RB都可以選擇四個物理寄存器(R0~R3)中的任何一個。
表1. 微程序CPU指令集
如下圖1所示,微程序CPU由微程序控制器(CONTROLLER)、時序電路(CLOCK)及數據通路組成。數據通路包括:程序存儲器ROM、數據存儲器RAM及通用寄存器R0~R3;IO接口;算術邏輯運算器(74LS181)及附帶移位寄存器(74LS194);程序計數器(PC)、ALU運算結果標志位寄存器(PSW)及其斷點寄存器(BP_PC、BP_PSW)。數據通路的所有部件都共同掛在一條8位系統總線BUS上。
圖1. 微程序CPU電路圖
微程序CPU電路圖1的架構如下圖2所示,圖2右側是時序電路(CLOCK)和微程序控制器(CONTROLLER),左側則是由8位系統總線BUS串聯起來的數據通路,掛在總線BUS上的CPU部件包括:存儲器ROM/RAM及其地址寄存器AR;指令寄存器IR;通用寄存器R0~R3;算術邏輯運算器ALU及其附屬的緩存器DA(兼作移位功能)和DB;外設I/O接口;程序計數器PC及其斷點寄存器(BP_PC);中斷向量地址(IVA)。此外,數據通路還包括右邊的運算結果標志位寄存器(PSW)及其斷點寄存器(BP_PSW)。
圖2. 微程序CPU架構
微程序控制器
微程序CPU的微指令結構如下圖3所示,微指令字長24位,其中1-5位是下一條微指令地址,即下址字段[uA4, uA0];6-8位是判斷字段P1~P3;9-24位則是微命令字段,對應數據通路的所有微操作信號:其中置1的位表示執行相應的微操作;反之,置0的位則是不執行相應的微操作。
圖3. 微指令結構圖
其中,微指令的15-13位和12-10位采用字段編譯法(3-8譯碼),分別對應源部件輸出到總線BUS和總線BUS打入目標部件的微操作信號,如下表2所示:
表2. 微指令字段編譯列表
此外,由于微程序控制器和數據通路相互獨立,兩者操作可以并行執行,微程序CPU的微指令周期只需要T1和T2兩個狀態,微指令狀態機循環輸出節拍序列{T1,T2},使狀態順序轉移:T1→T2→T1→…
表3. 微指令狀態機
如下圖4所示, 24位微指令存儲器MROM1-3共存放了32條微指令,所以微地址是MABUS_4-0。當信號ON或T1節拍上升沿,微地址下址指定的微指令的微命令字段和P字段鎖存到微指令寄存器MDR1~3,輸出微操作信號;而下址字段則送往微地址寄存器。
下圖4中,微指令寄存器MDR2的輸出端采用了兩個3-8譯碼器74LS138進行字段譯碼,分別實現把數據從源部件輸出到總線BUS(譯碼器U8)的微操作和從總線BUS打入目標部件(譯碼器U7)的微操作。因為,在任何一條微指令中僅有一條數據路徑,該路徑中只有一個源部件把數據打入總線BUS,其微操作信號互斥;也只有一個目標部件從總線BUS接收數據,其微操作信號也是互斥,因此,上述兩種微操作信號可以分別用譯碼器實現。
圖4. 微指令存儲器、寄存器及譯碼電路
微程序控制器的微地址轉移電路如下圖5所示,微地址寄存器五位(MA4-MA0),由觸發器74LS74組成。T2時刻,當前微指令1-5位的下一條微指令地址[uA4, uA0]打入微地址寄存器;此刻,若當前執行的微指令中的判斷位P1-P3置位,則地址轉移邏輯電路將根據判斷位P1-P3置位微地址寄存器MA4-MA0,如下圖5所示:P2位生成信號#SET_MA4,P1生成信號#SET_MA3 ~ #SET_MA1,P1和P3位共同生成信號#SET_MA0。判斷位P1~P3的地址跳轉邏輯如下所示(可以對照后面具體指令流程圖中“菱形框”的條件判斷分支過程):
P1邏輯:若當前微指令是機器指令取指周期的最后一條微指令,則判斷位P1=1,從而根據指令寄存器IR的{I7,I6,I5,I4}位強制置位微地址寄存器的MA3-MA0,修改微地址[uA3, uA0]位,轉向該機器指令的執行周期序列的第一條微指令地址[0,I7,I6,I5,I4]。
P2邏輯:若當前微指令是機器指令執行周期的最后一條微指令,則判斷位P2=1;此時,若無中斷發生,則返回取指周期第一條微指令地址[00000];若有中斷發生(INT=1),則強制置位微地址寄存器的MA4,轉向中斷處理過程第一條微指令地址[10000]。
P3邏輯:在CPU指令集中部分單字節指令和雙字節指令(LAD/POP、STO/PUSH、ALU系列和JMP系列指令)共用OP碼,其執行周期的微指令序列共用第一條微指令(判斷位P3=1),從第二條微指令開始分支,根據指令寄存器IR的I1I0位來決定不同微指令的分支走向:若{I1,I0}=00,微指令下址的MA0=0,操作數分別來自寄存器和存儲器(雙字節指令);若{I1,I0}≠00,則微指令下址的MA0=1,操作數全部來自寄存器(單字節指令)。
圖5. 微地址轉移電路
取指與中斷處理
下圖6所示是取指周期、執行周期和中斷處理周期的微程序流程圖,其中每個方框在時間上表示一個微指令周期,包括T1和T2兩個節拍;在空間上表示數據從某個源部件經過總線BUS到達另一個目標部件的路徑。每個方框的右上方是該微指令在控制存儲器中的地址,右下方則是下一條微指令地址。
除了空指令(NOP)和停機指令(HLT)以外,所有的CPU指令都包括了取指周期和執行周期。因為NOP指令OP碼為“0000”,所以取指周期末尾P1(0,I7,I6,I5,I4)譯碼的時候,直接返回取指周期(取下一條指令),沒有執行周期。而HLT指令與NOP指令完全相同,唯一不同是在取指周期后CPU硬件停機,需要手動RESET重啟才能跳出停機狀態,進入下一條指令。此外,外部中斷觸發后,中斷處理周期有專用的微指令使程序轉向中斷子程序。待到中斷子程序末尾,最后一條指令必須是中斷返回指令(IRET),才能返回主程序。
圖6. 取指周期、執行周期和中斷處理周期的微程序流程圖
在上圖6中,NOP指令主要用于精準延時(微程序/硬連線CPU延時4個T,流水線CPU延時1個T);而HLT指令用作程序末尾CPU停機或設置斷點:程序自動運行到HLT指令時刻停機,可以觀察當時CPU寄存器,運算器標志位等信息。IRET指令用于在中斷處理子程序末尾返回主程序(即BP_PC保存的地址彈回PC,BP_PSW保存的標志位信息彈回PSW),因此,不允許在主程序使用IRET指令! 否則將導致程序錯誤跳轉。上述三種單字節指令統稱為系統指令,如下表4所示。
【注:x在指令格式中表示此處的二進制數值可任意為0或1】
表4. 系統指令
此外,微程序CPU的中斷電路采用單級中斷機制,不允許中斷嵌套;同時,CPU采用中斷向量表的形式保存中斷向量Vector(即中斷子程序入口地址)。如下圖7所示,中斷子程序的位置和長度隨意設置,子程序的首地址(即中斷向量Vector)必須放在中斷向量表中。中斷發生時,CPU通過二次尋址跳轉到中斷子程序執行。
圖7. 中斷向量表示意圖
寄存器及IO操作指令
如下表5所示,寄存器操作指令包括單字節的寄存器間數據傳送指令(MOV)和雙字節的寄存器賦值指令(SET)。SET指令的第二字節是賦予寄存器RA的立即數IMM。
例:“0110 0001;” 表示把R1的內容賦值R0;“0011 0000; 0000 0101;”表示把“05H”賦予R0。
表5. 寄存器操作指令
如下表6所示,I/O操作指令包括三條單字節指令:輸入指令(IN)、輸出指令(OUT)及地址選擇指令(OUTA)。OUTA指令的功能是把寄存器的內容作為地址輸出到IO端口的地址選擇電路,選擇所要操作的外部設備。OUT指令選定操作的外設后,CPU可以執行兩種操作指令:IN指令把外設的數據輸入寄存器RA,OUT指令則是把寄存器RA的內容輸出給外設。
【注:IN指令可以選擇{I1,I0}指定的四個輸入端 PORT0-3中的一個; 而OUT/OUTA指令只能選擇I0指定的兩個輸出端PORT0~1中的一個。】
例:“0100 0001;”表示把端口1的輸入數據傳送到R0。
“0101 0001;”表示把R0的內容作為數據,輸出到端口1。
“0101 0011;”則是表示把R0的內容作為地址,輸出到端口1。
表6. I/O操作指令
下圖8是MOV、SET指令和IN、OUT/OUTA指令的微程序流程圖,其中(P1判斷前)取指周期和若有中斷觸發的(P2判斷后)中斷處理周期參見上圖6。此外,OUT和OUTA指令的微指令序列完全相同,由硬件邏輯區分。
圖8. 寄存器及I/O操作指令的微程序流程圖
存儲器及堆棧操作指令
如下表7所示:存儲器操作指令包括兩條雙字節指令:取數指令(LAD)和存數指令(STO)。LAD指令把數據從地址ADDR(指令第二字節)的存儲器單元取出,存入邏輯寄存器RA;而STO指令把邏輯寄存器RA的數據取出,存入地址ADDR(指令第二字節)的存儲器單元。
堆棧操作指令包括兩條單字節指令:出棧指令(POP)和入棧指令(PUSH)。此處提到的“堆棧”是基于存儲器ROM/RAM的軟堆棧,其指針就是邏輯寄存器RB。出棧和入棧指令即是把寄存器RB存放的內容作為存儲器地址,把該地址單元的數據彈出到邏輯寄存器RA(POP指令)或把邏輯寄存器RA的內容彈入到該地址單元(PUSH指令)。
【注:因為LAD和POP指令共用OP碼,STO和PUSH指令也共用OP碼;所以共用OP碼的指令間區別在于{I1,I0}位指定的內容。LAD和STO指令的{I1,I0}=00,故POP和PUSH指令的{I1,I0}≠00,即其指定的邏輯寄存器RB(指針)不能選擇R0】
例:“1000 0000; 0000 0101;”表示把存儲器地址[05H]存放的數據彈出到寄存器R0。
“1000 0001;”表示把堆棧指針R1指向的地址[R1]存放的數據彈出到寄存器R0。
表7. 存儲器及堆棧操作指令
下圖9是存儲器操作指令LAD/STO和堆棧操作指令POP/PUSH的微程序流程圖。從圖中可以看出,POP指令只需要[11011]和[11101]兩條微指令就夠了,但是為了節省OP碼,POP和LAD指令共用OP碼“1000”,即共用第一條微指令[01000](即使POP指令其實并不需要微指令[01000])。從而可以在第一條微指令的末尾采用P3(I1,I0)判斷LAD和POP指令的不同路徑:若{I1,I0}=00,執行直接根據第二字節目標地址ADDR從存儲器取數的雙字節LAD指令;若{I1,I0}≠00,則執行根據邏輯寄存器RB(R1~R3)內容指定的目標地址從存儲器取數的單字節POP指令。STO和PUSH指令的關系類似LAD和POP指令。
圖9. 存儲器及堆棧操作指令的微程序流程圖
跳轉系列指令
如下表8所示:無條件跳轉指令JMP/JMPR的功能是程序必須跳轉到目標地址執行,而有條件跳轉指令Jx/JxR的功能則是程序是否跳轉需要條件判斷:當運算器結果標志位CF(溢出)、ZF(零)或SF(符號位)為1時,程序跳轉到目標地址執行;反之,標志位為0則程序不跳轉,繼續順序執行。根據判斷標志位的不同,共有JC、JZ和JS三個有條件跳轉指令。
跳轉系列指令共用OP碼0001,指令{I3,I2}位規定是無條件跳轉指令(JMP/JMPR)還是有條件跳轉指令(Jx/JxR)其中一種;而指令{I1,I0}位則指定目標地址是來源于寄存器RB(單字節JMPR/JxR指令)還是來源于地址ADDR的存儲器單元(雙字節JMP/Jx指令)。
【注:雙字節跳轉指令{I1,I0}=00,故單字節跳轉指令{I1,I0}定義的邏輯寄存器RB不能選擇R0】
例:“0001 0100; 0000 0101;”表示當CF=1時,程序跳轉到第二字節指定的目標地址05H。
“0001 1001;”表示當ZF=1時,寄存器R1存放數據作為目標地址,程序跳轉到該地址。
表8. 跳轉系列指令
下圖10是JMPR/JxR指令和JMP/Jx指令的微程序流程圖。從圖中可以看出,JMPR/JxR指令只需要[11111]微指令就夠了,但是為了節省OP碼,兩條跳轉指令共用OP碼0001,即共用第一條微指令[00001](即使JMPR/JxR指令其實并不需要 [00001] 微指令)。從而可以在第一條微指令的末尾采用P3(I1,I0)區分兩種跳轉指令的不同路徑:若{I1,I0}=00,執行直接根據第二字節目標地址ADDR跳轉的雙字節JMP/Jx指令;若{I1,I0}≠00,則執行根據邏輯寄存器RB(R1~R3)內容指定的目標地址跳轉的單字節JMPR/JxR指令。
圖10. 跳轉系列指令的微程序流程圖
算術邏輯運算系列指令
如下表9所示:單字節移位指令SHT可以把邏輯寄存器RA中存放的數據向左或向右移動一個位(bit),移入的位是0(邏輯移位)或是數據另一端的位(循環移位)。四種SHT指令共用OP碼1010, 指令I0位指定邏輯移位還是循環移位,而指令I1位則是指定移位的方向。
【注:此處右移位是指寄存器輸出Q3Q2Q1Q0往小端移動,而左移位是指寄存器輸出Q3Q2Q1Q0往大端移動,跟時序發生器74LS194的右移和左移的定義相反】
表9. 移位指令
如下表10所示:單字節單操作數運算指令SOP可以把寄存器RA遞增(INC)、遞減(DEC)、取反(NOT)和直通(THR)。如下表所示,四個SOP指令共用OP碼0010,由指令{I1,I0}位指定具體功能。
【注:THR指令一般用于根據某個寄存器的數據判斷ZF和SF標志位,從而決定是否跳轉】
表10. 單操作數運算指令
如下表11所示:雙字節雙操作數運算指令可以把兩個操作數進行算術運算:加法(ADD)、減法(SUB),以及邏輯運算:與(AND)、或(OR)、異或(XOR)。指令的{I1,I0}位指定兩個操作數全部來自寄存器或是操作數分別來源于寄存器和立即數IMM(指令第二字節)。前者是單字節指令(ADD、SUB、AND、OR、XOR),后者是雙字節指令(ADDI、SUBI、ANDI、ORI、XORI)。
【注:雙字節指令的I1I0=00,故單字節指令{I1,I0}位定義的邏輯寄存器RB不能選擇R0。】
例:“1101 0000; 0000 0101;”表示加法運算“R0=(R0)+05H”。
“1101 0001;” 表示加法運算“R0=(R0)+(R1)”。
表11. 雙操作數運算指令
算術邏輯運算系列指令的微程序流程圖如下圖11所示:為了節省微指令,所有的運算指令都在第一條微指令期間鎖存74181運算器的控制端邏輯[S3,S2,S1,S0,M,CN]。此外,五種雙操作數的運算指令都采取在第一條微指令的末尾采用P3(I1,I0)判斷雙字節和單字節指令的不同路徑:若{I1,I0}=00,執行操作數分別來自邏輯寄存器RA和指令第二字節(立即數IMM)的雙字節指令;若{I1,I0}≠00,則執行操作數全部來自寄存器的單字節指令。
圖11. 算術邏輯運算系列指令的微程序流程圖
參考資料
本文的內容節選自作者編撰的教材專著《基于Proteus的計算機系統實驗教程——邏輯、組成原理、體系結構、微機接口》(機械工業出版社),更詳細的內容可以直接在書中查閱。
讀者如有興趣,可以在 當當網圖書, 京東圖書,亞馬遜上搜索作者姓名賴曉錚即可找到這本著作。
本書詳細描述了在proteus虛擬仿真環境中,從邏輯電路開始,一步一步構造運算器、存儲器、控制器,最終用三種CPU體系架構(微程序、硬布線、流水線)實現了一個8位的CPU。并且,這個CPU不僅可以做邏輯、算術運算,擁有循環、分支、堆棧等程序結構,還可以完整實現對8086所有外設的控制,即替代8086完整實現了傳統《微機原理》里講到的所有外設實驗。
本書的全部proteus工程文件,PPT,實驗視頻以及配套的兩種形式課程設計(純匯編、硬件改動)的資料都放在 百度網盤,提取密碼:34ad
廣州風標為本書配套了實驗箱(如下圖所示),可以讓學生在電腦的proteus虛擬仿真環境中設計CPU或選擇已有的8086、8051、ARM等CPU模型,然后通過虛擬總線映射到實驗箱的物理總線,控制實驗箱面板上的真實外設。有興趣的讀者可以自行聯系 廣州風標教育技術股份有限公司。
總結
以上是生活随笔為你收集整理的基于proteus的一个微程序CPU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Homebrew 安装使用
- 下一篇: maven跳过单元测试-maven.te