一、實驗目的
1、理解“微程序”設計思想,了解“指令-微指令-微命令”的微程序結構。
2、掌握微程序控制器的結構和設計方法。
二、實驗內容
設計一個“最簡版本”的 CPU 模型機:利用時序發生器來產生 CPU 的預定時序,通過微程序控制器的自動控制,在數據通路中完成“唯一”的 CPU 功能——程序跳轉。
三、實驗器件
1、ROM存儲器(2764)和計數器(74LS163、74LS192)。
2、D觸發器(74LS74)、寄存器(74LS273)及移位寄存器(74LS194)。
四、實驗原理
4.1 理論解釋
說明:由于筆者能力有限,加上覺得實驗指導的描述專業性、條理性較強,所以摘抄到下文。同時,建議形成自己的理解。筆者覺得,這個實驗雖然只設計了4條微指令,但是由于2條微指令的內容又和PC或者說程序的運行(跳轉)本身有關,所以理解起來需要費一些功夫;如果設計的微指令可以和實驗一的加法器或實驗二的ALU相關,理解上的難度會降低。
實驗電路由時序發生器(下圖中黃框部分)、微程序控制器(下圖中紅框部分)和數據通路組成。
數據通路由三個部件組成:指令寄存器 IR(74LS273)、程序計數器PC(74LS163 級聯)、程序存儲器 PROGRAM(ROM)及其地址寄存器 AR(74LS273)。所有 部件都并聯掛在單條的 8 位總線 BUS 上,通過數碼管顯示總線 BUS 信息。 其中,程序計數器 PC 是一個八位遞增計數器,由兩個同步二進制計數器 74LSl63 級聯構成。74LSl63 的邏輯功能如下圖所示:D0D1D2D3為并行輸入端; Q0Q1Q2Q3為并行輸出端;ENT、ENP 為遞增使能端;LOAD 為置數端;MR 為清 零端;CLK 為時鐘輸入端;RCO 為進位輸出端。當低四位 74LS163 輸出端 Q3-Q0 溢出后,則 RCO=1 送到高四位74LS163 的 ENT 和 ENP 端,允許高四位74LS163 在 CLK 上升沿自加 1 一次(僅允許一次)。注意:74LS163 的加載和自加 1 功能都必須滿足 CLK 端上升沿跳變的條件才能實現。
圖 17????? 74LS163計數器 邏輯功能
因為本次實驗的數據通路簡單,實現的功能有限。所以本實驗的 CPU 只能使用 四條基本指令:空指令 NOP、停機指令 HLT,以及直接尋址的跳轉指令 JMP1 和 間接尋址的跳轉指令 JMP2,如下圖所示。
圖 18????? Mini CPU(微程序控制法設計)--四條基本指令(無操作、停機(斷點)、一級跳轉、二級跳轉)
根據圖18所示的 CPU 指令格式,可以編寫機器語言(即二進制數據)形式的程序,存放在存儲器 PROGRAM 中。程序按地址順序存放(可以通過程序計數器PC 遞增尋址),每一個存儲器單元地址上存儲 8 位二進制數據,例如下圖所示的這段程序:
圖 19????? ROM-PROGRAM 燒錄程序
圖19所示的每一條指令,在其指令周期中都經歷了取指周期和執行周期兩個階段。所有指令的取指周期都是一樣的(除了HLT停機指令,該指令在取值周期的第二個微指令結束后就會使CPU“卡殼”),執行周期則各有不同(NOP 指令不存在執行周期<->總共1個機器周期4條微指令,JMP1執行周期1個<->總共2個機器周期8條微指令,JMP2執行周期2個<->總共3個機器周期12條微指令)。歸納起來所有指令在數據通路上出現的操作只有兩種:取指周期中的指令流ROM->IR,執行周期中單次或多次重復出 現的數據流ROM->PC。
總結一下,不同指令可能對應不等長的微指令個數,這在CISC體系的計算機處理器設計中很常見,也是微程序法主要的應用體系。總體上每個指令都劃分為取指周期和執行周期,每個周期由4個時鐘周期/4條微指令進行。微指令的結構和與微命令的關系見下文圖23。這就是微程序的架構:指令-微指令-微命令的層級模式了。
圖 20????? 微程序架構
指令流(ROM->IR)是從存儲器 PROGRAM 取出指令,經過總線 BUS 流向指令寄存器 IR,數據流(ROM->PC)是從存儲器 PROGRAM 取出數據,經過總線 BUS 流向程序計數器 PC。無論是指令流還是數據流,信息都是先從一個部件打到總線 BUS,再從總線 BUS打到另一個部件的過程。因為信息從源部件打出到總線 BUS 的操作必須先于信息從總線BUS 打入目標部件的操作。所以為了保證上述操作的先后次序,指令流和數據流內部都可以分為兩個周期 T1 和 T2。在 T1 周期,源部件 (例:程序存儲器 PROGRAM)的信息打入總線;在 T2 周期;總線的信息打入目標部件(例如指令寄存器 IR 或者程序計數器 PC)。
圖 21????? 微操作信號(單獨位控制方法)
圖 22????? 微命令的兩種設計方法(位單獨控制/位組合控制)[2]
數據通路上設計了一系列的微操作信號用來控制各個部件,如圖21所示。
本實驗的微指令結構如下圖所示:微指令字長 24 位,通過下址轉移方式確定后續運行的微指令,即微指令的 1-5 位表示下一條微指令地址 [uA4, uA0]。而微指令的 6-7 位留給判斷字段 Px(其中 P0 位空缺),P1=1,表示本微指令是取指周期的微指令;P1=0,表示本 微指令是執行周期的微指令。微指令的 8-24 位則是微命令字段,微命令即是數據通 路中電平觸發的微操作信號(詳見圖21)。某位置“1”,表示該位微操作信號有效;反之,置“0”則表示該位微操作信號無效。
圖 23????? 微指令的結構
本實驗用到的四種基本微指令,如圖24所示。
圖 24????? NOP/JMP1/JMP2/HLT 微指令
?將 CPU 指令周期示意圖圖20 用“微程序”設計原理闡述,可以得到 CPU 指令的微程序流程圖(圖25)。
圖25? CPU指令-微程序流程圖
注意,每個機器周期一定由T1、T2、T3、T4四個時鐘周期組成,對應4條微指令,對于00000 NOP微指令,下址字段還是自己,所以要跳轉到其他兩個指令,在T4的時候通過部分強制置位的方式設置MA微指令地址寄存器中的內容。
圖 26????? 從微指令00000(NOP)跳轉到00001(JMP1)或00010(JMP2)
如果要跳轉到00111(NOP),在T2的時候指令打入IR,通過三輸入與非門直接控制“節拍器”74LS194,停止機器周期的計數,從而實現硬件停機效果,見下圖。
圖 27 硬件停機指令HLT,停機在T2上升沿之后
那么對于其他的非NOP、非HLT指令怎么跳轉呢?T3的上升沿作為觸發信號直接把下址地址(5位)打入微指令地址寄存器MA0-MA4。
圖 28????? 微地址寄存器,普通指令內執行周期間跳轉
筆者在實驗電路中通過藍色數碼管顯示當前機器周期所處的時鐘周期位置,紅色數碼管記錄機器周期個數,綠色數碼管顯示程序或者數據(讀取PROGRAM ROM,可以是指令內容也可以是PC要跳轉到的指令位置)。
其他注意事項:時鐘信號的設置、機器周期計數顯示器、啟動設置、跳出斷點設置
從斷點HLT指令繼續時,按照我的理解,不是從下一個指令的T1開始,而是從HLT指令的T3開始,走完T3、T4之后才進入下一個指令的T1去取指,可以通過藍色數碼管直觀觀察(如果我對實驗內容理解準確而且連線設計無誤)。所以跳出斷點的操作一定不能有下圖的步驟2!74LS194的關鍵控制信號是{S0,S1}(見下圖),在跳出斷點的第一個步驟之后,S0=1,S1=1也就是送數模式,此時如果手動撥動CLK開關,會使74LS194節拍器回到HLT取指周期的T1,你會發現你將永遠跳不出第一條HLT指令的死循環(那種絕望感)。
圖 29????? 跳出斷點 三步操作VS兩步操作
關于手動清零的設計,涉及IR、MA、PC、MDR、AR這五個器件,指令地址寄存器AR可以清零也可以不清零,如果AR跳出斷點時沒有被清零就是上面我說的第一種絕望,如果被清零了就屬于下面我要說的第二種絕望。
圖 30????? 斷點-清零AR導致整個程序重新執行
下圖(圖31)中啟動設置的步驟1,通過RESET手動清零只能設計成可以清零IR和MA0-MA4微地址寄存器,不能設計清零PC和三個MDR中的內容。清零PC會導致跳出斷點之后程序無法記憶,從頭開始執行(仿真一開始PC指向0x00),那么你會發現你將永遠看不到第一條HLT指令后的世界(絕望感)。
啟動時不能清零MA0-MA4微指令地址寄存器,因為啟動時微指令默認指向00000(NOP),控制信號存在值為1的位,清零之后直接系統紊亂;但是,跳出斷點時“可以清零”MDR中的內容,因為圖24顯示HLT微指令(00111)的所有位都是0!但是設計時需要支持任何一種特殊情況,因此不能清零MDR寄存器。
圖 31????? 其他注意事項
4.2 電路架構
由于實驗四的電路過于龐雜,筆者把整個系統基于4.1開頭提到的三個子模塊按照功能進一步拆分,如下面幾張圖所示,有些在4.1節已經出現。
圖 32????? 微程序控制組件(2條總線MABUS/NABUS):微地址寄存器(下址地址,T3/T4有效)+微指令讀取
圖 33????? 紅:指令周期計數 綠:程序內容顯示 藍:節拍定位(指令周期內部)與數據通路(1條總線,數據和指令共享)
圖 34 ??? 00000微指令下址地址跳轉模塊(T4有效)、00111停機微指令作用模塊(T2生效)
圖 35????? 啟動/斷點調試與時鐘信號源選擇
圖 36????? 時序發生器(三種模式)
五、實驗步驟
- 根據圖24 微指令代碼表可以編寫下列微程序,編譯并生成三個 HEX 文件,分別燒寫到圖 2-34所示的控制存儲器 EPROM1、EPROM2 及 EPROM3。
- 問題:在寫入控制存儲器的微指令代碼表中,地址[00001](JMP1)和[00010](JMP2)的兩條執行周期微指令執行的微操作完全一樣。請問,可否合并這兩條微指令?若不能,原因是什么?
不能合并。因為[00010](JMP2)的下址地址是[00001](JMP1)微指令而非[00000](NOP)微指令,相當于JMP2并不是直接定義的,而是使用嵌套的間接定義方式,建立在JMP1的基礎上。
3)編譯如下所示的機器語言源程序,生成 HEX 文件燒寫到圖 2-34 所示的程序存儲器PROGRAM中。
個人在過CPU跳轉的時候認為燒錄程序的第四條 “指令”的助記符應該是“NOP”。這段程序相當于是一個死循環,JMP1執行1次,此后永久的執行第三行到JMP2指令的程序段。
1、啟動仿真前,時鐘信號CLK 接在 MANUAL_CLK 端;啟動仿真,使能復位信號RESET=1,然后手動按鈕 MANUAL_CLK,令時鐘信號 CLK上升沿跳變,初始節拍{T1,T2,T3,T4}={1,0,0,0};最后恢復復位信號 RESET=0,初始化過程完成。
2、手動按鈕 MANUAL_CLK,令時鐘信號 CLK 形成脈沖,單步執行上述機器語言程序。在 JMP1 或 JMP2 指令的指令周期中,對照微程序流程圖 2-37,觀察每一條微指令的作用,以及單步執行的結果(例如寄存器 AR、IR、PC 及總線 BUS 上的數據)。
3、時鐘信號 CLK 改接在 AUTO-CLK 信號源(主頻 10Hz),程序會自動運行到 HLT 指 令“斷點”暫停。查看“斷點”處的微指令周期數指示,以及寄存器 AR、 IR、PC 及總線 BUS上的數據。然后,使能復位信號 RESET“0->1->0”,跳出“斷點” ,進入 HLT 指令的后續下一條指令繼續運行。
?4)(實驗 2)增加一條二次間接尋址的跳轉指令 JMP3,嵌套定義在JMP2指令的基礎上。
并編譯如下所示的機器語言源程序,生成 HEX 文件燒寫到圖 2-34 所示的程序存儲器PROGRAM中。
這段程序是有限次數的執行。
5)問題:在本實驗程序中,有部分地址標示“NOP/[ADDR]”,為何相同代碼會有不同的執行效果?執行到該處,在什么情況下是不執行任何操作?在什么情況下是程序跳轉?
因為程序中的每一行可以解讀成指令或者指令需要的數據,比如有些地址標示NOP,如果是從NOP或者JMP1執行完到這一行那就是NOP;但如果是JMP2或者JMP3中間跳轉的暫停點就是作為數據的ADDR了。
六、思考題
1、微程序版本 CPU 最多有多少條微指令?最多有多少條 CPU 指令?微指令和 CPU 指令的容量分別由什么因素限定?
在本仿真實驗中,CPU微指令可以有32條,因為下址字段有5位;IR存儲的指令種操作碼長度是3位(I7I6I5),所以最多8條,實際應用時需要結合指令的操作碼長度以及操作碼的編碼方式(擴展操作碼或固定操作碼長度,見下圖)。因此在CISC體系中,微程序版本CPU微指令的容量受到下址字段的位數限定,CPU指令的容量受到指令的字數和字長(比如32位/64位操作系統的概念),以及操作碼的編碼方式等因素的限制。
圖 37????? 指令的字數和字長、操作碼的編碼方式[2]
2、請問微程序控制器“狀態機”可否提升效率,減少到三個狀態{T1,T2,T3}?即微指令周期可否減少到只用 T1、T2、T3 三個節拍即可完成一條微指令從取指到執行的全過程?
不可以,因為微指令結構中有PX位的設定,本實驗對于00000(NOP)微指令P1=1,其余(圖24,關鍵圖)其余微指令P1=0,這也引出了圖34(左)的設計,對于00000生效在T4,對于其他微指令生效在T3,所以不能再減少機器周期(指令周期,一個指令可以有多個周期)的數量。
附:實驗1-4設計演示視頻:
計算機組成原理專業實驗課有多“卷”?來看看什么叫細節的海洋~~~_嗶哩嗶哩_bilibili
參考資料
[1] 熱愛生活的fuyao. 學習筆記——3-8譯碼器實例(FPGA)[EB/OL]. (2021-01-24)[2025-06-29]. 學習筆記——3-8譯碼器實例(FPGA)_3-8譯碼器功能表-CSDN博客
[2] 華南理工大學計算機學院王國華老師的課件