爲了理解微程序控制器的設計思想,咱們假設一個極簡的數據通路(以下圖1所示),由並聯在單條8位總線BUS上的三個部件組成:指令寄存器IR(寄存器74LS273構成)、程序計數器PC(計數器74LS163構成)、程序存儲器PROGRAM(ROM存儲器2764構成)。
圖1. 數據通路圖編碼
在數據通路上所能執行的某一種操做能夠看做是一條對應的「指令」,則該數據通路能執行的全部操做能夠用一個極簡的指令集(只包含四條指令)來描述,以下表1所示:設計
表1. 微程序控制器指令集列表3d
按照上述指令表1的指令格式,用戶能夠編寫一段機器語言程序存放在程序存儲器PROGRAM中,以下表2所示。其中每個存儲器單元存放一個字節的數據,對應惟一的8位二進制地址(由地址寄存器AR鎖存)。若用戶須要訪問程序存儲器的某個單元,須由程序計數器PC提供該單元的地址,才能從程序存儲器取出該單元中的數據。由於程序是順序訪問的,因此程序計數器PC是由兩個計數器74LSl63級聯構成的一個8位遞增計數器PC。當前指令從程序存儲器PROGRAM取出,並鎖存到指令寄存器IR後,PC自動執行PC+1操做,指向相鄰下一條指令。
表2. 程序存儲器PROGRAM中的機器語言程序blog
仔細分析上述圖1和表1可知,數據通路的各條指令狀態圖以下圖2所示:全部指令的取指操做都是相同的,便是上圖1中紫色箭頭所示的指令流(ROM→IR):CPU從程序存儲器PROGRAM取出指令,通過總線BUS流向指令寄存器IR。NOP和HLT指令只有上述取指操做,沒有執行操做(HLT指令取指後硬件停機);而JMP1和JMP2指令除了上述取指操做外,實際只有一種執行操做,即上圖1中紅色箭頭所示的數據流(ROM→PC):CPU從程序存儲器PROGRAM取出數據,通過總線BUS流向程序計數器PC。兩種跳轉指令不一樣之處在於:JMP1指令的第二字節是目標地址(直接尋址),只要一次數據流(ROM→PC)就把目標地址送入PC;而JMP2指令的第二字節是存放目標地址的存儲器單元地址(間接尋址),須要連續兩次數據流(ROM→PC)才能把目標地址送入PC。
圖2. 微程序控制器指令狀態圖程序設計
在上圖2中,雖然微程序控制器指令的狀態類型只有兩種(指令流和數據流),可是每一條指令擁有的狀態數目都不盡相同,其中最關鍵問題是如何根據不一樣的指令來判斷狀態的轉移。所以咱們能夠採用微程序原理來解決這個問題:圖2中每一條指令都是一個任務,一個狀態則對應一條微指令。若干條微指令組合成一段微程序,解決相對應的任務。
微指令的字長設爲24位,結構以下圖3所示:
1-5位表示該微指令執行後,下一條微指令的地址 [uA4, uA0](即下址轉移方式);
6-7位是判斷字段Px:P1=1表示該微指令是取指微指令;,P2空缺。
8-24位是微命令字段:微命令便是圖1所示數據通路中的微操做信號,其中某位置「1」,表示該位的微命令有效;反之,置「0」則表示該位的微命令無效。原理
圖3. 微指令結構圖循環
仔細觀察數據通路圖1,能夠發現指令的取指或執行過程都是指令或數據從一個部件打入總線BUS,再從總線BUS打入另外一個部件的過程。爲了保證上述操做前後次序,指令流(ROM→IR)和數據流(ROM→PC)都分爲T1和T2兩個週期:T1週期,信息從源部件(例如程序存儲器PROGRAM)打入總線BUS;T2週期,信息從總線BUS打入目標部件(例如指令寄存器IR或者程序計數器PC),以下表3所示。所以,在圖3所示的微操做信號中,除了信號#OE(存儲器輸出使能)和#LDPC(PC加載使能)是全過程有效外,其餘信號須要與T1或T2週期節拍信號邏輯「與」,產生新的邊沿觸發信號,在指定週期開始時刻上升沿跳變,例如AR_CLK=LDAR•T1,IR_CLK=LDIR•T2,PC_CLK=PC_INC•T2
表3. 數據通路的微操做信號列表硬件
綜合上述微指令結構圖3和微操做信號列表3,經過分析微程序控制器指令狀態圖2,能夠獲得以下圖4所示的微程序流程圖:圖中每個方框在時間上表示一個微指令週期,包括T1(源部件→總線)和T2(總線→目標部件)兩個週期;在空間上表示一條微指令,經過一系列微操做信號使得信息從某個源部件通過總線BUS到達目標部件。圖中每一個方框的右上方是對應微指令的地址,右下方是對應微指令的下一條微指令的地址(簡稱下址)。
圖4. 指令的微程序流程圖二進制
上述微程序流程圖4中,最上方首先執行的方框是公共的取指微指令,即指令流(ROM→IR)。取出指令後, P1菱形框表示指令譯碼及地址轉移:根據當前指令OP碼的[I7,I6,I5]位造成其執行週期第一條微指令地址[0,0,I7,I6,I5],從而選擇該指令的執行週期。菱形框下的四條路徑對應指令列表1所述的四條指令的執行週期,其中每一個方框是一條執行微指令,即數據流(ROM→PC)。值得注意的是,NOP指令和HLT指令只有取指週期,沒有執行週期。NOP指令的OP碼是000,取指後譯碼獲得的第一條微指令地址仍爲[00000],即直接返回下一條指令的取指週期。而HLT指令的OP碼是111,譯碼後直接令硬件停機。在全部路徑末尾,最後一條微指令的下址[uA4-uA0]都必須是取指微指令地址[00000],即一條指令結束後必須返回取指微指令,準備取出下一條指令。如圖4左上方所示,整個數據通路的運行過程就是不斷循環的取指令和執行指令。圖4中總共有三條微指令,其編碼以下表4所示(具體位置的微命令含義請參考微指令結構圖3)。
表4. 微指令列表程序
上述微指令列表4至關於一個並行的操做開關序列,用戶根據微程序流程圖4,在規定的微指令週期(方框),按照規定的節拍Tx,撥動特定的操做開關序列(微指令),就能夠實現從程序存儲器PROGRAM中取出和執行一條機器指令。更進一步,咱們能夠用時序發生器輸出預約的時序,經過微程序控制器按時序自動產生操做信號,代替用戶在數據通路中完成的人工操做。時序發生器(CLOCK UNIT)、微程序控制器(CONTROLL UNIT)和數據通路共同構成一個最小版本的CPU,以下圖5所示。
圖5. 最小版本CPU電路圖
在上述CPU電路圖5中,代替用戶人工操做的CPU部件是微程序控制器(CONTROLL UNIT),由控制存儲器、微指令寄存器、微地址寄存器和地址轉移邏輯電路組成,以下圖6所示。CPU啓動或復位後,微地址寄存器清零,控制存儲器從地址[00000]開始輸出微指令。如前述微指令結構圖3所示,微指令包括了控制字段、下址字段和判斷字段。控制字段即下圖6中的微命令字段,直接輸出微操做信號執行當前微指令;下址字段鎖存在微地址寄存器,待當前微指令執行完後,再從控制存儲器取出下一條微指令。若當前微指令是取指微指令,則P字段啓動地址轉移,根據指令寄存器IR中的OP碼修改微地址寄存器,轉向指令執行週期的第一條微指令。
圖6. 微程序控制器結構圖
存放上述微指令列表4的存儲器電路以下圖7所示:微指令存儲器字長24位,由3個2764芯片MROM1-3組成,其輸出端則鏈接着微指令寄存器MDR1-3(寄存器74LS273和74LS175構成)。在系統啓動(信號ON=1)或T1週期開始(信號T1=1)時刻, MROM1-3輸出當前微指令的微操做信號,鎖存在MDR1-3,送往數據通路執行。部分微操做信號(LDAR、LDIR、PC_INC)與T1或T2節拍組合,產生邊沿觸發信號(AR_CLK、IR_CLK、PC_CLK),在T1或T2週期開始時刻上升沿跳變。
圖7. 微程序控制器的存儲器電路
以下圖8所示,控制器的微地址寄存器字長五位(MA4-MA0),由觸發器74LS74組成,其輸入端經過NMABUS總線鏈接當前微指令的下址字段[uA4-uA0],其輸出端經過控制存儲器的地址總線MABUS送到控制存儲器的地址端A4~A0。值得注意的是,上述微程序控制器結構圖6中的地址轉移邏輯(即微程序流程圖4中的菱形框P1)在下圖8中對應的就是三個三路與非門74LS10。在取指週期末尾,微指令下址字段原本是[00000];然而判斷字段P1=1,啓動地址轉移邏輯,根據指令寄存器IR的OP碼[I7,I6,I5]生成信號#SET_MAx=0,強制把微地址寄存器MA4-MA0置位爲[0,0,I7,I6,I5],即該指令執行週期的第一條微指令地址。
圖8. 微地址寄存器和地址轉移邏輯
上述微程序的地址轉移過程須要在微指令週期增長T3和T4兩個週期:T3週期,當前微指令的下址字段[uA4-uA0]經過NMABUS總線打入微地址寄存器MA4-MA0,進而經過地址總線MABUS送往微指令存儲器MROM1-3的地址端,使其輸出下一條微指令;T4週期,若當前微指令是執行週期微指令,則P1=0,無任何操做;若當前微指令是取指週期微指令,則P1=1,啓動地址轉移邏輯,重置微指令地址,跳轉到當前指令的執行週期第一條微指令。
綜上所述,一條CPU指令就是一段微程序,其中包含若干條微指令(至少有一條是取指微指令)。因此,「微程序」時序以下圖9(左)所示:每一個指令週期都包含了若干條微指令的機器週期(即微指令週期),其中至少有一個取指微指令週期。並且,每一條微指令的運行過程均可以當作是一個狀態機,以下圖9(右)所示:狀態機有4個狀態{T1,T2,T3,T4},每一個狀態【Tx】完成從取指、執行到判斷下址的相應任務,狀態轉移T1→T4的一次循環便是一個微指令週期。所以,每一個微指令週期內部包含了四個節拍信號Tx,對應「微指令」狀態機的4個狀態{T1,T2,T3,T4},狀態機周而復始在四個狀態【Tx】之間順序轉移,
圖9. 微程序的時序圖和狀態機
CPU時序發生器以下圖10所示,主要功能是爲上述微程序控制器提供時序控制。其中最核心的狀態轉移電路是由兩個D觸發器組成的一個2位扭環計數器,輸出節拍序列{T1,T2,T3,T4}={00,01,11,10}。CLK爲整個CPU電路的時鐘信號,能夠由手動按鍵MANUAL_CLK或方波信號源AUTO_CLK生成(雙擊信號源能夠自行選擇方波信號頻率)。
時序發生器還提供了硬件電路實現HLT指令的停機功能(即斷點)。當指令寄存器IR的OP碼I7I6I5=111的時候,停機信號#HLT=0,阻塞CLK輸出,CPU停機在HLT指令的取指週期T2節拍上。跳出HLT指令斷點的復位過程與上述初始化過程相同,信號 #RESET=0令指令寄存器IR清零,OP碼[I7,I6,I5]=000,則#HLT=1,跳出「斷點」;同時,扭環計數器強制爲狀態T1={00}。#RESET=1,復位成功,CPU進入HLT指令後續下一條指令的取指週期T1節拍。
此外,爲了觀測微程序的運行,時序發生器電路提供了一個由節拍信號T1上升沿驅動的雙位微指令計數器MICRO-I(兩個十進制加法計數器74LS160級聯構成),經過數碼管顯示當前運行第幾條微指令,顯示範圍是1~99,以下圖10右邊所示。
圖10. 微程序控制器的時序發生器