系統硬件綜合設計_第1頁
系統硬件綜合設計_第2頁
系統硬件綜合設計_第3頁
系統硬件綜合設計_第4頁
系統硬件綜合設計_第5頁
已閱讀5頁,還剩8頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、計算機與信息學院系統硬件綜合設計課程設計報告學生姓名: 李 學 號: 1234567890 專業班級: 計算機 2017 年 07 月 01日一、實驗原理及設計本次試驗我主要根據上圖進行理解和編程,起先參考了5個基礎實驗,期間又翻閱了自己動手寫cpu,并且在網上查了很多資料,下面我將對該圖做出我的理解和設計:1. pcf部分always (posedge Clk) beginPCPlus4F_Reg = PCPlus4F;if (BranchM&ZeroM) PCF = PCBranchM;else PCF = PCPlus4F;InstructionF_Reg = Instructi

2、onF;if (InstructionF31:26 = 6'b000010) begin PCF = 6'h0,InstructionF25:0;PCF = PCF << 2;endEndassign PCPlus4F = PCF + 4;assign ImemRdAddrF = PCF;每個時鐘上升沿到來,根據上一個時鐘的PCSrcM判斷是否為分支指令,若是,則選擇PCBranchM作為這個時鐘的指令地址,否則選PCF+4作為這個指令的指令地址,另外對于J類指令,我設計了一個特定的OpCode=“000010”,即為跳轉指令,因為每個指令以字節格式存儲,占用,4個

3、字節,故將后26位立即數進行位擴展后將其左移兩位,效果等同于乘4,再將其賦值給PCF,這樣下一跳的指令地址即為所要跳轉的地址。對于這個部分,我起先是準備將其設計成一個模塊的,之后由于模塊接口連接時出現了無法解決的錯誤:輸出PCF要作為Instruction Memory的輸入,又要作為自身模塊下一跳的輸入,導致三者關聯一起變化,程序報錯,后來我又想到將PCF的輸出改成兩個,PCFout及PCFnext,PCFout作為Instruction Memory的輸入,PCFnext作為自身模塊下一跳的輸入,但是程序仍無法正常運行,最后我想到了在top模塊中對PCF進行處理并得以實現。2.Instru

4、ction Memory模塊 initial begin$readmemh("instruction", InstMem, 8'h0); end always (ImemRdAddr) beginInstruction <= InstMemImemRdAddr>>2; end這個模塊很簡單,主要是通過instructin文檔來存儲指令,以PCF作為地址取出指令輸出至Control,SignExtend,Register三個模塊。3.Ctr模塊 always (OpCode) begincase(OpCode)/ R-I/ addiu6'b0

5、01001:beginRegDstD = 1;ALUSrcD = 1;MemtoRegD = 0;RegWriteD = 1;MemWriteD = 0;BranchD = 0;ALUOp = 2'b10;end/addi.endcaseend always (ALUOp or Funct) begincasex(OpCode ,ALUOp, Funct) 14'b10001100xxxxxx: ALUControlD = 5'b00010; / LW : add14'b00010001xxxxxx: ALUControlD = 5'b00110; /

6、SW : substract beq.endcaseendendmoduleControl模塊主要對來自Instruction Memory模塊的指令進行分解,得到OpCode(指令高六位),Funct(指令低六位),在通過分析OpCode得到RegDstD,ALUSrcD ,MemtoRegD,RegWriteD,BranchD ,ALUOp這六個信號量,用于后面的運算,再使用OpCode ,ALUOp, Funct三者的組合對指令的運算方法進行分析,得到相應的ALUControlD輸出至ALU模塊。4.Register模塊initialbegin$readmemh("regist

7、er", 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)? regFileRegBRdAddr:0;通過信號量RegWrite來判斷讀寫操作,RegWrite=

8、1即為寫操作,0為讀操作,讀寫皆操作于建立的register文檔中,另在top模塊中有assign RegARdAddr = InstructionD25:21;assign RegBRdAddr = InstructionD20:16;對寄存器地址賦值,register讀出的兩個數可供ALU選擇使用。5. ALU模塊assign Zero = (ALURes = 0)? 1:0;/ALURes 0 跳轉always (SrcA or SrcB or ALUCtr)begin OverFlow = 0;TmpForSrcB = 0;HI = 0;LO = 0;A = 0;B = 0;case(

9、ALUCtr)5'b10011: beginTmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB31 && ALURes31 = SrcA31)beginOverFlow = 1'b0;endelse if (SrcA31 = TmpForSrcB31 && ALURes31 != SrcA31)beginOverFlow = 1'b1

10、;end .default: ALURes = 32'h0;endcaseendALU模塊進行的是運算操作,本模塊通過來自Control模塊的ALUCtr判斷所要執行的運算,在通過Register模塊讀出的值或者從Instruction中得到的立即數進行運算,結果ALURes根據信號量MemToReg來判斷是否寫入DataMemory,這一塊寫在top中,另外ALU還對Zero信號量進行了賦值,Zero信號量用于對分支指令的判斷。6. Data Memory模塊initialbegin$readmemh("Data", DataMem, 10'h0);end

11、always (posedge Clk) beginif(DmemWrite = 1'b1)DataMemDmemAddr>>2 <= DmemWrData;endassign DmemRdData = (DmemWrite = 1'b0)? DataMemDmemAddr>>2:0;endmodule本模塊通過從Ctr模塊得來的信號量DmemWrite選擇進行讀寫操作,讀寫皆操作于所建立的Data文檔,另外DmemAddr左移兩位跟上述PCF左移兩位異曲同工。7.top模塊這個模塊相比前面的6個模塊要復雜得多,也是我在實驗時出現問題最多,所花時間

12、最長的模塊。Top模塊主要用于各個模塊之間的數據連接,以及一些模塊外的操作。PCF的設計我是放在這個模塊的,另外像二選一數據選擇器我也是放在這里的,本來是寫了一個小模塊來做這個工作,但是本次試驗用到太多次二選一數據選擇器了,為了防止數據傳輸紊亂,我決定在top中解決這個小操作。由于本模塊代碼太長,這里就不一一闡述,僅以Ctr的例化和接口連接為例簡要說明:Ctr Ctr(.OpCode(OpCode),.Funct(Funct),.RegWriteD(RegWriteForCtrD),.MemtoRegD(MemtoRegD),.MemWriteD(MemWriteD),.BranchD(Bra

13、nchD),.ALUControlD(ALUControlD),.ALUSrcD(ALUSrcD),.RegDstD(RegDstD);assign OpCode = InstructionD31 : 26;assign Funct = InstructionD5 : 0;assign RegWrDataD = (MemtoRegW)? ReadDataW : ALUOutW;always (posedge Clk) beginMemtoRegD_Reg = MemtoRegD;MemWriteD_Reg = MemWriteD;BranchD_Reg = BranchD;ALUControl

14、D_Reg = ALUControlD;ALUSrcD_Reg = ALUSrcD;RegDstD_Reg = RegDstD;end輸入來源OpCode來自于取指階段Instruction的高6位,Funct來自于取指階段Instruction的低6位,RegWriteD通過信號量MemToRegW來選擇ReadDataW 或 ALUOutW,輸出信號量MemtoRegD,MemWriteD,BranchD,ALUControlD,ALUSrcD,RegDstD作為Reg模塊的輸入。2、 指令設計本次試驗實現了3種34條指令,實驗時原以為指令格式為固定的,查閱很多資料都沒得到想要的OpCod

15、e與指令操作一一對應的關系,問了指導實驗的學長才知道,OpCode是自己設計的,后又參考自己動手寫cpu的指令設計技巧,才總結設計出指令。3種指令:R類型:具體操作由OpCode,Funct來控制,rs,rt為源寄存器,rd為目的寄存器,sa為移位位數。I類型:具體操作由OpCode控制,低16位是立即數,經過位擴展作為另一個源操作數參與用算。J類型:具體操作由OpCode控制,一般是跳轉指令,低26位經過位擴展作為目標地址。34條 指令:32b101011 00001 00100 000000000000010ALURes = SrcA - SrcB;Store指令,判斷00001號寄存器的

16、值是否等于00100號寄存器的值,若相等,則當前指令地址加00000000000000010,否則執行下一條指令;32b000000 00001 00010 00011 00000 100000TmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB31 && ALURes31 = SrcA31)beginOverFlow = 1'b0;endelse if (SrcA3

17、1 = TmpForSrcB31 && ALURes31 != SrcA31)beginOverFlow = 1'b1;endAdd指令,有符號加法指令,實現將00001號寄存器和00002號寄存器的值進行有符號加法,結果放到00003號寄存器中;32b000101 00001 00010 0000000000000010ALURes = (SrcA - SrcB);Bne指令,實現將00001號寄存器和00002號寄存器的值進行比較,若不相等,則當前指令地址加00000000000000010,否則執行下一條指令;32b000100 00001 00010 00000

18、00000000010ALURes = SrcA - SrcB;Beq指令,實現將00001號寄存器和00002號寄存器的值進行比較,若相等,則當前指令地址加00000000000000010,否則執行下一條指令;32b000001 00001 00000 0000000000000010ALURes = (SrcA >= 0)?0:1;Bgez指令,實現00001號寄存器的值與0比較,若大于等于0,則當前指令地址加00000000000000010,否則執行下一條指令;32b000111 00001 00000 0000000000000010ALURes = (SrcA > 0

19、)?0:1;Bgtz指令,實現00001號寄存器的值與0比較,若大于0,則當前指令地址加00000000000000010,否則執行下一條指令;32b000110 00001 00000 0000000000000010ALURes = (SrcA <= 0)?0:1;Blez指令,實現00001號寄存器的值與0比較,若小于等于0,則當前指令地址加00000000000000010,否則執行下一條指令;32b010001 00001 00000 0000000000000010ALURes = (SrcA < 0)?0:1;Bltz指令,實現00001號寄存器的值與0比較,若小于0

20、,則當前指令地址加00000000000000010,否則執行下一條指令;32b100011 00001 00010 00011 00000 100001ALURes = SrcA + SrcB;Addu指令,無符號加法指令,實現將00001號寄存器和00002號寄存器的值進行無符號加法,結果放到00003號寄存器中;32b100011 00001 00010 00011 00000 100011ALURes = SrcA - SrcB;subu指令,無符號減法指令,實現將00001號寄存器和00002號寄存器的值進行無符號減法,結果放到00003號寄存器中;32b000000 00001 0

21、0010 00011 00000 100100ALURes = SrcA & SrcB;And指令,與操作,實現將00001號寄存器和00002號寄存器的值進行與操作,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 100101ALURes = SrcA | SrcB;OR指令,或操作,實現將00001號寄存器和00002號寄存器的值進行或運算,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 101010ALURes = SrcA < SrcB ? 1:0;slt指令,有符號比較操

22、作,實現將00001號寄存器和00002號寄存器的值進行有符號比較,若SrcA < SrcB,則置1,否則置0;32b000000 00001 00010 00011 00000 101010ALURes = SrcA < SrcB ? 1:0;sltu指令,無符號比較操作,實現將00001號寄存器和00002號寄存器的值進行無符號比較,若SrcA < SrcB,則置1,否則置0;32b000000 00001 00010 00011 00000 011010ALURes = SrcA / SrcB;LO = SrcA / SrcB;HI = SrcA % SrcB;div指

23、令,有符號除法指令,實現將00001號寄存器和00002號寄存器的值進行有符號除法,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 011000 A = 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指令,有符號乘法指令,實現將

24、00001號寄存器和00002號寄存器的值進行有符號乘法,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 000100ALURes = (SrcB << SrcA); sllv指令,邏輯可變左移指令,實現將00001號寄存器的值左移00002號寄存器的值位,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 000100ALURes = (SrcB >> SrcA);srlv指令,邏輯可變右移指令,實現將00001號寄存器的值右移00002號寄存器的值位,結果放到00003號

25、寄存器中;32b000000 00001 00010 00011 00000 100110ALURes = (SrcB >> SrcA);xor指令,異或指令,實現將00001號寄存器的值和00002號寄存器進行異或,結果放到00003號寄存器中;32b000000 00001 00010 00011 00000 100110ALURes = (SrcA SrcB); xor指令,異或指令,實現將00001號寄存器的值和00002號寄存器進行異或,結果放到00003號寄存器中;32b001001 00001 00010 00011 00000 000000ALURes = SrcA

26、 + SrcB; addiu指令,無符號立即數加法指令,實現將00001號寄存器的值和立即數進行無符號加法,結果放到00003號寄存器中;32b001100 00001 00010 00011 00000 000000ALURes = SrcA + SrcB; addi指令,有符號立即數加法指令,實現將00001號寄存器的值和立即數進行有符號加法,結果放到00003號寄存器中;32b001101 00001 00010 00011 00000 000000ALURes = SrcA | SrcB; ori指令,立即數或指令,實現將00001號寄存器的值和立即數進行或運算,結果放到00002號寄

27、存器中;32b001101 00001 00010 00011 00000 000000ALURes = SrcA < SrcB ? 1:0; slti指令,有符號立即數比較操作,實現將00001號寄存器的值和立即數進行有符號比較,若SrcA < SrcB,則置1,否則置0;32b001110 00001 00010 00011 00000 000000ALURes = (SrcA SrcB);xori指令,立即數異或指令,實現將00001號寄存器的值和立即數進行異或運算,結果放到00002號寄存器中;32b001011 00001 00010 00011 00000 000000

28、ALURes = SrcA < SrcB ? 1:0; slti指令,無符號立即數比較操作,實現將00001號寄存器的值和立即數進行無符號比較,若SrcA < SrcB,則置1,否則置0;32b000000 00001 00010 00011 00001 000000 ALURes = (SrcB << SrcA); sll指令,邏輯左移指令,實現將00001號寄存器的值左移sa位,結果存入00002號寄存器;32b000000 00001 00010 00011 00001 000010 ALURes = (SrcB >> SrcA); srl指令,邏輯右

29、移指令,實現將00001號寄存器的值右移sa位,結果存入00002號寄存器;32b000000 00001 00010 00011 00001 000111j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;/*for(i = 0; i < TmpForSrcA; i = i+1)beginALURes = j,31'h0 | (ALURes >> 1);srav指令,算術可變右移指令,實現將00001號寄存器的值算術右移sa位,結果存入00002號寄存器; 32b000000 00001 00010 00011 000

30、01 000011j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;TmpForSrcB = TmpForSrcB>>SrcA;if (j)beginALURes = (TmpForSrcB31:31), TmpForSrcB30:0;endelsebeginALURes = TmpForSrcB;end sra指令,算術右移指令,實現將00002號寄存器的值算術右移00001號寄存器的值位,結果存入00003號寄存器;32b000000 00001 00010 00011 00000 100010ALURes = SrcA - SrcB;sub指令,有符號減法指令,實現將00001號寄存器和00002號寄存器的值進行有符號減法,結果放到00003號寄存器中;32b001000 00001 00010 00011 00000 000000ALURes = SrcA

溫馨提示

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

評論

0/150

提交評論