MIPS指令以及数据通路
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:把當(dāng)前指令地址傳送給PC
PC:把當(dāng)前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ù)組下標(biāo)
//P109 在字節(jié)尋址的機器中,連續(xù)的字地址相差為4,而不是1 //P46
為了得到正確的字節(jié)地址,lw指令中與基址存儲器相加的偏移量必須輸4×8=32,這樣才能正確讀到A[8]
//MIPS按字節(jié)編址,所以字的起始地址必須是4的倍數(shù)
IM取出地址按照字段分割,輸入到CTRL等模塊中
EXT:imm有符號16to32
ALU:add運算,判斷溢出標(biāo)志位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)至標(biāo)簽(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ù)通路:
當(dāng)前指令是JR指令的時候
CRTL將jr_ctr設(shè)置為高電平
(GPR)根據(jù)rs[4:0]從31號寄存器中讀出數(shù)據(jù)rd1[31:0],輸出到NPC單元
NPC單元中檢測到j(luò)r_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 相等則分支到標(biāo)簽 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標(biāo)志位)->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ù)通路:當(dāng)前指令是J指令的時候
CRTL將j_ctr設(shè)置為高電平
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ù)組下標(biāo)*4),因為一次取一個字
而lb指令的地址(基址+偏移)不一定是4的倍數(shù),因為只取字節(jié),地址可以是數(shù)組下標(biāo)*4+1/2/3
具體操作如下圖,把不是4的倍數(shù)的部分(最低兩位)單獨提取出來,作為片選信號,用來選擇到底取一個字的哪個字節(jié),也就是:先按字取出,然后再分離得到想要的那一個字節(jié),這樣變相達(dá)到了取字節(jié)的效果
總結(jié)
以上是生活随笔為你收集整理的MIPS指令以及数据通路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MIPS汇编】ADDI,ADDIU,A
- 下一篇: 【verilog语法】always@(*