




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、簡單RISC處理器設計6.3 簡單RISC處理器設計前面我們已經學習了現代電子系統設計的基本方法,學習了使用Verilog HDL語言設計簡單組合邏輯和簡單時序邏輯模塊,學習了自頂向下的設計方法,同時還學習了狀態機的設計。在這里,將綜合運用以上所學的知識,設計一個簡化的處理器。“麻雀雖小,五臟俱全”,這里設計的處理器雖然是經過簡化的,但是能對其進行綜合、適配,最終可以在硬件上運行。這里介紹的處理器由于主要用于教學,只是一個簡單的教學模型,設計不一定合理,只是從原理上說明了一個簡單的處理器是如何構成的。6.3.1 RISC處理器簡介中央處理器(CPU,Central Processing Uni
2、t)是計算機的核心部件。計算機進行信息處理可分為兩個步驟:(1)將數據和程序(即指令序列)輸入到計算機的存儲器中;(2)從第一條指令的地址起開始執行該程序,得到所需結果,結束運行。CPU的作用是協調并控制計算機的各個部件并執行程序的指令序列,使其有條不紊地進行。因此它必須具有以下基本功能: 取指令當程序已在存儲器中時,首先根據程序入口地址取出一條程序,為此要發出指令地址和控制信號。 分析指令即指令譯碼,這是對當前取得的指令進行分析,指出它要求什么操作,并產生相應的操作控制命令。 執行指令根據分析指令時產生的“操作命令”形成相應的操作控制信號序列,通過運算器、存儲器及輸入/輸出設備的執行,實現每
3、條指令的功能,其中包括對運算結果的處理及下條指令地址的形成。將CPU的功能進一步細化,可概括如下:(1)能對指令進行譯碼并執行規定的動作;(2)可以進行算術和邏輯運算;(3)能與存儲器和外設交換數據;(4)提供整個系統所需要的控制。盡管各種CPU的性能指標和結構細節各不相同,但它們所能完成的基本功能相同。由功能分析可知,任何一種CPU內部結構至少應包含下面這些部件:(1)算術邏輯運算部件(ALU);(2)累加器或寄存器;(3)程序計數器;(4)指令寄存器和譯碼器;(5)時序和控制部件。精簡指令計算機(RISC,Reduced Instruction Set Computer)是一種20世紀80
4、年代才出現的CPU,它與一般CPU相比不僅只是簡化了指令系統,而且還通過簡化指令系統使計算機的結構更加簡單合理,從而提高了運算速度。從實現的途徑看,RISC處理器與一般的CPU的不同之處在于:它的時序控制信號形成部件是用硬布線邏輯實現的而不是采用微程序控制的方式。所謂硬布線邏輯也就是用觸發器和邏輯門直接連線所構成的狀態機和相應的組合邏輯,故產生控制序列的速度比用微程序控制方式快得多,因為這樣做省去了讀取微程序指令的時間。下面就詳細介紹一個簡化的、用于教學目的的RISC處理器SimpleRISC,它是采用硬布線邏輯實現的控制,是一個可綜合的CPU模型。6.3.2 SimpleRISC處理器結構介
5、紹一、處理器結構這里首先對我們即將要進行設計的SimpleRISC處理器硬件結構作一個簡要介紹。這里所介紹的處理器結構只是SimpleRISC芯片的內部結構,或者說只是SimpleRISC的CPU核,所以不包括存儲器單元和外設等。SimpleRISC處理器的內核結構如圖6-48所示。圖6-48 SimpleRISC處理器內核結構從圖6-48中可以看出,SimpleRISC處理器內核包括以下功能單元:控制器、程序計數器、通用寄存器、算術邏輯單元(ALU,Arithmetic Logic Unit)和總線接口單元(BIU,Bus Interface Unit)。以下的內容將依次討論這些模塊。二、處
6、理器內部子模塊1、控制器控制器用于進行指令譯碼、產生ALU運算控制信號、產生通用寄存器讀寫控制信號以及協調處理器工作時序工作。2、程序計數器程序計數器用于指向下一條將要執行的指令的地址,它可以自動增值或是通過分支指令來設置其內容。3、通用寄存器SimpleRISC處理器內部有32個32 位通用寄存器,ALU運算的源操作數、目的操作數大都來自這個通用寄存器堆。4、算術邏輯單元算術邏輯單元用于進行算術運算、移位操作、比較設置操作以及邏輯運算。對于其他未能實現的運算,例如乘法、浮點運算等,可以使用軟件來實現。5、總線接口單元總線接口單元用于SimpleRISC處理器與外部存儲器和I/O口的連接,為了
7、簡單起見,SimpleRISC系統的存儲器和I/O采用統一編址的方式進行組織,并且采用程序存儲器和數據存儲器分開的哈佛結構。從圖6-48可以看出,SimpleRISC處理器并沒有實現中斷處理以及Cache等功能,雖然如此,但是SimpleRISC處理器已經能進行一些簡單的工作了。下面將繼續討論有關SimpleRISC的一些細節。6.3.3 SimpleRISC處理器的指令集和尋址方式一、SimpleRISC處理器的指令集SimpleRISC處理器的指令集中包括以下指令:(1)算術運算指令算術運算指令包括加法(add)和減法(sub)指令。(2)比較指令比較指令只有小于則設置(slt)指令。(3
8、)移位指令移位指令包括左移(ls)和右移(rs)指令。(4)邏輯運算指令邏輯運算指令包括與(and)、或(or)和非(not)指令。這里的邏輯運算都是按位進行的。(5)數據存儲器訪問指令數據存儲器訪問指令包括存儲器數據加載(load)和數據存儲(store)兩條指令。數據存儲器的訪問都必須通過這兩條指令來進行。(6)分支指令分支指令分為無條件分支和條件分支兩類。無條件分支指令只有一條:branch;而條件分支只實現相等則分支(beq)指令。二、SimpleRISC處理器的尋址方式CPU的尋址方式指的是CPU在進行操作時如何找到操作數的方法。一般來說,操作數可以存儲在CPU內部寄存器中,也可以由
9、指令提供,還可以存儲在數據存儲器中。對于RISC處理器來說,操作數一般都由指令提供或存儲在CPU內部寄存器中,而RISC處理器一般不直接使用數據存儲器中的數據作為操作數。這里的SimpleRISC處理器,其操作數也由指令提供或存儲在CPU內部寄存器中,相應的尋址方式為立即尋址(操作數由指令提供)和寄存器尋址(操作數存儲在CPU內部寄存器中)。6.3.4 SimpleRISC處理器的指令格式與編碼一、指令格式這里假設設計的SimpleRISC處理器是32位的,由于它有32個32位寄存器,所以每個寄存器需要使用5位編碼來尋址。將以上討論的指令分為三種類型的指令:R類型指令、I類型指令和J類型指令。
10、R類型指令指的是操作數全部來自通用寄存器,包括寄存器操作數的算術運算指令、比較指令和邏輯運算指令。由于這些指令的操作數都來自于通用寄存器,而一般的操作都有三個操作數:兩個源操作數和一個目的操作數,所以R類型指令中需要使用5315位來對寄存器進行編址,對于32位指令,使用了15位以后,還剩余17位,其余的17位都可用于指令的編碼,所以一共可以有217131072條R類型的指令。I類型指令指的是操作數中有部分來自于通用寄存器,而另一部分是來自于指令本身的立即數,包括帶有立即數的算術運算指令、比較指令、邏輯運算指令、移位指令、數據存儲器訪問指令和條件分支指令。除移位指令外,立即數都是16位的,而另外
11、還需要兩個寄存器操作數,所以共需要165226位編碼,還剩余6位編碼,所以可以有2664條I類型的指令。對于移位指令,由于操作數是32位的,所以移位位數最多為32位,則只需要5位立即數即可,因此共需要55215位編碼,剩余17位可用于指令編碼。J類型指令只有一條:無條件分支指令Branch,它采用6位指令編碼(為了與I類型指令格式對齊),剩余的26位用于指明分支的目的地址到當前程序計數器的偏移量。假設采用補碼表示法,則最大偏移量在225(225-1)之間,即0x020000000x01FFFFFF之間。而前面討論的條件分支使用16位偏移量,所以最大偏移量在215(215-1)之間,即0x000
12、080000x00007FFF之間。通過以上討論,可以定義出以下指令格式。對于R類型指令,指令中包括三個5位的通用寄存器地址域和一個17位的指令編碼域,為了與I類型及J類型指令保持格式一致,將指令編碼域分成了11位和6位兩個部分,參見圖6-49。圖6-49 R類型指令格式圖中的A、B、C為通用寄存器地址,OPX位11位指令編碼,OP位6位指令編碼。對于I類型指令,指令中包括四個域:兩個5位的通用寄存器地址、6位指令編碼和16位地址偏移量,可以表示為圖6-50所示的格式。圖6-50 I類型指令格式圖中的A、B為通用寄存器地址,IMM16為16位立即數(對于移位指令,只用最低5位),OP為指令編碼
13、。對于J類型指令,指令中包括兩個域:6位指令編碼和26位地址偏移量,可以表示為圖6-51所示的格式。圖6-51 J類型指令格式圖中的OP部分即為指令編碼,而IMMED26是地址偏移量。從以上三種類型指令的編碼格式可以看出,SimpleRISC處理器的格式比較統一,設計起來也就會比較簡單。實際上,幾乎所有的RISC處理器的指令格式都采用這里的設計思想,使得設計簡單,譯碼邏輯也簡單,從而提高處理器性能。更重要的是,這種簡單的設計有利于使用流水線來實現,能更進一步提高處理器性能。二、SimpleRISC處理器的指令編碼1、加法這里實現的是有符號數的加法,不考慮溢出。(1)寄存器操作數相加匯編語言表示
14、形式:add rt, rs1, rs2操作說明:rt = rs1 + rs2編碼:(2)寄存器操作數與立即數相加匯編語言表示形式:addi rt, rs, imm16操作說明:rt = rs + imm16,對imm16進行符號擴展編碼:2、減法這里實現的是有符號數的減法,不考慮溢出。(1)寄存器操作數相減匯編語言表示形式:sub rt, rs1, rs2操作說明:rt = rs1 - rs2編碼:(2)寄存器操作數與立即數相減匯編語言表示形式:subi rt, rs, imm16操作說明:rt = rs imm16,對imm16進行符號擴展編碼:3、小于則置一這里實現的是無符號數的比較。(1
15、)寄存器操作數比較匯編語言表示形式:slt rt, rs1, rs2操作說明:rt = (rs1 rs2)編碼:(2)寄存器操作數與立即數比較匯編語言表示形式:slti rt, rs, imm16操作說明:rt = (rs imm16),對imm16進行零擴展編碼:4、左移匯編語言表示形式:sl rt, rs, imm5操作說明:rt = rs imm5編碼:6、邏輯與這里實現的是無符號數的邏輯與。(1)寄存器操作數的邏輯與匯編語言表示形式:andl rt, rs1, rs2操作說明:rt = rs1 & rs2編碼:(2)寄存器操作數與立即數的邏輯與匯編語言表示形式:andli rt, rs
16、, imm16操作說明:rt = rs & imm16,對imm16進行零擴展編碼:7、邏輯或這里實現的是無符號數的邏輯或。(1)寄存器操作數的邏輯或匯編語言表示形式:orl rt, rs1, rs2操作說明:rt = rs1 | rs2編碼:(2)寄存器操作數與立即數的邏輯或匯編語言表示形式:orli rt, rs, imm16操作說明:rt = rs | imm16,對imm16進行零擴展編碼:8、邏輯非這里只實現了寄存器操作數的邏輯非。匯編語言表示形式:notl rt, rs操作說明:rt = rs編碼:9、從存儲器取數據匯編語言表示形式:load rt, rs, imm16操作說明:r
17、t = memoryrs + imm16,對imm16進行符號擴展編碼:10、存儲數據到存儲器匯編語言表示形式:store rs1, rs2, imm16操作說明:memoryrs2 + imm16 = rs1,對imm16進行符號擴展編碼:11、無條件分支匯編語言表示形式:branch imm26操作說明:PC = PC + imm26,對imm26進行符號擴展編碼:12、相等則分支匯編語言表示形式:beq rs1, rs2, imm16操作說明:if(rs1 = rs2) PC = PC + imm16; else PC = PC + 1; 對imm16進行符號擴展編碼:6.3.5 數據通
18、路的建立前面我們討論了將要設計的SimpleRISC處理器的指令集和編碼,包括算術邏輯運算指令、存儲訪問指令和分支指令。這些指令的實現過程大致相同,而與具體的指令類型無關。實現每條指令的前兩步是一樣的:(1)程序計數器(PC)指向指令所在的存儲單元,并從中取出指令;(2)通過指令字段的內容,選擇讀取一個或兩個寄存器。對于取字(load)指令,只需讀取一個寄存器,而其他大多數指令要求讀取兩個。這兩步之后,為完成指令而進行的步驟則取決于具體的指令類型。然而,對三種指令類型(存儲訪問、算術邏輯和分支)的每一種而言,其動作大致相同,與具體操作碼無關。即使是不同類型的指令,也有一定的共性。例如,所有類型
19、的指令在讀取寄存器后,都要使用算術邏輯單元(ALU)。存儲訪問指令用ALU計算地址,算術邏輯指令用來執行運算,分支指令用ALU進行比較。可以看出,指令的簡潔和規整使許多指令的執行很相似,因而簡化了實現過程。使用ALU計算完成之后,不同類型指令需要進行不同的操作。存儲訪問指令需要對存儲單元進行讀出或寫入;算術邏輯指令需要將ALU產生的數據寫回寄存器中;而分支指令會根據比較的結果,決定是否需要更改下條指令的地址。圖6-52概括地描述了 SimpleRISC的實現方式。以下將介紹其細節。這里需要加入更多的功能部件,以及功能部件間的連接,當然還要有控制單元以控制不同類型指令需要執行的操作。圖6-52
20、SimpleRISC實現,包括主要的功能部件和它們之間的主要聯系開始設計數據通路比較合理的方法是先看看每種SimpleRISC處理器指令執行時所需的主要部件。先來看看每條指令需要什么數據通路部件,再用這些部件為每種指令類型建立其數據通路。在指出數據通路部件的同時,我們也會指出它們的控制信號。首先需要的部件是一個存儲程序指令的地方。一個存儲單元是一個狀態單元,它用來存儲指令,并根據所給地址提供指令,如圖6-53所示。指令的地址也必須存放在一個狀態單元中,我們稱之為程序計數器(PC),也在圖6-53中示出。最后,需要一個加法器增加PC的值以指向下條指令的地址。圖6-53 存取指令需要兩個狀態單元,
21、計算下條指令需要一個加法器要執行任何一條指令,首先要從存儲單元中將指令取出。為準備執行下一條指令,也必須把程序計數器加到指向下條指令,即向后移動4個字節。此時的數據通路,如圖6-54所示,使用了圖6-53中的3個部件。圖6-54 用于取指和程序計數器增值的數據通路的一部分現在討論R型指令(參見圖6-49)。這種指令讀兩個寄存器,對它們的內容進行ALU操作,再寫出結果。我們將這類指令稱為R型指令或算術邏輯指令(因為它們進行數學或邏輯運算)。這個指令集合包括前面介紹的add、sub、slt、and、or和not指令。這類指令的典型形式是add rt,rs1,rs2,它將讀取rs1和rs2,并將結果
22、寫回到rt。處理器的32個寄存器位于一個叫做寄存器堆(register file)的結構中。寄存器堆即是寄存器集合,其中的寄存器都可通過指定相應的寄存器號來進行讀寫。寄存器堆包含了計算機的寄存器狀態。另外,還需要一個ALU來對從寄存器讀出的數值進行運算。由于R型指令有3個寄存器操作數,對每條指令,都要從寄存器堆讀出兩個數據字,再寫入一個。為讀出一個數據字,寄存器堆需要一個輸入信號指定要讀的寄存器號和輸出信號指示從寄存器堆讀出的結果。為寫入一個數據字,寄存器堆要有兩個輸入:一個指定要寫的寄存器號,另一個提供要寫的數據。寄存器堆總是根據輸入的寄存器號輸出相應的寄存器內容,而寫操作由寫控制信號控制,
23、在寫操作發生的時鐘邊沿,寫控制信號必須是有效的。這樣,我們一共需要4個輸入(3個寄存器號和1個數據)和兩個輸出(兩個數據),如圖6-55所示。輸入的寄存器號為5位,可指示32個寄存器中的某一個(25=32),一條輸入總線和兩條輸出總線寬度均為32位。圖6-55中的ALU由3位控制信號控制,該ALU有兩個32位輸入,一個32位輸出。圖6-55 實現R型指令的ALU操作所需的兩個狀態單元:寄存器堆和ALU使用寄存器堆和圖6-55中的ALU的R型指令的數據通路如圖6-56所示。因為寄存器號來自指令字段,我們將圖6-54輸出的指令與寄存器堆的寄存器號輸入連在一起。圖6-56 R型指令的數據通路下面考慮
24、SimpleRISC取數據指令和存儲數據指令,其一般形式為:load rt,rs,imm16或store rs1,rs2,imm16在這類指令中,通過將基址寄存器rs或rs2的內容與指令中的16位帶符號偏移地址相加,得到存儲器地址。如果是存儲數據指令,要從寄存器rs1中讀出要存儲的數據;如果是取數據指令,則要將從存儲器中讀出的數存入指定的寄存器rt中。所以,圖6-55中的寄存器堆和ALU都將被用到。另外,還需要一個單元將16位的偏移地址符號擴展為32位的帶符號值,以及一個存儲讀出和寫入數據的單元。存儲單元在存儲指令時被寫入,所以它有讀、寫控制信號,地址輸入和要被寫入存儲器的數據輸入。圖6-57
25、給出了這兩個單元。圖6-57 取數據指令和存儲數據指令所需的兩個單元:數據存儲器和符號擴展單元圖6-58顯示了取指操作之后,所有上述單元如何構成取數據和存儲數據指令的數據通路。寄存器堆的寄存器號輸入由指令提供,偏移量也是這樣。經過符號擴展,偏移量成為ALU的另一個輸入。圖6-58 加入取數據和存儲數據指令之后的數據通路beq指令有2個操作數,其中兩個為寄存器,用于比較是否相等,另一個是16位偏移量,用以計算相對于分支指令所在地址的分支目標地址。除了計算分支目標地址,還必須確定是順序執行下一條指令,還是去執行分支目標地址處的指令。當分支條件為真(即操作數相等)時,分支目標地址成為新的PC,我們就
26、說實現了分支;若操作數不等,增值后的PC將取代當前PC(就像其他一般指令一樣),這時就說沒有實現分支。所以,分支數據通路需要進行兩個操作:計算分支目標地址和比較操作數。圖6-59所示為分支數據通路。圖6-59 分支指令的數據通路為計算分支目標地址,分支目標通路包含了一個如圖6-57所示的符號擴展單元和一個加法器。為進行比較操作,要由圖6-55的寄存器堆提供兩個寄存器操作數(但不需要向寄存器堆寫入數據)。另外,比較操作由ALU完成。無條件跳轉指令將偏移地址的低26位左移兩位后,以之代替PC的低28位(由于這里討論的指令地址是字節地址,而實際的一條指令有4個字節,所以低兩位指令地址無效)。到此為止
27、,我們已經討論過單獨的每種類型指令所需的數據通路,可以將它們合并成一個簡單的數據通路,并且加上控制部分,以達到完整的實現。6.3.6 完整的數據通路兩個不同類型指令共享一個數據通路部件時,需要給部件連接多個輸入,并設置控制信號以便在輸入中進行選擇。這種選擇通常由數據選擇器來實現。首先將圖6-56所示的算術邏輯指令數據通路和圖6-58所示的存儲器指令的數據通路進行合并,得到如圖6-60所示的數據通路。圖6-60 算術邏輯指令和存儲器指令的數據通路合并圖中,加入了一些數據選擇器及相應的控制信號。圖6-61所示的是加入的取指部分的數據通路。圖6-61 加入取指部分的數據通路現在,加上圖6-59所示的
28、分支指令的數據通路,我們可以把所有部件加在一起建立起SimpleRISC處理器的一個簡單數據通路。圖6-62給出了把獨立部件連在一起之后得到的數據通路。圖6-62 SimpleRISC處理器的數據通路圖中的指令和數據存儲器使用總線接口單元BIU來進行連接。在完成這個數據通路之后,可以加上控制單元。控制單元接受指令輸入,并產生每個狀態單元的同步信號,每個數據選擇器和ALU的控制信號。加入控制單元后的數據通路如圖6-63所示。圖6-63 有控制單元的完整數據通路6.3.7 SimpleRISC處理器的實現通過前面的介紹,我們知道SimpleRISC處理器需要設計如下子模塊:(1)算術邏輯單元;(2
29、)寄存器堆;(3)程序計數器;(4)總線接口單元;(5)控制器。以下分別介紹各個模塊的設計。一、算術運算單元算術邏輯單元根據輸入的操作碼,對兩個源操作數進行算術邏輯運算,并產生相應的輸出。程序6-6是算術邏輯單元ALU的設計。【程序6-6】timescale 1 ns / 1 nsmodule ArithmeticLogicUnit( nReset, Clock, OperationCode, Source1, Source2, Destination); input nReset, Clock; input 3:0 OperationCode; input 31:0 Source1, Sou
30、rce2; output 31:0 Destination; parameter ADD = 4d0, SUB = 4d1, SLT = 4d2, SL = 4d3, SR = 4d4, AND = 4d5, OR = 4d6, NOT = 4d7, CMP = 4d8; reg 31:0 Destination; always (negedge nReset or posedge Clock) begin if(!nReset) Destination = 32d0; else begin case(OperationCode) ADD : Destination = Source1 + S
31、ource2; SUB : Destination = Source1 - Source2; SLT : Destination = (Source1 Source2) ? 32d1 : 32d0; SL : Destination = Source1 Source24:0; SR : Destination Source24:0; AND : Destination = Source1 & Source2; OR : Destination = Source1 | Source2; NOT : Destination = Source1; CMP : Destination = (Sourc
32、e1 = Source2) ? 32d1 : 32d0; default : Destination = 32hxxxxxxxx; endcase end endendmodule二、寄存器堆寄存器堆具有三個地址輸入端口,一個數據總線輸入和兩個數據總線輸出端口。內部結構可以用圖6-64和圖6-65,其中,圖6-64表示寄存器堆的讀端口,而圖6-65表示寫端口。圖6-64 寄存器堆讀端口圖6-65 寄存器堆寫端口由此可以得到寄存器堆的Verilog HDL描述,參見程序6-7。寄存器堆設計中,假定0號寄存器總是0值,且不能寫入。【程序6-7】timescale 1 ns / 1 nsmodule
33、 GeneralPurposeRegister( nReset, Write, WriteAddress, WriteData, ReadAddress1, ReadAddress2, ReadData1, ReadData2); input nReset, Write; input 4:0 WriteAddress, ReadAddress1, ReadAddress2; input 31:0 WriteData; output 31:0 ReadData1, ReadData2; reg 31:0 GPRs31:1; integer i; always (negedge nReset or
34、 posedge Write) begin if(!nReset) for(i = 1; i = 31; i = i + 1) GPRsi = 32d0; else if(WriteAddress != 5d0) GPRsWriteAddress = WriteData; end assign ReadData1 = (| ReadAddress1) ? GPRsReadAddress1 : 32d0; assign ReadData2 = (| ReadAddress2) ? GPRsReadAddress2 : 32d0;endmodule三、程序計數器程序計數器輸入一個Branch用于判
35、斷是否發生跳轉,如果發生跳轉時,將程序計數器當前值加上輸入的偏移量PCBias作為下一條指令的地址;而如果沒有跳轉發生時,直接將程序計數器加1。這里需要注意,這里的程序計數器設計時考慮采用的是存儲器的字地址,所以增值是1,而不是前面圖6-59中的4。程序計數器的Verilog程序參見程序6-8。【程序6-8】timescale 1 ns / 1 nsmodule ProgramCounter(nReset, Clock, Branch, PCBias, PCValue); input nReset, Clock, Branch; input 31:0 PCBias; output 31:0 P
36、CValue; reg 31:0 PCValue; always (negedge nReset or posedge Clock) begin if(!nReset) PCValue = 32d0; else if(Branch) PCValue = PCValue + PCBias; else PCValue = PCValue + 1; endendmodule四、總線接口單元總線接口單元只是一些三態緩沖器,所以直接在SimpleRISC處理器的頂層設計中實現,而這里就不專門進行設計。五、控制器控制器需要根據不同的指令,產生不同的控制信號,以控制數據通路中的部件能同步工作,并且使得數據通
37、路中相應的數據選擇器作出正確的選擇。這里的控制器比較復雜,使用一個有限狀態機來實現,圖6-66給出了控制器的狀態轉移圖。圖6-66 控制器狀態轉移圖從圖中可以看出,SimpleRISC處理器的控制器具有5個狀態。起始狀態是取指狀態Fetch, Fetch狀態使得指令存儲器的讀控制信號有效,從而取到要執行的指令。取到指令之后,要對其進行譯碼,所以進入了第二個指令譯碼狀態Decode,Decode根據前一狀態取到的指令進行譯碼操作,產生相應的數據選擇器選擇信號等控制信號。指令譯碼之后,進入指令執行狀態Execute,這一步大多數指令使用ALU進行運算,然后根據指令類型選擇是進行存儲器操作還是直接將
38、運算結果寫回寄存器堆。對于存儲器訪問指令,執行狀態之后計算出進行存儲器訪問的地址,之后進入存儲器訪問狀態Memory進行相應的存儲器操作。對于其他不需要進行存儲器訪問的指令,直接進入寄存器回寫狀態Write,將計算結果寫回寄存器。程序6-9是控制器的Verilog實現。【程序6-9】timescale 1 ns / 1 nsmodule Controller( nReset, Clock, Instruction, ALUClock, GPRClock, PCClock, ALUCode, ALUSourceSelect, MemToReg, RegToMem, Branch, Uncondi
39、tionalBranch, RegSrc, RegDst, i_Read, d_Read, d_Write); input nReset, Clock; input 16:0 Instruction; output ALUClock, GPRClock, PCClock; output 3:0 ALUCode; output 1:0 ALUSourceSelect; output MemToReg, RegToMem; output Branch, UnconditionalBranch; output RegSrc, RegDst; output i_Read, d_Read, d_Writ
40、e; reg ALUClock, GPRClock, PCClock; reg 3:0 ALUCode; reg 1:0 ALUSourceSelect; reg MemToReg, RegToMem; reg Branch, UnconditionalBranch; reg RegSrc, RegDst; reg i_Read, d_Read, d_Write; parameter ADD = 4d0, SUB = 4d1, SLT = 4d2, SL = 4d3, SR = 4d4, AND = 4d5, OR = 4d6, NOT = 4d7, CMP = 4d8; parameter
41、Fetch = 5b00001, Decode = 5b00010, Execute = 5b00100, Memory = 5b01000, Write = 5b10000; reg 5:0 OperationCode; reg 4:0 State; always (negedge nReset or posedge Clock) begin if(!nReset) begin ALUClock = 1b0; GPRClock = 1b0; PCClock = 1b0; ALUCode = 4b0000; ALUSourceSelect = 2b00; MemToReg = 1b0; Reg
42、ToMem = 1b0; Branch = 1b0; UnconditionalBranch = 1b0; RegSrc = 1b0; RegDst = 1b0; i_Read = 1b0; d_Read = 1b0; d_Write = 1b0; OperationCode = 6b000000; State = Fetch; end else begin case(State) Fetch : begin ALUClock = 1b0; GPRClock = 1b0; PCClock = 1b0; ALUCode = 4b0000; ALUSourceSelect = 2b00; MemT
43、oReg = 1b0; RegToMem = 1b0; Branch = 1b0; UnconditionalBranch = 1b0; RegSrc = 1b0; RegDst = 1b0; i_Read = 1b1; d_Read = 1b0; d_Write = 1b0; OperationCode = 6b000000; State = Decode; end Decode : begin if(Instruction5:0 = 6b000000) / R-Type begin if(Instruction16:6 = 11h001) / add begin ALUCode = ADD
44、; ALUSourceSelect = 2b00; RegDst = 1b1; end else if(Instruction16:6 = 11h002) / sub begin ALUCode = SUB; ALUSourceSelect = 2b00; RegDst = 1b1; end else if(Instruction16:6 = 11h003) / slt begin ALUCode = SLT; ALUSourceSelect = 2b00; RegDst = 1b1; end else if(Instruction16:6 = 11h004) / and begin ALUC
45、ode = AND; ALUSourceSelect = 2b00; RegDst = 1b1; end else if(Instruction16:6 = 11h005) / or begin ALUCode = OR; ALUSourceSelect = 2b00; RegDst = 1b1; end else if(Instruction16:6 = 11h006) / not begin ALUCode = NOT; ALUSourceSelect = 2b11; RegDst = 1b1; end else / unimplement begin ALUCode = ADD; ALU
46、SourceSelect = 2b11; RegDst = 1b0; end MemToReg = 1b0; RegToMem = 1b0; Branch = 1b0; UnconditionalBranch = 1b0; RegSrc = 1b0; end else begin if(Instruction5:0 = 6b000001) / addi begin ALUCode = ADD; ALUSourceSelect = 2b10; MemToReg = 1b0; RegToMem = 1b0; Branch = 1b0; UnconditionalBranch = 1b0; RegSrc = 1b0; RegDst = 1b1; end else if(Instruction5:0 = 6b000010) / subi begin ALUCode = SUB; ALUSourceSelect = 2b10; MemToReg = 1b0; RegToMem = 1b0; Branch = 1b0; UnconditionalBranch = 1b0; RegSrc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45409-2025網絡安全技術運維安全管理產品技術規范
- 木結構建筑的日照模擬與優化考核試卷
- 畜牧養殖疫病防控技術的研發與推廣考核試卷
- 紙板容器操作人員素質提升考核試卷
- 稻谷種植農業產業鏈協同創新考核試卷
- 噴槍在現代建筑外墻涂裝的應用考核試卷
- 竹材采運項目管理與招投標實務考核試卷
- 燈具行業展會策劃與參展技巧考核試卷
- 西藏大學《第二外語1(日語)》2023-2024學年第二學期期末試卷
- 玉樹藏族自治州稱多縣2025屆三下數學期末教學質量檢測模擬試題含解析
- 2023年山東中煙工業有限責任公司人員招聘筆試試題及答案解析
- 環境規劃學污水排放分析
- 2023年新疆初中學業水平考試生物試卷真題(含答案)
- 中考冠詞專項訓練100題 (帶答案)
- 幼兒心理學(陳幗眉)期中考試試卷含答案
- 羅盤儀林地測量-羅盤儀林地面積測量(森林調查技術)
- 2023年北京高考數學答題卡(北京卷)word版可以編輯kh
- 電力現貨市場基礎知識
- 公司收支明細表
- 2023年電子產品營銷試題庫
- GB/T 7251.6-2015低壓成套開關設備和控制設備第6部分:母線干線系統(母線槽)
評論
0/150
提交評論