日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MIPS指令以及数据通路

發(fā)布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MIPS指令以及数据通路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MIPS指令以及數(shù)據(jù)通路

MIPS 1字=4字節(jié) 1字節(jié)=8位 即:1字=32位
每一個時鐘周期:IM取指令->譯碼->ALU執(zhí)行->DM訪存->回寫Reg

ADDI

addi 加立即數(shù),支持溢出 addi $22,$24,6
格式: ADDI rt,rs,imm16
運算: rt<=rs+imm16
數(shù)據(jù)通路:
NPC:把當前指令地址傳送給PC
PC:把當前PC地址傳送給IM指令存儲器
IM:把PC地址中的[11:2]addr截取,因為按字節(jié)尋址,而相鄰指令相差4個字節(jié),addr需要刪除后兩位(÷4)

//reg [31:0] dm[1023:0]表示有1024個地址,每個地址32bit //MIPS一條指令占32位
也就是1個字(4個字節(jié)) //比如相鄰兩條指令的address分別是: //0x00003000 0x00003004
//?0011000000000000? ?0011000000000100?
//實際上存儲的時候是按照數(shù)組存儲的,一個數(shù)組元素占4字節(jié),相鄰元素地址之差為4字節(jié),也就是1字
//所以要在尋址的時候?qū)C指向的地址(字節(jié))除以4,得到字地址,直接用字地址訪問數(shù)組下標

//P109 在字節(jié)尋址的機器中,連續(xù)的字地址相差為4,而不是1 //P46
為了得到正確的字節(jié)地址,lw指令中與基址存儲器相加的偏移量必須輸4×8=32,這樣才能正確讀到A[8]
//MIPS按字節(jié)編址,所以字的起始地址必須是4的倍數(shù)

IM取出地址按照字段分割,輸入到CTRL等模塊中
EXT:imm有符號16to32
ALU:add運算,判斷溢出標志位overflow
CTRL:overflow高電平,使RegWrite無效
Reg:寫寄存器

ADDIU

addiu 加立即數(shù),不檢測溢出 addiu $3,$0,0xababcdcd
格式: addiu rt,rs,imm16
運算: rt<=rs+imm16
數(shù)據(jù)通路:
IM取指令,譯碼
EXT imm16to32
ALU相加 溢出求模
Reg寫寄存器

SLT

slt 小于置一指令 slt $20,$12,$4
格式: SLT rd,trs,rt
運算: rd<=(rs<rt?1:0)
數(shù)據(jù)通路:
IM取指令,譯碼
Reg寄存器取數(shù)據(jù)1,數(shù)據(jù)2
ALU數(shù)據(jù)1,數(shù)據(jù)2相加 溢出求模(ALUsrc=0 第二個ALU操作數(shù)的來源:0–讀寄存器2)
Reg寫寄存器(MemToReg=0–ALU計算結(jié)果)

JAL

jal 跳轉(zhuǎn)至標簽(Jump And Link) jal newadd
格式: JAL target
運算: gpr31<=PC+4
數(shù)據(jù)通路:
NPC始終輸出 jalPC = PC + 4 NPC <= {PC[31:28], imm26, 2’b0}
IM取指令,譯碼
CTRL控制信號(MemtoReg=10 jalPC JAL跳轉(zhuǎn)的PC+4)
將PC + 4的值寫入31號寄存器(MUX32根據(jù)MemtoReg控制寫入寄存器的數(shù)據(jù),MUX5根據(jù)RegDst控制寫寄存器的地址)

JR

jr 跳轉(zhuǎn)至寄存器中的指令地址 jr $31
格式:JR rs
運算:PC<-rs
數(shù)據(jù)通路:
當前指令是JR指令的時候
CRTL將jr_ctr設置為高電平
(GPR)根據(jù)rs[4:0]從31號寄存器中讀出數(shù)據(jù)rd1[31:0],輸出到NPC單元
NPC單元中檢測到jr_ctr,于是將rd1[31:0]傳送給NPC。(NPC <= rd1[31:0])

ADDU

addu 加寄存器,不檢測溢出 addu $4, $0,$16
格式:ADDU rd, rs, rt
運算:GPR[rd] ← GPR[rs] + GPR[rt]
數(shù)據(jù)通路:IM取指令->譯碼->ALU執(zhí)行加法->運算結(jié)果回寫Reg

SUBU

subu 減寄存器,不檢測溢出 subu $17,$17,$8
格式:SUBU rd, rs, rt
運算:GPR[rd] ← GPR[rs] - GPR[rt]
數(shù)據(jù)通路:IM取指令->譯碼->ALU執(zhí)行減法->運算結(jié)果回寫Reg

ORI

ori 或立即數(shù) ori $8, $0,4
格式:ORI rt, rs, immediate
運算:GPR[rt] ← GPR[rs] or immediate
數(shù)據(jù)通路:IM取指令->譯碼->ALU執(zhí)行或運算->運算結(jié)果回寫Reg

LW

lw 取字指令 將數(shù)據(jù)存儲器中的字加載到寄存器中 lw $18, -4($8)
格式:LW rt, offset(base)
運算:GPR[rt] ← memory[GPR[base] + offset]
數(shù)據(jù)通路:IM取指令->譯碼->ALU執(zhí)行加運算(計算地址)->DM訪存->回寫Reg

SW

sw 取字指令 將寄存器的字存儲到數(shù)據(jù)存儲器中 sw $4, -4($8)
格式:SW rt, offset(base)
運算:memory[GPR[base] + offset] ← GPR[rt]
數(shù)據(jù)通路:IM取指令->譯碼->讀Reg數(shù)據(jù)->ALU計算地址->寫入DM

BEQ

beq 相等則分支到標簽 beq $25, $0,end2
格式:BEQ rs, rt, offset
運算:if GPR[rs] = GPR[rt] then branch
數(shù)據(jù)通路:IM取指令->譯碼->讀Reg數(shù)據(jù)1數(shù)據(jù)2->ALU計算是否相等(0標志位)->CTRL(PCsrc判斷是否分支)->NPC分支

LUI

lui 立即數(shù)加載至寄存器高16位 lui $19, 0xefef
格式:LUI rt, immediate
運算:GPR[rt] ← immediate || 016
數(shù)據(jù)通路:IM取指令->譯碼->MUX拓展16to32->ALU取低16to高16并補全32->回寫Reg

J

j 無條件跳轉(zhuǎn) j end
格式:J target
運算:PC ← PCGPRLEN-1…28 || instr_index || 02
數(shù)據(jù)通路:當前指令是J指令的時候
CRTL將j_ctr設置為高電平
NPC根據(jù)imm26計算下一條指令地址

LB

加載字節(jié)指令

在有效地址指定的存儲器位置(基地址+16bit偏移地址,地址運算結(jié)果不一定非要是4的倍數(shù))提取8位(1字節(jié))的內(nèi)容,擴展符號,存儲到rt指定的寄存器中

  • LB與LW的區(qū)別:LB加載字節(jié),地址不一定是4的倍數(shù)。LW加載字(1字=4字節(jié)),地址必須是4的倍數(shù)。


lb指令,將從內(nèi)存中取出的8bit字節(jié)(有符號)拓展至32bit(高位根據(jù)符號,補全0或全1),正如下圖所說的:寄存器中高24位信息由符號拓展獲取。

格式

lw指令的地址必須是4的倍數(shù)(數(shù)組下標*4),因為一次取一個字
而lb指令的地址(基址+偏移)不一定是4的倍數(shù),因為只取字節(jié),地址可以是數(shù)組下標*4+1/2/3

具體操作如下圖,把不是4的倍數(shù)的部分(最低兩位)單獨提取出來,作為片選信號,用來選擇到底取一個字的哪個字節(jié),也就是:先按字取出,然后再分離得到想要的那一個字節(jié),這樣變相達到了取字節(jié)的效果

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的MIPS指令以及数据通路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。