湘潭大學第6章 單周期CPU及其Verilog HDL實現_第1頁
湘潭大學第6章 單周期CPU及其Verilog HDL實現_第2頁
湘潭大學第6章 單周期CPU及其Verilog HDL實現_第3頁
湘潭大學第6章 單周期CPU及其Verilog HDL實現_第4頁
湘潭大學第6章 單周期CPU及其Verilog HDL實現_第5頁
已閱讀5頁,還剩87頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 5 章單周期CPU及其Verilog HDL實現學習指南 執行一條指令所需的硬件電路 與取指令有關有電路 寄存器計算類型指令執行所需的電路 立即數計算類型指令執行所需的電路 訪問存儲器類型指令執行所需的電路 條件轉移類型指令執行所需的電路 跳轉和子程序調用及返回類型指令執行所需的電路 寄存器堆設計 寄存器堆的硬件電路設計 結構描述風格的寄存器堆Verilog HDL代碼 功能描述風格的寄存器堆Verilog HDL代碼 數據路徑設計 多路選擇器的使用 單周期CPU的總體電路 單周期CPU的Verilog HDL代碼 控制部件設計 控制部件的邏輯設計 控制部件的Verilog HDL代碼 存

2、儲器及測試程序設計 數據存儲器設計 指令存儲器及測試程序設計 單周期CPU測試結果及說明處理器的工作過程簡介 CPU的執行過程: 首先將程序和數據輸入計算機的存儲器中,然后從主存中“程序入口(程序執行的第一條指令的地址)”開始依次取出指令和數據,并根據指令的要求對數據進行加工處理,得到需要的結果后,結束運行。 因此,控制器控制程序的執行過程實際上是控制指令的執行過程。 由于程序(指令序列)預先存放在存儲器中,所以指令執行的過程分為取指令和執行指令,如下圖。 假設程序和數據已經存放在主存中,執行指令執行步驟如下(要求記下來): 根據程序計數器PC的內容從主存中取出一條指令,放置于指令寄存器IR中

3、。 分析IR中的操作碼,決定應執行的操作。 根據IR的地址碼取出參加運算的操作數。 對操作數進行運算。 根據IR的地址碼把運算結果存放指定地址。 本條指令執行完畢,修改PC內容決定下一條指令所在的地址。 目前的計算機都屬于“同步”計算機。 同步計算機是指在計算機系統中有一個時鐘(Clock),計算機所有的動作都 以這個時鐘為基準。 如下圖的單周期波形。指令1指令2指令3指令4一個時鐘周期上升沿下降沿 單周期CPU是指一條指令的執行在一個時鐘周期內完成,然后開始下一條指令的執行,即一條指令用一個時鐘周期。5.1 執行一條指令所需的硬件電路 計算機的程序一般存在硬盤等輔存中。當計算機執行一個程序時

4、,首先由操作系統把要執行的程序從硬盤調入內存,然后CPU從內存讀出指令開始執行。注意:前提是操作系統已經調入內存并運行。 設計CPU硬件電路的目的是使其能夠從存儲器中讀取一條指令并執行指令所描述的操作,且這個過程是循環的,自動的。 注意 從存儲器中讀取指令的動作與指令本身的操作無關,所以可以對所有的指令以同樣的方法從內存中取出。 執行指令則與指令本身的意義密切相關。 因此最重要的是首先要搞清楚CPU要執行的每一條指令的意義(功能)。 以第5章列出的20條整數指令為例來對每一條指令的執行進行說明。 指令格式寄存器、立即數、跳轉等格式。 指令意義計算、訪存、條件轉移、無條件轉移等類型。5.1.1

5、與取指令有關的電路 CPU要執行指令,必須先把它從存儲器中讀出來,然后才能知道指令究竟要干什么。 而一般程序是連續執行的,且存放在內存中也是連續存放的,所以讀取并執行本條指令后,最有可能執行的是在本條件指令后的下一條指令,即地址+“1”條指令的長度。 注意:這里的“1”是指一條指令所占用的存儲空間。 為了指出下一條指令的位置(地址),最簡單的辦法是設置一個計數器用來指定指令的位置。該計數器稱為程序計數器PC(Program Counter)。 CPU取指令時是把PC的內容作為存儲器地址,根據它來訪問存儲器,從指定的存儲器單元中取出一條指令。 如果取出的指令執行時沒有引起轉移,則PC的值要+“1

6、”。 如果轉移,則要將目標地址寫入PC,以便在下一個時鐘周期取出下一條指令。 下圖是與取指令有關的電路。xxxxxxx0:xxxxxxx1:xxxxxxx2:xxxxxxx3:xxxxxxx4:xxxxxxx5:xxxxxxx6:xxxxxxx7:字節地址PC+4指令n指令n+1PC地址PC +a doInstMem地址40123Clock指令PC+4多路選擇器取指令及PC+“1”指令存儲器Inst Mem 說明: PC32位寄存器,由32個D觸發器構成。 a是地址輸入端。 do數據輸出端,即指令。 加法器完成PC+4運算。 多路選擇器用于選擇地址之一。 為什么要為什么要PC+4? 因為這里假

7、定指令的長度是固定的,即32位(個字節),所以每取一條指令后,PC都要加才能取互下一條指令。不考慮轉移時取指令的流程取指令startInst Mem-PCReadPC-PC+4Data out5.1.2 寄存器計算類型指令執行時所需的電路 指令從存儲器取出來后,要進行分析,分析該指令的操作什么?操作數如何獲取?等等。 根據設定的指令,可以畫出分析指令類型的流程圖如下。分析指令類型的流程取指令(已講)分析指令類型寄存器算術邏輯寄存器移位立即數置高位、加法立即數邏輯運算條件轉移無條件轉移 下面分類來說明每類指令的執行過程及所需的電路。先說明寄存器計算類指令。 add,sub,and,or,xor這

8、5條寄存器算術邏輯類型指令除了運算不同外,其他操作均相同。 sll,srl,sra寄存器移位類型指令除了移位方向不同外,其他操作均相同。寄存器算術邏輯類型指令 寄存器算術邏輯類型指令格式 從指令中可以看出,寄存器堆的數目為 2532個 所以rd,rt,rs是從這32個寄存器堆中選擇一個。 功能:從寄存器堆中讀出的2個數據(由rs,rt指定)分別被送到ALU的a和b的輸入端,結果存入由rd指定的寄存器中。func0rdrtrsop5 010 615 1120 1625 2131 26寄存器算術邏輯運算類型指令執行流程rd-rs op rtstartRegfile-IR(rs)Regfile-IR

9、(rt)Reada-Regfile(rs)b-Regfile(rt)aluc-funcRegfile-IR(rd)d-aluwrite表示將指令中的rs部分的代碼送到寄存器堆 endfunc0rdrtrsopPC +a doInstMem地址40123Clock指令PC+4pcsource執行寄存器算術邏輯類型指令所需的電路ControlUnitopfuncrswerna qarnb wn d qbrdrtRegfile a alucALU zb alucwreg 說明 Control Unit的輸入信號是op和func,輸出信號: ALU的操作控制碼aluc 計算結果是否寫入寄存器堆的控制信

10、號wreg 下一條指令的地址選擇信號pcsource ALU結果寫入的寄存器由rd指定。 有關Control Unit的具體設計將在后面描述。寄存器移位類型指令 寄存器移位類型指令格式 其中sa指定了移位的位數。 功能:把從寄存器rt中讀出的32位數據進行左移或右移sa位后,結果寫入由rd指定的寄存器。 移位的方向由func決定。funcsardrt0op5 010 615 1120 1625 2131 26寄存器移位類型指令執行流程startRegfile-IR(rt)Reada-IR(sa)b-Regfile(rt)aluc-funcRegfile-IR(rd)d-aluwriteendr

11、d-rt shift safuncsardrt0op執行寄存器移位類型指令所需的電路PC +a doInstMem地址40123Clock指令PC+4pcsourceControlUnitopfuncrswerna qarnb wn d qbrdrtRegfile a alucALU zb alucwregsa 由于sa只有5位,而a輸入端是32位,所以把sa必須放在低位,高27位可以是任何數據。 將上面2個電路結合在一起,只需要在ALU的a輸入端前加一個二選一的多路選擇器即可。具體是選擇qa還是sa,由取出來的指令確定。5.1.3 立即數計算類型指令執行時所需的電路 指令格式 包括addi,

12、andi,ori,xori和lui,由op進行區分。 共同特點是ALU的操作數b來自于立即數。 由于立即數只有16位,所以需要擴展到32位(符號位擴展 or 零擴展)。immediatertrsop立即數計算類型指令執行流程startRegfile-IR(rs)Readb-IR(imm,擴展)a-Regfile(rs)aluc-decode(op)Regfile-IR(rt)d-aluwriteendrt-rs op imm(擴展)lui: rt-imm16immediatertrsopPC +a doInstMem地址40123Clock指令PC+4pcsource執行立即數計算類型指令所需

13、的電路ControlUnitoprswerna qarnb wn d qbrtrtRegfile a alucALU zb alucwregimmesext 從上面可以看出,b輸入端為imm,再加上算術邏輯類型指令的輸入,所以b輸入端的前面也必須有一個二選一的多路選擇器。 符號擴展和零擴展是通過組件e來實現的。 sext=1,符號擴展。 sext=0,零擴展。 計算結果寫入由rt指定的寄存器中。5.1.4 訪問存儲器類型的指令執行時所需電路 訪問存儲器的指令格式 有2條: 讀指令(lw)-從數據存儲器中讀數據,寫入由rt指定的寄存器中。 寫指令(sw)-把rt寄存器的數據寫入存儲器中。 共同點

14、是都要計算存儲器地址。 操作數來源: 一個數是使用rs從寄存器堆中讀出的。 另一個數是把指令中的16位立即數imm進行符號擴展得到。兩個數相加是通過ALU完成的。immediatertrsop訪問存儲器類型指令執行的流程startRegfile-IR(rs)Readb-IR(imm,擴展)a-Regfile(rs)aluc-decode(op)Regfile-IR(rt)d-mem(addr)writeendlw:rt-memory(rs +imm(擴展)sw: memory(rs +imm(擴展) - rtReadR/WWritemem(addr)-aluReadmem(addr)-alum

15、em(d)- Regfile(rt)writeRegfile-IR(rt)ReadimmrtrsopPC +a doInstMem地址40123Clock指令p4pcsource執行訪問存儲器類型指令所需的電路ControlUnitoprswerna qarnb wn d qbrtrtRegfile a alucALU zb alucwregimmesextwea doDataMem di wmem 注意 由于這里討論的是單周期CPU的設計,所以需要 2個分開的存儲器模塊,即指令存儲器和數據存儲器。 如果使用一個存儲器模塊且存儲器模塊只有一個訪問端口,就無法在一個時鐘周期既讀取指令,又訪問數據

16、。 這里暫且“認為”2個存儲器模塊是 2個Cache模塊。5.1.5 條件轉移型指令執行時所需電路 指令格式 條件轉移指令這里只講beq和bne,功能如下: beq-if(rs=rt) PC-pc+4+imm2(符號擴展) bne-if(rs!=rt) PC-pc+4+imm2(符號擴展) PC的來源有 2個: 一個是PC+“1”。 另一個是pc+4+imm2(符號擴展) 。 此時需要對PC的輸入進行控制,即設置pcsource。 pcsource=00,pc-pc+“1” pcsource=01,pc-labelimmediatertrsop條件轉移型指令執行流程startRegfile-I

17、R(rs)Regfile-IR(rt)Readb-Regfile(rs)a-Regfile(rt)aluc- decode(op)mux4x32-p4+imm2(符號擴展)endbeq:if(rs=rt) pc-p4+imm2(符號擴展)bne:if(rs!=rt) pc-p4+imm2(符號擴展)yz=1&beq|z=0&bne?npcsource=01pc-mux4x32pcsource=00用一個加法器完成Imm符號擴展用一個移位器完成immrtrsopPC +a doInstMem地址40123Clock指令p4pcsource執行條件轉移類型指令所需的電路Contro

18、lUnitoprswerna qarnb wn d qbrtRegfile a aluc zALU rb alucwregimmesextz+5.1.6 跳轉和子程序調用與返回類型指令執行時所需電路 無條件轉移指令也能改變程序執行的流程,且是無條件的。 指令格式 有3條 j指令功能: pc-p431:28,(address2)27:0 jal指令功能:r31-pc+8, pc-p431:28 ,(address2)27:0 jr指令功能: pc-rsaddressop 從上面分析可以看出,PC的來源又增加了二個: pc-p431:28,(address2)27:0 pc-rs 故pcsourc

19、e又要賦予新的意義: pcsource=11:pc-p431:28,(address2)27:0 pcsource=10: pc-rs 下面畫出每條指令的流程圖j指令執行流程startmux4x32mux4x32-p431:28,(address2)27:0pcsource=11pcsource=11endpc-p431:28,(address2)27:0addressopPC +a doInstMem地址40123Clock指令p4pcsource執行 j指令所需的電路ControlUnitopaddr42832jal指令執行流程startr31-pc+4r31-pc+4mux4x32mux

20、4x32-p431:28,(address2)27:0pcsource=11pcsource=11endr31-pc+4pc-p431:28,(address2)27:0addressopPC +a doInstMem地址40123Clock指令p4pcsource執行jal指令所需的電路ControlUnitopwerna qarnb wn d qbRegfilewregaddr3142832jr指令執行流程startRegfile-IR(rs)Regfile-IR(rs)pcsource=11pcsource=11Mux4x32-regfile(rs)Mux4x32-regfile(rs)

21、endpc-rsaddressopPC +a doInstMem地址40123Clock指令p4pcsource執行jr指令所需的電路ControlUnitopwerna qarnb wn d qbRegfilewregrs5.2 寄存器堆設計 MIPS指令格式中的寄存器號(地址)有5位,所以共有32個寄存器。這些寄存器“堆在一起”構成一個寄存器堆(Register File)。 如何設計這個寄存器堆? 當然是根據前面指令的執行流程來設計,下面列表說明。從寄存器堆中讀寫數據個數一覽表指令類型讀出數據個數寫入堆中數據個數算術邏輯運算類指令21移位類指令11置高位指令11立即數運算類指令11讀數指

22、令11存數指令11條件轉移2子程序調用1子程序返回1 從表中可以看出 讀數端口最多需要2個。 寫數端口最多需要1。 給出的寄存器地址最多需要3個。 r0=0。 此外還給出下列信號 清零信號clrn-低電平有效。 時鐘信號clk-上升沿有效。 寄存器的寫使能we-we=0,讀;we=1,寫。 寄存器堆的電路符號及各信號的意義如下圖所示。rna4:0 qa31:0rnb4:0 qb31:0wn4:0 d31:0 we clrn Regfile讀端口a的寄存器號讀端口b的寄存器號寫端口寄存器號寫端口的32位數據寄存器堆的寫使能時鐘清零讀端口a的32位數據讀端口b的32位數據 除r0=0外,每一個寄存

23、器由32個D觸發器構成,它包括數據端d,時鐘信號clk,使能信號e,清零信號clrn(rst),輸出信號q。 由于有32個寄存器可供選擇,所以必須有一個5-32的譯碼器dec5e和一個32位的32選1的多路選擇器mux32x32。 這里32個32位的寄存器堆的輸出采用二維數組來描述。 q31:031:0-最左邊的31:0表示有32個寄存器,右邊的31:0表示每個寄存器有32位。d31:0 q31:031:0e31:0 clrn n4:0 e31:0ena a31:031:0 y31:0s4:0 a31:031:0 y31:0s4:0 reg32mux32x32mux32x32dec5erna4

24、:0rnb4:0d31:0wn4:0weclkclrnqa31:0qb31:0寄存器堆regfile電路gndbufq031:05.2.3 功能描述風格的寄存器堆Verilog HDL代碼module regfile32x32(rna,rnb,d,wn,we,clk,clrn,qa,qb); parameter data_width=32; parameter addr_width=5; parameter r_number=32; input addr_width-1:0 rna,rnb,wn; input data_width-1:0 d; input we,clk,clrn;/ we=0

25、,讀;we=1,寫 output data_width-1:0 qa,qb; reg data_width-1:0 register1:r_number-1; integer i; /2 read port assign qa=(rna=0)?0:registerrna; assign qb=(rnb=0)?0:registerrnb; /1 write port always (posedge clk or negedge clrn) if(clrn=0) for(i=0;i32;i=i+1) registeri=0; else if (wn!=0)&we) registerwn=d

26、;endmodule5.3 數據路徑設計 CPU的電路包括 數據路徑 or 數據通路(Datapath) 控制部件(Control Unit) 本節介紹單周期CPU的總體數據路徑,并給出代碼。5.3.1 多路選擇器的使用 通過前面介紹的每一條指令執行時所需的硬件電路。有些部件的輸入源不止一個,解決這種輸入源沖突問題的辦法是使用多路選擇器。 從前面的電路圖可以看出: rs是從regfile中取出數據,送入ALU的a輸入端。 rt是從regfile中取出數據,送入ALU的b輸入端。 結果是寫入regfile中的wn指定的寄存器。 下面介紹使用多路選擇器的情況和場合。1、下一條指令地址的選擇 控制信

27、號pcsource 除程序不轉移時下一條指令的地址是PC+4外,還有5條指令會引起程序轉移。 beq/bne rs,rt,label #ifpc-label jr rs #pc-rs j/jal address #pc-address*4 按理講應該有6個輸入,一個輸出,即應該設計一個6選1的多路選擇器。但是beq/bne和j/jal計算轉移地址的方法是一樣的,只需要控制好,可以減少為4個輸入源。 具體情況如下表所示指令轉移條件計算地址pcsource編碼順序pc-pc+400beqrs=rtpc-pc+4+imm2(符號擴展)01rs!=rtpc-pc+400bners!=rtpc-pc+4

28、+imm2(符號擴展)01rs=rtpc-pc+400jrpc-rs10jpc-p431:28,(address2)27:011jalpc-p431:28,(address2)27:011 下面的問題是如何形成pcsource? 根據前面的表格,可以得到如下pcsource形成的表格。 注:助記符為op的二進制代碼相與為1。pcsource編碼條件計算地址00順序| beq&rs!=rt |bne& rs=rtpc-pc+401beq&rs=rt |bne& rs!=rtpc-pc+4+imm2(符號擴展)10jrpc-rs11j | jalpc-p431:28

29、,(address2)27:0PC +a doInstMem地址40123Clock指令p4pcsource下一條指令地址選擇(4個數據源)ControlUnitoprswerna qarnb wn d qbrtRegfile a aluc zALU rb alucwregimmesextz+func0:pc+4 1:BranchAddr2:RegAddr 3:JumpAddr addr2、ALU的a輸入端 控制信號shift 以下面2條寄存器操作指令為例說明。 add rd,rs,rt ;rd-rs+rt sll rd,rt,sa ;rd-rtsa 從上面的注釋中可以看出,rd,rt是相同的

30、,而rs,sa是不同的。 根據前面設計的ALU32可知,移位運算時,sa是從a輸入端輸入,寄存器算術邏輯時a輸入端輸入1個數,故a輸入端有2個數據源。而rt作為ALU的b輸入端,兩者皆可用。 因此使用了一個2選1的多路選擇器從2個數據源中選擇1個送到ALU的a輸入端。 控制信號shift的設置如下。shift條件0add| sub |and|or|xor1sll | srl | sraPC +a doInstMem地址40123Clock指令p4pcsourceALU輸入端a的2個數據源ControlUnitoprswerna qarnb wn d qbrtRegfile a aluc zAL

31、U rb alucwregsafunc01shiftrd3、ALU的b輸入端和寄存器堆的wn輸入端 以下面2條指令為例說明。 add rd,rs,rt ;rd-rs+rt addi rt,rs,imm ;rt-rs+imm(符號擴展) 從上面注釋中可以看出, rs是相同的,送入ALU的a輸入端。 add指令的rt數據要送到ALU的b輸入端,addi指令的imm (符號擴展)也要送到ALU的b輸入端,所以ALU的b輸入端有2個數據源。 另外寄存器堆的wn也有2個數據源 add指令的rd addi指令的rt 因此使用了一個2選1的多路選擇器從2個數據源中選擇1個送到ALU的b輸入端。控制信號為al

32、uimm。 使用了一個2選1的多路選擇器從2個數據源中選擇1個送到寄存器堆的wn端。控制信號為regrt。 控制信號aluimm和regrt的設置如下。regrt條件0add| sub |and|or|xor1addi | andi | ori | xorialuimm條件0add| sub |and|or|xor1addi | andi | ori | xoriPC +a doInstMem地址40123Clock指令p4pcsourceALU輸入端b的2個數據源和寄存器堆輸入端wn的2個數據源ControlUnitoprswerna qarnb wn d qbrtRegfile a alu

33、c zALU rb alucwregsafunc01shiftrt01regrtesextimm01aluimmrd4、寄存器堆的d輸入端 以下面3條指令為例說明。 add rd,rs,rt ; rd-rs+rt lw rt,offset(rs) ; rt-mem(rs+offset) jal address ; r31-pc+4,pc-address2 這里主要看寫入寄存器堆: 數據來源-ALU輸出 or mem or pc+4 控制信號m2reg。 地址wn-rd,rt,r31(11111) 控制信號jal 實現 數據來源使用2個2選1的多路器從三個數據源中選出一個。多路選器的選擇信號分別

34、為m2reg和jal。 由于jal指令總是把返回地址寫入r31(11111b),因此在電路中增加了一個小模塊f,該模塊的功能如下: assign wn=reg_dest 5jal 電路圖如下。PC +a doInstMem40123Clockp4pcsource寄存器堆輸入端d的3個數據源ControlUnitoprswe rna qarnb Regfilewn qbd rt aaluc zALU rb alucwregsafunc01shiftrt01regrtesextimm01aluimmrdf01jalwe a doDataMemdi wmem01m2regalu_balu_aresu

35、ltnextpcpcplus4npclinkreg_wn5.3.2 單周期CPU總體電路 綜合以上討論的各種情況,可以得到如下圖所示的單周期CPU的總體電路。 該電路必須能夠執行前面列出的20條指令。PC +a doInstMem40123Clockp4pcsource單周期CPU+指令存儲器+數據存儲器的總體電路ControlUnitoprswe rna qarnb Regfilewn qbd rt aaluc zALU rb alucwregsafunc01shiftrt01regrtesextimm01aluimmrdf01jalzaddr dataout31:0a31:0 inst31

36、:0inst31:0 pc31:0mem31:0 alu31:0resetn data31:0 wmemsccpu_dataflowscinstmemscdatamemclockresetnmem_clkpc31:0inst31:0alu31:0單周期CPU+指令存儲器+數據存儲器的模塊圖5.3.3 單周期CPU的Verilog HDL代碼 下面是單周期計算機的Verilog HDL代碼。它調用 了: 單周期CPU模塊sccpu_dataflow 指令存儲器模塊scinstmeme 數據存儲器模塊scdatameme 將在稍后討論控制部分和存儲器模塊的設計方法include sccpu_dat

37、aflow.vmodule sccomp_dataflow(clock,resetn,inst,pc,aluout,memout,mem_clk); parameter width=32; input clock,resetn,mem_clk; output width-1:0 inst,pc,aluout,memout; wire width-1:0 data; wire wmem; sccpu_dataflow s(clock,resetn,inst,memout,pc,wmem,aluout,data); scinstmem imem(pc,inst); scdatamem dmem(c

38、lock,memout,data,aluout,wmem,mem_clk,mem_clk);endmodule單周期CPU模塊的代碼sccpu_dataflow.vinclude scinstmem.vinclude scdatamem.vinclude sccu_dataflow.vinclude mux2x32.vinclude dff32.vinclude cla32.vinclude mux2x5.vinclude regfile32x32.vinclude alu32.vmodule sccpu_dataflow(clock,resetn,inst,mem,pc,wmem,alu,d

39、ata); parameter width=32; input width-1:0 inst,mem; input clock,resetn; output width-1:0 pc,alu,data; output wmem; wire width-1:0 p4,bpc,npc,adr,ra,alua,alub,res,alu_mem; wire 3:0 aluc; wire 4:0 reg_dest,wn; wire 1:0 pcsource; wire zero,wmem,wreg,regrt,m2reg,shift,aluimm,jal,sext,carry_out; wire wid

40、th-1:0 sa=27b0,inst10:6; wire width-1:0 offset=imm13:0,inst15:0,2b00; sccu_dataflow cu(inst31:26,inst5:0,zero,wmem,wreg,regrt,m2reg,aluc,shift,aluimm,pcsource,jal,sext); wire e=sext&inst15; wire 15:0 imm=16e; wire width-1:0 immediate=imm,inst15:0; dff32 ip(npc,clock,resetn, pc); cla32 pcplus4(pc

41、,32h4,1b0,p4,carry_out); cla32 br_adr(p4,offset,1b0,adr,carry_out); wire width-1:0 jpc=p431:28,inst25:0,2b00; mux2x32 alu_b(data,immediate,aluimm,alub); mux2x32 alu_a(ra,sa,shift,alua); mux2x32 result(alu,mem,m2reg,alu_mem); mux2x32 link(alu_mem,p4,jal,res); mux2x5 reg_wn(inst15:11,inst20:16,regrt,r

42、eg_dest); assign wn=reg_dest| 5jal; mux4x32 nextpc(p4,adr,ra,jpc,pcsource,npc); regfile32x32 rf(inst25:21,inst20:16,res,wn,wreg,clock,resetn,ra,data); alu32 alu_unit(alua,alub,aluc,alu,zero);endmodule5.4 控制部分設計 處理器CPU由運算部分(運算器)和控制部分(控制器)組成。 控制器向計算機中各個部件發出控制信號,指揮與協調各個部件工作,使數據沿指定的路徑流動,從而完成整個指令的功能。 下面的

43、問題是如何發出控制信號,如: pcsource jal 等等5.4.1 控制部分的邏輯設計 首先根據指令中的6位操作碼對指令進行譯碼,看是什么操作。 如果op=0,則需要再檢查6位的func。 如下表所示。指令操作碼一覽表指令31:26-op 5:0-func指令31:26-opadd000000100000addi001000sub000000100010andi001100and000000100100ori001101or000000100101xori001110 xor000000100110lw100011sll000000000000sw101011srl000000100010

44、beq000100sra000000000011bne000101jr000000001000lui001111這里以上指令的op都相同,可以行計算出來。j000010jal000011 根據上表可以得到以下典型指令的邏輯表達式(未化簡,要保證邏輯表達式的值=1) r_type=op5&op4&op3&op2&op1&op0 i_add=r_type&func5&func4&func3&func2& func1&func0 i_sra=r_type&func5&func4&func3

45、&func2& func1&func0 i_jr=r_type&func5&func4&func3&func2& func1&func0 i_xori= =op5&op4&op3&op2&op1&op0 i_sw=op5&op4&op3&op2&op1&op0 i_beq=op5&op4&op3&op2&op1&op0 i_jal=op5&op4&op3&op2&op1&a

46、mp;op0加上i是為了防止與V_HDL語言的關鍵字沖突 下面開始重要的工作:確認每條指令執行時,控制信號應產生什么值。 根據前面分析每條指令的執行過程及所需電路,我們得到了10個控制信號。如下表所示。控制信號功能信號值作用wreg寫寄存器1寫寄存器,0不寫regrt目的寄存器號是rt1選擇rt,0選擇rdjal子程序調用1指令為jal,0不是m2reg存儲器數據寫入寄存器1選擇存儲器數據,0選擇ALU結果。shiftALU a使用移位位數 1使用移位位數,0使用寄存器數據aluimmALU b使用立即數1使用立即數,0使用寄存器數據sextALU操作控制1符號擴展,00擴展aluc3:0寫存

47、儲器見P123 圖4.6wmem寫存儲器1寫存儲器,0不寫pcsource1:0下一條指令地址選擇00pc+4; 01選轉移地址10選寄存器內的地址; 11 選跳轉地址 然后現看一下哪些指令使用了上表中的信號。 根據前面指令執行的過程及所需電路,可以得到每條指令使用的信號如下表所示。 注:X為未使用。 僅列出add,sra,jr,xori,sw,beq,j,jal,其他指令暫未列出。指令zwregregrtjalm2regshiftaluimmsextaluc3:0wmempcsource1:0addx100000Xx000000sraX100010X1111000jrX0XXXXXXxxxx

48、010 xoriX1100010X010000swX0XXX011X000100beq00XXX001X010000beq10XXX001X010001jX0XXXXXXxxxx011jalx1x1xxxxxxxx011 下面寫出各個控制信號的邏輯表達式以wreg為例: wreg=i_add | i_sra | i_xori | i_jal | 單周期CPU控制部件是一個組合電路,所有的輸出信號大致分為3類: 多路器的選擇信號 寫使能信號 ALU操作為控制信號 可以對邏輯表達式化簡,但不是本課程的主要工作。5.4.2 控制部件的Verilog HDL代碼module sccu_dataflow

49、(op,func,z,wmem,wreg,regrt,m2reg,aluc,shift,aluimm,pcsource,jal,sext); input 5:0 op,func; input z; output wreg,regrt,jal,m2reg,shift,aluimm,sext,wmem; output 3:0 aluc; output 1:0 pcsource; wire r_type=|op; wire i_add=r_type&func5&func4&func3&func2&func1&func0; wire i_sub=r_ty

50、pe&func5&func4&func3&func2&func1&func0; wire i_and=r_type&func5&func4&func3&func2&func1&func0; wire i_or=r_type&func5&func4&func3&func2&func1&func0; wire i_xor=r_type&func5&func4&func3&func2&func1&func0;

51、wire i_sll=r_type&func5&func4&func3&func2&func1&func0; wire i_srl=r_type&func5&func4&func3&func2&func1&func0; wire i_sra=r_type&func5&func4&func3&func2&func1&func0; wire i_jr=r_type&func5&func4&func3&func2&fu

52、nc1&func0; wire i_addi=op5&op4&op3&op2&op1&op0; wire i_andi=op5&op4&op3&op2&op1&op0; wire i_ori=op5&op4&op3&op2&op1&op0; wire i_xori=op5&op4&op3&op2&op1&op0; wire i_lw=op5&op4&op3&op2&op1&op0; wir

53、e i_sw=op5&op4&op3&op2&op1&op0; wire i_beq=op5&op4&op3&op2&op1&op0; wire i_bne=op5&op4&op3&op2&op1&op0; wire i_lui=op5&op4&op3&op2&op1&op0; wire i_j=op5&op4&op3&op2&op1&op0; wire i_jal=op5&op4&

54、;op3&op2&op1&op0; assign wreg=i_add|i_sub|i_and|i_or|i_xor|i_sll|i_srl|i_sra| i_addi|i_andi|i_ori|i_xori|i_lw|i_lui|i_jal; assign regrt=i_addi|i_andi|i_ori|i_xori|i_lw|i_lui; assign jal=i_jal; assign m2reg=i_lw; assign shift=i_sll|i_srl|i_sra; assign aluimm=i_addi|i_andi|i_ori|i_xori|i_l

55、w|i_lui|i_sw; assign sext=i_addi|i_lw|i_sw|i_beq|i_bne; assign aluc3=i_sra; assign aluc2=i_sub|i_or|i_srl|i_sra|i_ori|i_lui; assign aluc1=i_xor|i_sll|i_srl|i_sra|i_xori|i_beq|i_bne|i_lui; assign aluc0=i_and|i_or|i_sll|i_srl|i_sra|i_andi|i_ori; assign wmem=i_sw; assign pcsource1=i_jr|i_j|i_jal; assig

56、n pcsource0=i_beq&z|i_bne&z|i_j|i_jal;endmodule5.5 存儲器及測試程序設計 5.5.1 數據存儲器設計 采用使用數組來實現,數據及代碼如下。module scdatamem(clk,dataout,datain,addr,we,inclk,outclk); parameter data_width=32; parameter addr_width=32; input data_width-1:0 datain; input addr_width-1:0 addr; input clk,we,inclk,outclk; output data_width-1:0 dataout; reg data_width-1:0 ram0:addr_width-1; integer i; assign dataout=ramaddr6:2; always (posedge clk) begin if(we) ramaddr6:2=datain

溫馨提示

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

評論

0/150

提交評論