



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精品文檔計算機與信息學院系統(tǒng)硬件綜合設(shè)計課程設(shè)計報告學生姓名:李學號:1234567890專業(yè)班級:計算機2017 年07 月 01日.精品文檔一、實驗原理及設(shè)計本次試驗我主要根據(jù)上圖進行理解和編程,起先參考了5 個基礎(chǔ)實驗, 期間又翻閱了自己動手寫 cpu,并且在網(wǎng)上查了很多資料,下面我將對該圖做出我的理解和設(shè)計:1.pcf 部分always (posedge Clk)beginPCPlus4F_Reg = PCPlus4F;if (BranchM&ZeroM) PCF = PCBranchM;else PCF = PCPlus4F;InstructionF_Reg = Instru
2、ctionF;if (InstructionF31:26 = 6'b000010)beginPCF = 6'h0,InstructionF25:0;PCF = PCF << 2;endEndassign PCPlus4F = PCF + 4;assign ImemRdAddrF = PCF;每個時鐘上升沿到來,根據(jù)上一個時鐘的 PCSrcM判斷是否為分支指令,若是,則選擇PCBranchM作為這個時鐘的指令地址,否則選 PCF+4作為這個指令的指令地址,另外對于 J 類指令,我設(shè)計了一個特定的 OpCode=“ 000010”,即為跳轉(zhuǎn)指令,因為每個指令以字節(jié)格式存
3、儲,占用 ,4 個字節(jié),故將后 26 位立即數(shù)進行位擴展后將其左移兩位,效果等同于乘 4,再將其賦值給 PCF,這樣下一跳的指令地址即為所要跳轉(zhuǎn)的地址。對于這個部分, 我起先是準備將其設(shè)計成一個模塊的, 之后由于模塊接口連接時出現(xiàn)了無法解決的錯誤:輸出PCF要作為 Instruction Memory的輸入,又要作為自身模塊下一跳的輸入,導致三者關(guān)聯(lián)一起變化, 程序報錯,后來我又想到將PCF的輸出改成兩個, PCFout及 PCFnext,PCFout 作為 InstructionMemory的輸入, PCFnext 作為自身模塊下一跳的輸入,但是程序仍無法正常運行, 最后我想到了在 top
4、模塊中對 PCF進行處理并得以實現(xiàn)。.精品文檔2.Instruction Memory模塊initialbegin$readmemh("instruction", InstMem, 8'h0);endalways (ImemRdAddr)beginInstruction <= InstMemImemRdAddr>>2;end這個模塊很簡單,主要是通過instructin文檔來存儲指令,以PCF作為地址取出指令輸出至 Control , SignExtend , Register三個模塊。3.Ctr 模塊always (OpCode)begincas
5、e(OpCode)/ R-I/ addiu 6'b001001: beginRegDstD = 1; ALUSrcD = 1; MemtoRegD = 0; RegWriteD = 1;MemWriteD = 0;BranchD = 0;ALUOp = 2'b10;end/addi.endcaseendalways (ALUOp or Funct)begincasex(OpCode ,ALUOp, Funct)14'b10001100xxxxxx: ALUControlD = 5'b00010; / LW : add14'b00010001xxxxxx:
6、 ALUControlD = 5'b00110; / SW : substract beq.endcaseendendmodule.精品文檔Control模塊主要對來自InstructionMemory模塊的指令進行分解,得到OpCode(指令高六位 ) ,F(xiàn)unct(指令低六位),在通過分析 OpCode得到 RegDstD,ALUSrcD ,MemtoRegD, RegWriteD ,BranchD ,ALUOp這六個信號量, 用于后面的運算, 再使用 OpCode,ALUOp,Funct 三者的組合對指令的運算方法進行分析,得到相應的ALUControlD 輸出至 ALU模塊。4
7、.Register 模塊initialbegin$readmemh("register", regFile, 32'h0);end/ write on falling clock edgealways (posedge Clk)beginif(RegWrite = 1'b1)regFileRegWrAddr <= RegWrData;endassign RegARdData = (RegARdAddr >= 0)? regFileRegARdAddr:0; assign RegBRdData = (RegBRdAddr >= 0)? reg
8、FileRegBRdAddr:0;通過信號量 RegWrite 來判斷讀寫操作, RegWrite=1 即為寫操作, 0 為讀操作,讀寫皆操作于建立的 register 文檔中,另在 top 模塊中有assign RegARdAddr = InstructionD25:21;assign RegBRdAddr = InstructionD20:16;對寄存器地址賦值,register讀出的兩個數(shù)可供ALU選擇使用。5.ALU 模塊assign Zero = (ALURes = 0)? 1:0;/ALURes 0跳轉(zhuǎn)always (SrcA or SrcB or ALUCtr)beginOver
9、Flow = 0;TmpForSrcB = 0;HI=0;LO=0;A=0;B=0;case(ALUCtr)5'b10011:beginTmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;.精品文檔ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB31 && ALURes31 = SrcA31)beginOverFlow = 1'b0;endelseif (SrcA31 = TmpForSrcB31 &
10、;& ALURes31 != SrcA31)beginOverFlow = 1'b1;end.default: ALURes = 32'h0;endcaseendALU模塊進行的是運算操作, 本模塊通過來自 Control 模塊的 ALUCtr 判斷所要執(zhí)行的運算,在通過 Register 模塊讀出的值或者從 Instruction 中得到的立即數(shù)進行運算,結(jié)果 ALURes根據(jù)信號量 MemToReg來判斷是否寫入 DataMemory,這一塊寫在 top 中,另外ALU還對 Zero 信號量進行了賦值, Zero 信號量用于對分支指令的判斷。6.Data Memor
11、y 模塊initialbegin$readmemh("Data", DataMem, 10'h0);endalways (posedge Clk)beginif(DmemWrite = 1'b1)DataMemDmemAddr>>2 <= DmemWrData;endassign DmemRdData = (DmemWrite = 1'b0)? DataMemDmemAddr>>2:0; endmodule本模塊通過從 Ctr 模塊得來的信號量 DmemWrite選擇進行讀寫操作, 讀寫皆操作于所建立的 Data 文檔,
12、另外 DmemAddr左移兩位跟上述 PCF左移兩位異曲同工。7.top 模塊這個模塊相比前面的 6 個模塊要復雜得多,也是我在實驗時出現(xiàn)問題最多,所花時間最長的模塊。 Top 模塊主要用于各個模塊之間的數(shù)據(jù)連接,以及一些模塊外的操作。PCF的設(shè)計我是放在這個模塊的,另外像二選一數(shù)據(jù)選擇器我也是放在這里的,本來是寫了一個小模塊來做這個工作,但是本次試驗用到太多次二選一數(shù)據(jù)選擇器了,為了防止數(shù)據(jù)傳輸紊亂,我決定在 top中解決這個小操作。由于本模塊代碼太長,這里就不一一闡.精品文檔述,僅以 Ctr 的例化和接口連接為例簡要說明:Ctr Ctr(.OpCode(OpCode),.Funct(Fun
13、ct),.RegWriteD(RegWriteForCtrD),.MemtoRegD(MemtoRegD),.MemWriteD(MemWriteD),.BranchD(BranchD),.ALUControlD(ALUControlD),.ALUSrcD(ALUSrcD),.RegDstD(RegDstD);assign OpCode = InstructionD31 : 26;assign Funct = InstructionD5 : 0;assign RegWrDataD = (MemtoRegW)? ReadDataW : ALUOutW;always (posedge Clk)be
14、ginMemtoRegD_Reg = MemtoRegD;MemWriteD_Reg = MemWriteD;BranchD_Reg = BranchD;ALUControlD_Reg = ALUControlD;ALUSrcD_Reg = ALUSrcD;RegDstD_Reg = RegDstD;end輸入來源OpCode 來自于取指階段Instruction的高6 位, Funct來自于取指階段Instruction的低6 位, RegWriteD 通過信號量MemToRegW來選擇ReadDataW 或ALUOutW,輸出信號量 MemtoRegD,MemWriteD, BranchD
15、,ALUControlD ,ALUSrcD, RegDstD 作為 Reg 模塊的輸入。二、指令設(shè)計本次試驗實現(xiàn)了3 種 34 條指令,實驗時原以為指令格式為固定的,查閱很多資料都沒得到想要的OpCode與指令操作一一對應的關(guān)系,問了指導實驗的學長才知道,OpCode是自己設(shè)計的,后又參考自己動手寫cpu的指令設(shè)計技巧,才總結(jié)設(shè)計出指令。3 種指令:.精品文檔R 類型:具體操作由 OpCode,F(xiàn)unct 來控制, rs,rt 為源寄存器, rd 為目的寄存器, sa 為移位位數(shù)。I 類型:具體操作由 OpCode 控制, 低 16 位是立即數(shù), 經(jīng)過位擴展作為另一個源操作數(shù)參與用算。J 類型
16、:具體操作由OpCode 控制,一般是跳轉(zhuǎn)指令,低26 位經(jīng)過位擴展作為目標地址。34條 指令:32b101011 00001 00100 000000000000010ALURes = SrcA - SrcB;Store 指令,判斷 00001 號寄存器的值是否等于 00100 號寄存器的值,若相等,則當前指令地址加 00000000000000010 ,否則執(zhí)行下一條指令;32b000000 00001 00010 00011 00000 100000TmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + Tm
17、pForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB31 && ALURes31 = SrcA31)beginOverFlow = 1'b0;endelseif (SrcA31 = TmpForSrcB31 && ALURes31 != SrcA31)beginOverFlow = 1'b1;endAdd 指令,有符號加法指令, 實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行有符號加法,結(jié)果放到 00003 號寄存器中;32b000101 00001 00010 00
18、00000000000010ALURes = (SrcA - SrcB);Bne 指令,實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行比較,若不相等,則當前指令地址加 00000000000000010 ,否則執(zhí)行下一條指令;.精品文檔32b000100 00001 00010 0000000000000010ALURes = SrcA - SrcB;Beq 指令,實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行比較,若相等,則當前指令地址加 00000000000000010 ,否則執(zhí)行下一條指令;32b000001 00001 00000 000000000000
19、0010ALURes = (SrcA >= 0)?0:1;Bgez 指令,實現(xiàn)00001 號寄存器的值與0 比較,若大于等于0,則當前指令地址加00000000000000010,否則執(zhí)行下一條指令;32b000111 00001 00000 0000000000000010ALURes = (SrcA > 0)?0:1;Bgtz指令,實現(xiàn)00001 號寄存器的值與0 比較,若大于0, 則當前指令地址加00000000000000010,否則執(zhí)行下一條指令;32b000110 00001 00000 0000000000000010ALURes = (SrcA <= 0)?0
20、:1;Blez指令,實現(xiàn)00001 號寄存器的值與0 比較,若小于等于0,則當前指令地址加00000000000000010,否則執(zhí)行下一條指令;32b010001 00001 00000 0000000000000010ALURes = (SrcA < 0)?0:1;Bltz指令,實現(xiàn)00001 號寄存器的值與0 比較,若小于0, 則當前指令地址加00000000000000010,否則執(zhí)行下一條指令;32b100011 00001 00010 00011 00000 100001ALURes = SrcA + SrcB;Addu 指令,無符號加法指令,實現(xiàn)將 00001 號寄存器和
21、00002 號寄存器的值進行無符號加法,結(jié)果放到 00003 號寄存器中;32b100011 00001 00010 00011 00000 100011ALURes = SrcA - SrcB;subu 指令,無符號減法指令,實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行無符號減法,結(jié)果放到 00003 號寄存器中;32b000000 00001 00010 00011 00000 100100ALURes = SrcA & SrcB;And 指令,與操作,實現(xiàn)將00001 號寄存器和00002 號寄存器的值進行與操作,結(jié)果放到00003 號寄存器中;32b000000
22、 00001 00010 00011 00000 100101ALURes = SrcA | SrcB;OR 指令,或操作,實現(xiàn)將 00001 號寄存器和00002 號寄存器的值進行或運算,結(jié)果放到 00003.精品文檔號寄存器中;32b000000 00001 00010 00011 00000 101010ALURes = SrcA < SrcB ? 1:0;slt 指令,有符號比較操作,實現(xiàn)將00001 號寄存器和00002 號寄存器的值進行有符號比較,若 SrcA < SrcB ,則置 1,否則置 0;32b000000 00001 00010 00011 00000 10
23、1010ALURes = SrcA < SrcB ? 1:0;sltu 指令,無符號比較操作, 實現(xiàn)將 00001 號寄存器和00002 號寄存器的值進行無符號比較,若 SrcA < SrcB ,則置 1,否則置 0;32b000000 00001 00010 00011 00000 011010ALURes = SrcA / SrcB;LO = SrcA / SrcB;HI = SrcA % SrcB;div 指令,有符號除法指令, 實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行有符號除法,結(jié)果放到 00003 號寄存器中;32b000000 00001 00010
24、 00011 00000 011000A = SrcA31:31?32'hffffffff, SrcA : 32'h00000000, SrcA;B = SrcB31:31?32'hffffffff, SrcB : 32'h00000000, SrcB;Temp = A * B ;ALURes = Temp31:0;HI = Temp63:32;LO = Temp31:0;mul 指令,有符號乘法指令, 實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行有符號乘法,結(jié)果放到 00003 號寄存器中;32b000000 00001 00010 00011
25、 00000 000100ALURes = (SrcB << SrcA);sllv 指令,邏輯可變左移指令,實現(xiàn)將00001 號寄存器的值左移00002 號寄存器的值位,結(jié)果放到 00003 號寄存器中;32b000000 00001 00010 00011 00000 000100ALURes = (SrcB >> SrcA);srlv 指令,邏輯可變右移指令,實現(xiàn)將 00001 號寄存器的值右移 00002 號寄存器的值位,結(jié)果放到 00003 號寄存器中;32b000000 00001 00010 00011 00000 100110ALURes = (SrcB
26、>> SrcA);xor 指令,異或指令,實現(xiàn)將00001 號寄存器的值和00002 號寄存器進行異或,結(jié)果放到00003 號寄存器中;.精品文檔32b000000 00001 00010 00011 00000 100110ALURes = (SrcA SrcB);xor 指令,異或指令,實現(xiàn)將00001 號寄存器的值和00002 號寄存器進行異或,結(jié)果放到00003 號寄存器中;32b001001 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addiu 指令,無符號立即數(shù)加法指令, 實現(xiàn)將 00001 號寄存器的值和立即
27、數(shù)進行無符號加法,結(jié)果放到 00003 號寄存器中;32b001100 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addi 指令,有符號立即數(shù)加法指令, 實現(xiàn)將 00001 號寄存器的值和立即數(shù)進行有符號加法,結(jié)果放到 00003 號寄存器中;32b001101 00001 00010 00011 00000 000000ALURes = SrcA | SrcB;ori 指令,立即數(shù)或指令, 實現(xiàn)將 00001 號寄存器的值和立即數(shù)進行或運算, 結(jié)果放到 00002 號寄存器中;32b001101 00001 00010 00011
28、00000 000000ALURes = SrcA < SrcB ? 1:0;slti 指令,有符號立即數(shù)比較操作,實現(xiàn)將00001 號寄存器的值和立即數(shù)進行有符號比較,若 SrcA < SrcB ,則置 1,否則置 0;32b001110 00001 00010 00011 00000 000000ALURes = (SrcA SrcB);xori 指令,立即數(shù)異或指令,實現(xiàn)將 00001 號寄存器的值和立即數(shù)進行異或運算,結(jié)果放到 00002 號寄存器中;32b001011 00001 00010 00011 00000 000000ALURes = SrcA < Src
29、B ? 1:0;slti 指令,無符號立即數(shù)比較操作,實現(xiàn)將00001 號寄存器的值和立即數(shù)進行無符號比較,若 SrcA < SrcB ,則置 1,否則置 0;32b000000 00001 00010 00011 00001 000000ALURes = (SrcB << SrcA);sll 指令,邏輯左移指令, 實現(xiàn)將 00001 號寄存器的值左移sa 位,結(jié)果存入 00002 號寄存器;32b000000 00001 00010 00011 00001 000010ALURes = (SrcB >> SrcA);srl 指令,邏輯右移指令, 實現(xiàn)將 0000
30、1 號寄存器的值右移sa 位,結(jié)果存入 00002 號寄存器;32b000000 00001 00010 00011 00001 000111.精品文檔j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;/*for(i = 0; i < TmpForSrcA; i = i+1)beginALURes = j,31'h0 | (ALURes >> 1);srav 指令,算術(shù)可變右移指令, 實現(xiàn)將 00001 號寄存器的值算術(shù)右移 sa 位,結(jié)果存入 00002 號寄存器;32b000000 00001 00010 0001
31、1 00001 000011j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;TmpForSrcB = TmpForSrcB>>SrcA;if (j)beginALURes = (TmpForSrcB31:31), TmpForSrcB30:0;endelsebeginALURes = TmpForSrcB;endsra 指令,算術(shù)右移指令,實現(xiàn)將 00002 號寄存器的值算術(shù)右移 00001 號寄存器的值位,結(jié)果存入 00003 號寄存器;32b000000 00001 00010 00011 00000 100010ALURes = SrcA - SrcB;sub 指令,有符號減法指令, 實現(xiàn)將 00001 號寄存器和 00002 號寄存器的值進行有符號減法,結(jié)果放到 00003 號寄存器中;32b001000 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addi 指令,立即數(shù)加法指令,實現(xiàn)將 000
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預防醫(yī)學肝癌
- 餐飲公司學習培訓后實施策略
- 廣州物流管理專員職位簡歷
- 趾腱筋膜炎的癥狀及護理
- 銀行服務(wù)投訴培訓
- 跨境貿(mào)易質(zhì)量保證與責任豁免協(xié)議
- 裝卸操作安全培訓
- 項目會議紀要與決策落實方案
- 《小學數(shù)學乘法與除法應用題解題策略》
- 生物學遺傳基因知識專題卷
- 2022-8口腔質(zhì)控督查表(培訓用)
- TD/T 1054-2018 土地整治術(shù)語(正式版)
- JT-GQB-015-1998公路橋涵標準鋼筋混凝土圓管涵洞
- 騰訊招聘測評題庫答案大全
- 旅游提成協(xié)議書
- 第六章《平面向量及其應用》同步單元必刷卷(基礎(chǔ)卷)(考試版)
- 校園欺凌談話記錄表
- 2024年4月重慶公務(wù)員考試申論真題及答案解析
- 2016-2023年濟南工程職業(yè)技術(shù)學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 浙江省煙草專賣局(公司)管理類崗位招聘筆試真題2023
- 2024年全國高中生物聯(lián)賽競賽試題和答案
評論
0/150
提交評論