MIPS CPU(处理器)的设计
一、MIPS指令
1.指令格式
1.1 R型指令
(1)R型指令格式
000000 (op) | Rs | Rt | Rd | shamt | funct |
---|---|---|---|---|---|
6bits | 5bits | 5bits | 5bits | 5bits | 6bits |
注意: 该类型指令操作数和保存结果均通过寄存器进行。
操作 | 含义 |
---|---|
op | 操作码,所有R型指令都全为0 |
rs | 寄存器编号,对应第一个源操作数 |
rt | 寄存器编号,对应第二个源操作数 |
rd | 寄存器编号,保存结果 |
shamt | 常数,在移位指令中使用 |
funct | 功能码,指定指令的具体功能 |
(2)具体R型指令
注意: R型指令根据操作的寄存器数可以分为三种不同类型。
【1】带有3个寄存器
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 11] | [10 : 6] | [5 : 0] | 指令功能 |
---|---|---|---|---|---|---|---|
add | 000000 | rs | rt | rd | 00000 | 100000 | 寄存器加 |
sub | 000000 | rs | rt | rd | 00000 | 100010 | 寄存器减 |
and | 000000 | rs | rt | rd | 00000 | 100100 | 寄存器与 |
or | 000000 | rs | rt | rd | 00000 | 100101 | 寄存器或 |
xor | 000000 | rs | rt | rd | 00000 | 100110 | 寄存器异或 |
$rd = $rs op $rt
【2】带有2个寄存器
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 11] | [10 : 6] | [5 : 0] | 指令功能 |
---|---|---|---|---|---|---|---|
sll | 000000 | 00000 | rt | rd | sa | 100000 | 逻辑左移 |
srl | 000000 | 00000 | rt | rd | sa | 000010 | 逻辑右移 |
sll | 000000 | 00000 | rt | rd | sa | 000011 | 算术右移 |
$rd = $rt shift sa
【3】带有1个寄存器
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 11] | [10 : 6] | [5 : 0] | 指令功能 |
---|---|---|---|---|---|---|---|
jr | 000000 | rs | 00000 | 00000 | 00000 | 001000 | 寄存器跳转 |
jr rs;PC = rs
1.2 I型指令
(1)I型指令格式
OP | Rs | Rt | imm(立即数) |
---|---|---|---|
6bits | 5bits | 5bits | 16bits |
注意: 操作数中涉及立即数,结果保存到寄存器
操作 | 含义 |
---|---|
op | 标识指令的操作功能 |
rs | 第一个源操作数,是寄存器操作数 |
rt | 目的寄存器编号,用来保存运算结果 |
imm | 第二个源操作数,立即数 |
(2)具体I型指令
注意: I型指令存在4种不同的类型
【1】面向运算的I型指令
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 0] | 指令功能 |
---|---|---|---|---|---|
addi | 001000 | rs | rt | imm | 寄存器和立即数“加” |
andi | 001100 | rs | rt | imm | 寄存器和立即数“ |
ori | 001101 | rs | rt | imm | 寄存器和立即数“或” |
xori | 001110 | rs | rt | imm | 寄存器和立即数“异或” |
第一条指令是对立即数进行符号拓展,其他都是0拓展
addi rt, rs, imm;
$rt = $rs op E(imm)
【2】面向访存的I型指令
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 0] | 指令功能 |
---|---|---|---|---|---|
lw | 100011 | rs | rt | imm | 从存储器种读取数据 |
sw | 101011 | rs | rt | imm | 把数据保存到存储器 |
MIPS 32中唯一两条访问存储器的指令(RISC)
lw rt, imm(rs) #rt = mem [ rt = mem[rt=mem[rs+E(imm)]
sw rt, imm(rs) #mem [ mem[mem[rs+E(imm)] = $rt
【3】面向数位设置的I型指令
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 0] | 指令功能 |
---|---|---|---|---|---|
lui | 001111 | 00000 | rt | imm | 设置寄存器的高16位 |
lui rt, imm #$rt = imm<<16(空位补0)
【4】面向条件转移(分支)的I型指令
指令 | [31 : 26] | [25 : 21] | [20 : 16] | [15 : 0] | 指令功能 |
---|---|---|---|---|---|
beq | 000100 | rs | rt | imm | 寄存器相等则转移 |
bne | 000101 | rs | rt | imm | 寄存器不相等则转移 |
beq rs, rt, imm #if(rs = = rt) PC=PC+E(imm)<<2
bne rs, rt, imm #if(rs ! = rt) PC=PC+E(imm)<<2
标准的PC相对寻址方式
1.3 J型指令
(1)J型指令格式
OP | 立即数 |
---|---|
6bits | 26bits |
(2)具体J型指令
指令 | [31 : 26] | [25 : 0] | 指令功能 |
---|---|---|---|
j | 000010 | address | 无条件跳转 |
jal | 001100 | address | 调用与联接 |
j address;
$ PC=($PC+4)H4 U (address<<2)
jal address;
$ra = $PC+4(保存返回地址)
$ PC=($PC+4)H4 U (address<<2)
2.指令功能
MIPS 指令集(共31条)
助记符 | 指令格式 | 示例 | 示例含义 | 操作及其解释 | |||||
Bit # | 31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 | |||
R-type | op | rs | rt | rd | shamt | func | |||
add | 000000 | rs | rt | rd | 00000 | 100000 | add $1,$2,$3 | $1=$2+$3 | rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1 |
addu | 000000 | rs | rt | rd | 00000 | 100001 | addu $1,$2,$3 | $1=$2+$3 | rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1,无符号数 |
sub | 000000 | rs | rt | rd | 00000 | 100010 | sub $1,$2,$3 | $1=$2-$3 | rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1 |
subu | 000000 | rs | rt | rd | 00000 | 100011 | subu $1,$2,$3 | $1=$2-$3 | rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1,无符号数 |
and | 000000 | rs | rt | rd | 00000 | 100100 | and $1,$2,$3 | $1=$2 & $3 | rd <- rs & rt ;其中rs=$2,rt=$3, rd=$1 |
or | 000000 | rs | rt | rd | 00000 | 100101 | or $1,$2,$3 | $1=$2 | $3 | rd <- rs | rt ;其中rs=$2,rt=$3, rd=$1 |
xor | 000000 | rs | rt | rd | 00000 | 100110 | xor $1,$2,$3 | $1=$2 ^ $3 | rd <- rs xor rt ;其中rs=$2,rt=$3, rd=$1(异或) |
nor | 000000 | rs | rt | rd | 00000 | 100111 | nor $1,$2,$3 | $1=~($2 | $3) | rd <- not(rs | rt) ;其中rs=$2,rt=$3, rd=$1(或非) |
slt | 000000 | rs | rt | rd | 00000 | 101010 | slt $1,$2,$3 | if($2<$3) $1=1 else $1=0 | if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1 |
sltu | 000000 | rs | rt | rd | 00000 | 101011 | sltu $1,$2,$3 | if($2<$3) $1=1 else $1=0 | if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1 (无符号数) |
sll | 000000 | 00000 | rt | rd | shamt | 000000 | sll $1,$2,10 | $1=$2<<10 | rd <- rt << shamt ;shamt存放移位的位数, 也就是指令中的立即数,其中rt=$2, rd=$1 |
srl | 000000 | 00000 | rt | rd | shamt | 000010 | srl $1,$2,10 | $1=$2>>10 | rd <- rt >> shamt ;(logical) ,其中rt=$2, rd=$1 |
sra | 000000 | 00000 | rt | rd | shamt | 000011 | sra $1,$2,10 | $1=$2>>10 | rd <- rt >> shamt ;(arithmetic) 注意符号位保留 其中rt=$2, rd=$1 |
sllv | 000000 | rs | rt | rd | 00000 | 000100 | sllv $1,$2,$3 | $1=$2<<$3 | rd <- rt << rs ;其中rs=$3,rt=$2, rd=$1 |
srlv | 000000 | rs | rt | rd | 00000 | 000110 | srlv $1,$2,$3 | $1=$2>>$3 | rd <- rt >> rs ;(logical)其中rs=$3,rt=$2, rd=$1 |
srav | 000000 | rs | rt | rd | 00000 | 000111 | srav $1,$2,$3 | $1=$2>>$3 | rd <- rt >> rs ;(arithmetic) 注意符号位保留 其中rs=$3,rt=$2, rd=$1 |
jr | 000000 | rs | 00000 | 00000 | 00000 | 001000 | jr $31 | goto $31 | PC <- rs |
I-type | op | rs | rt | immediate | |||||
addi | 001000 | rs | rt | immediate | addi $1,$2,100 | $1=$2+100 | rt <- rs + (sign-extend)immediate ;其中rt=$1,rs=$2 | ||
addiu | 001001 | rs | rt | immediate | addiu $1,$2,100 | $1=$2+100 | rt <- rs + (zero-extend)immediate ;其中rt=$1,rs=$2 | ||
andi | 001100 | rs | rt | immediate | andi $1,$2,10 | $1=$2 & 10 | rt <- rs & (zero-extend)immediate ;其中rt=$1,rs=$2 | ||
ori | 001101 | rs | rt | immediate | ori $1,$2,10 | $1=$2 | 10 | rt <- rs | (zero-extend)immediate ;其中rt=$1,rs=$2 | ||
xori | 001110 | rs | rt | immediate | xori $1,$2,10 | $1=$2 ^ 10 | rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2 | ||
lui | 001111 | 00000 | rt | immediate | lui $1,100 | $1=100*65536 | rt <- immediate*65536 ;将16位立即数放到目标寄存器高16 位,目标寄存器的低16位填0 | ||
lw | 100011 | rs | rt | immediate | lw $1,10($2) | $1=memory[$2 +10] | rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2 | ||
sw | 101011 | rs | rt | immediate | sw $1,10($2) | memory[$2+10] =$1 | memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2 | ||
beq | 000100 | rs | rt | immediate | beq $1,$2,10 | if($1==$2) goto PC+4+40 | if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 | ||
bne | 000101 | rs | rt | immediate | bne $1,$2,10 | if($1!=$2) goto PC+4+40 | if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2 | ||
slti | 001010 | rs | rt | immediate | slti $1,$2,10 | if($2<10) $1=1 else $1=0 | if (rs <(sign-extend)immediate) rt=1 else rt=0 ; 其中rs=$2,rt=$1 | ||
sltiu | 001011 | rs | rt | immediate | sltiu $1,$2,10 | if($2<10) $1=1 else $1=0 | if (rs <(zero-extend)immediate) rt=1 else rt=0 ; 其中rs=$2,rt=$1 | ||
J-type | op | address | |||||||
j | 000010 | address | j 10000 | goto 10000 | PC <- (PC+4)[31…28],address,0,0 ;address=10000/4 | ||||
jal | 000011 | address | jal 10000 | $31<-PC+4; goto 10000 | $31<-PC+4;PC <- (PC+4)[31…28],address,0,0 ;address=10000/4 |
3.指令功能的RTL描述
补:寄存器传送语言(RTL)
- 用R[r]表示寄存器堆中寄存器r的内容。
- 用M[addr]表示读取存储单元addr的内容
- 传送方向用←表示,传送源在右,目的在左。
- 程序计数器PC直接用PC表示其内容。
指令 | 功能 | 说明 |
---|---|---|
add rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]+R[rt] | 从PC所指的内存单元中取指令,并加4.从rs、rt中取数后相加,若溢出则异常处理,否则结果送rd |
sub rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]-R[rt] | 从PC所指的内存单元中取指令,并加4.从rs、rt中取数后相减,若溢出则异常处理,否则结果送rd |
subu rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]-R[rt] | 从PC所指的内存单元中取指令,并加4.从rs、rt中取数后相减,结果送rd(不进行溢出判断) |
slt rd,rs,rt | if(R[s]<R[t]) R[d]←1 else R[d]←0 | 从PC所指的内存单元中取指令,并加4.从rs、rt中按带符号整数来判断两数大小,小于则rd为1,反之为0 |
sltu rd,rs,rt | if(R[s]<R[t]) R[d]←1 else R[d]←0 | 从PC所指的内存单元中取指令,并加4.从rs、rt中按无符号整数来判断两数大小,小于则rd为1,反之为0 |
ori rt,rs,imm16 | R[rt]←R[rs]|ZeroExt(imm16) | 从PC所指的内存单元中取指令,并加4.从rs取数,将imm16进行零扩展,然后两者按位或,结果送rt |
addiu rt,rs,imm16 | R[rt]←R[rs]+SignExt(imm16) | 从PC所指的内存单元中取指令,并加4.从rs取数,将imm16进行符号扩展,然后两者相加,结果送rt |
lw rt,rs,imm16 | Addr←R[rs]+SignExt(imm16) R[rt]←M[Addr] | 从PC所指的内存单元中取指令,并加4.从rs取数,将imm16进行符号扩展,然后两者相加,结果作为访存地址Addr,从Addr中取数并送rt |
sw rt,rs,imm16 | Addr←R[rs]+SignExt(imm16) M[Addr]←R[rt] | 从PC所指的内存单元中取指令,并加4.从rs取数,将imm16进行符号扩展,然后两者相加,结果作为访存地址Addr,将rt送Addr中 |
beq rs,rt,imm16 | Cond←R[rs]-R[rt] if(Cond eq 0) PC←PC+4+(SignExt(imm16)*4) | 从PC所指的内存单元中取指令,并加4.做减法以比较rs和rt中内容的大小,并计算下一条指令的地址,然后修改PC |
j target | PC<31: 2>←PC<31: 28> || target<25: 0> | 第一步无需进行PC+4而直接计算目标地址,符号||表示拼接 |
4.本实验的具体的指令
(1)指令:addu
指令名称:无符号加
指令格式:addu rd,rs,rt
指令功能:
IM[PC];取指令(公共操作,取指部件完成)
R[rd] ←R[rs] + R[rt];从rs、rt 所指的寄存器中取数后相加,结果送rd 所指的寄存器中
PC ← PC + 4;计算下地址(公共操作,取指部件完成)
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100001 |
(2)指令:subu
指令名称:无符号减
指令格式:subu rd,rs,rt
指令功能:
IM[PC];从PC所指的内存单元中取指令R[rd] ←R[rs]- R[rt];从rs、rt 所指的寄存器中取数后相减,结果送rd 所指的寄存器中PC ← PC + 4;计算下地址(公共操作,取指部件完成)
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100011 |
(3)指令:ori
指令名称:或立即数
指令格式:ori rt,rs,imm16
指令功能:
IM[PC];取指令(公共操作,取指部件完成)
R[rt] ← R[rs] or ZeroExt(imm16);立即数零扩展,并与rs内容做“或”运算
PC ← PC + 4 ;计算下地址(公共操作,取指部件完成)
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
001101 | rs | rt | imm16 |
(4)指令:lw
指令名称:加载字
格式:lw rt, imm16(rs)
指令功能:
IM[PC];从PC所指的内存单元中取指令addr ← R[rs] + SignExt(imm16) ; 计算数据地址 (立即数要进行符号扩展)R[rt] ← DM[addr]; 从存储器中取出数据,装入到寄存器中
PC ← PC + 4;计算下地址(公共操作,取指部件完成)
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
100011 | rs | rt | imm16 |
(5)指令:sw
指令名称:存储字
指令格式:sw rt, imm16(rs)
指令功能:
IM[PC];取指令(公共操作,取指部件完成)
addr ← R[rs] + SignExt(imm16) ;计算存储单元地址(符号扩展!)
DM[addr] ← R[rt] ; 寄存器rt中的内容存到内存单元中
PC ← PC + 4; 计算下地址(公共操作,取指部件完成)
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
101011 | rs | rt | imm16 |
(6)指令:beq
指令名称:等于转移
指令格式:beq rs,rt, imm16
指令功能:
IM[PC];取指令(公共操作,取指部件完成)Cond ← R[rs] - R[rt] ;做减法比较rs和rt中的内容if (COND == 0) ;计算下地址(根据比较结果,修改PC)
PC ← PC + 4 + ( SignExt(imm16) * 4 )
else
PC ← PC + 4
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000100 | rs | rt | imm16 |
(7)指令:j
指令名称:跳转并链接
指令格式:j target < 25:0 >
指令功能:
IM[PC] ;取指令(公共操作,取指部件完成)
PC < 31:2 > ← PC < 31:28 > , target < 25:0 > ;计算目标地址
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000010 | target < 25:0 > |
(8)指令:and
指令格式:and rd,rs,rt
指令功能:rd ←rs & rt
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100100 |
(9)指令:or
指令格式:or rd,rs,rt
指令功能:rd ←rs | rt
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100101 |
(10)指令:xor
逻辑异或
指令格式:xor rd,rs,rt
指令功能:rd ←rs ^ rt
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100110 |
(11)指令:nor
逻辑或非
指令格式:nor rd,rs,rt
指令功能:rd ←~(rs | rt )
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000000 | rs | rt | rd | 00000 | 100111 |
(12)指令:addiu
加无符号立即数
指令格式:addiu rt,rs,imm16
指令功能:rt ← rs+ (zero-extend)imm16
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
001001 | rs | rt | immediate |
(13)指令:andi
与立即数
指令格式:andi rt,rs,imm16
指令功能:rt ← rs& (zero-extend)imm16
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
001100 | rs | rt | immediate |
(14)指令:xori
异或立即数
指令格式:xori rt,rs,imm16
指令功能:rt ← rs ^ (zero-extend)imm16
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
001110 | rs | rt | immediate |
(15)指令:bne
不等于转移
指令格式:bne rs,rt, imm16
指令功能: if (rs != rt) PC ← PC+4 + (sign-extend)imm16<<2
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000101 | rs | rt | immediate |
(16)指令:jal
跳转并链接
指令格式:jal addr26
指令功能:$31<-PC+4;PC ←(PC+4)[31…28],addr26,0,0
指令编码:
31…26 | 25…21 | 20…16 | 15…11 | 10…6 | 5…0 |
---|---|---|---|---|---|
op | rs | rt | rd | shamt | func |
000011 | address |
二、数据通路的设计
以上的指令包括以下几种与指令有关的数据通路:
- 指令——寄存器组:R格式指令均为寄存器指令,需要指令提供寄存器地址
- 指令——运算单元(ALU):运算指令由指令提供运算类型,同时提供参与运算的立即数和位移量
- 指令——存储器:load/store指令的寻址方式仅为寄存器偏移量寻址,需要指令提供立即数偏移量
- 指令——PC:J格式指令需要将指令中的立即数载入PC中
同时还有几种必备的与指令无关的数据通路:
-
寄存器组——运算单元(ALU):寄存器组为运算单元提供操作数,运算结果存在寄存器组中
-
寄存器组——存储器:load/store指令的两端
-
寄存器组——PC:跳转指令与寄存器组有关
当使用哈弗结构时,数据通路框图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzH7vaVM-1642646412830)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\7241055-efcd9bb60656ba25.png)]
1.组合逻辑元件和存储元件
1.1 PC
(1)基本描述
PC是指令计数器,主要功能是完成输出当前指令地址并保存下一条指令地址。复位后,PC指向0x0000_3000,此处为第一条指令的地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLIKOxEJ-1642646412831)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20211202223129607.png)]
(2)模块接口
信号名 | 方向 | 描述 |
---|---|---|
[31:2]NPC | I | 下条指令的地址 |
PCWr | I | PC写使能 1:允许NPC写入PC内部寄存器 0:禁止NPC写入PC内部寄存器 |
clk | I | 时钟信号 |
rst | I | 复位信号。 1:复位 0:无效 |
[31:2]PC | O | 30位指令存储器地址(最低2位省略) |
(3)功能定义
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 复位 | if rst=1,PC←0x0000_3000。 |
2 | 保存NPC并输出 | Clk上升沿。 if rst=0,PC←NPC。 |
(4)模块描述
module PC( clk, rst, PCWr, NPC, PC );input clk;input rst;input PCWr;input [31:2] NPC;output [31:2] PC;reg [31:2] PC;reg [1:0] tmp;always @(posedge clk or posedge rst) beginif ( rst ) {PC, tmp} <=32'h0000_3000;else if ( PCWr ) PC <= NPC;end
endmodule
1.2 NPC
[Next PC – 下指令部件]
(1)基本描述
NPC是下条指令计数器,主要功能是计算下一条指令地址,NPCOp[1:0]决定如何计算NPC,与PC配合使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woeZabjU-1642646412831)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\NPC.PNG)]
(2)模块接口
信号名 | 方向 | 描述 |
---|---|---|
PC[31:2] | I | 30位本条指令的地址(最低2位省略) |
Imm[25:0] | I | 立即数(偏移量) |
NPCOp[1:0] | I | 计算方式 |
NPC[31:2] | O | 30位下一条指令地址(最低2位省略) |
(3)功能定义
NPCOp | 功能 | 操作 |
---|---|---|
00 | 顺序地址 | NPC ←PC + 1 |
01 | 计算B指令转移地址 | NPC ←PC +{ sign_ext(imm16) } |
10 | 计算J类指令转移地址 | NPC← {PC[31:28], imm26} |
11 | … | … |
(4)模块描述
module NPC( PC, NPCOp, IMM, NPC );input [31:2] PC;input [1:0] NPCOp;input [25:0] IMM;output [31:2] NPC;reg [31:2] NPC;always @(*) begincase (NPCOp){00}: NPC <= PC+1;{01}: NPC <= PC +{ {14{IMM[15]}},IMM[15:0] };{10}: NPC <= {PC[31:28], IMM[25:0] };default: ;endcaseend
endmodule
1.3 flopr模块(触发器)
(1)基本描述
存储器数据寄存器MDR、存储器地址寄存器MAR、暂存器A、暂存器B、ALU运算结果寄存器ALUOut是由flopr模块实例化,主要功能是数据缓冲,由带复位的D触发器构成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5g39zkR-1642646412831)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\flopr.PNG)]
(2)模块接口
信号名 | 方向 | 描述 |
---|---|---|
[WIDTH-1:0] d | I | 输入数据 |
rst | I | 复位信号 |
clk | I | 时钟信号 |
[WIDTH-1:0] q | O | 输出数据 |
(3)功能定义
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 数据复位 | if rst=0, q←d |
2 | 数据缓冲 | if rst=1, q←0 |
(4)模块描述
module flopr(clk,rst,d,q);input clk;input rst;input [31:0] d;output [31:0] q;reg [31:0] q_r;always @(posedge clk or posedge rst) beginif ( rst ) q_r <=0;else q_r <=d;endassign q = q_r;
endmodule
1.31 DM
[Data Memory – 数据内存]
信号名 | 方向 | 描述 |
---|---|---|
addr | I | 读/写数据地址 |
din | I | 内存写入总线 |
wEn | I | 写使能信号 |
clk | I | 时钟信号 |
dout | O | 数据输出总线 |
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 写入数据 | 当写使能信号有效时,在每个时钟上升沿将写入总线的数据写进相应内存地址中 |
2 | 读出数据 | 将指定地址的数据通过数据输出总线进行输出 |
module dm_4k( addr, din, DMWr, clk, dout );input [9:0] addr;input [31:0] din;input DMWr;input clk;output [31:0] dout;reg [31:0] dmem[1023:0];always @(posedge clk) beginif (DMWr)dmem[addr] <= din;$display("dmem[0-4-16]=%8X, %8X, %8X", dmem[0], dmem[1], dmem[16]);end // end alwaysassign dout = dmem[addr];endmodule
1.32 IM
[Instruction Memory – 指令内存]
信号名 | 方向 | 描述 |
---|---|---|
iaddr | I | 当前需要执行的指令地址 |
ins | O | 指令输出 |
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 写入指令 | 使用 $readmemh 函数将 code.txt 中的指令写入指令内存中 |
2 | 读出指令 | 根据得到的指令地址从指令内存中读出相应的指令数据 |
module im_4k( addr, dout );input [9:0] addr;output [31:0] dout;reg [31:0] imem[1023:0];assign dout = imem[addr];endmodule
1.4 MUX
[Multiplexer – 选择器]
信号名 | 方向 | 描述 |
---|---|---|
a | I | 缺省输入信号 |
b | I | 选择输入信号 |
ctrl_s | I | 选通控制信号 |
dout | O | 选择器输出 |
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 缺省输出 | 当选通控制信号无效时,选择器输出缺省输入信号 |
2 | 选择输出 | 当选通控制信号有效时,选择器输出选择输入信号 |
module mux #(parameter WIDTH = 32) (a, b, ctrl_s, dout);input [WIDTH - 1:0] a;input [WIDTH - 1:0] b;input ctrl_s;output [WIDTH - 1:0] dout;assign dout = ctrl_s? b: a;endmodule // Multiplexer;
1.5 RF
[Register File – 寄存器堆]
(1)基本描述
RF主要功能是保存寄存器文件,并支持对通用寄存器的访问。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwxUGwvh-1642646412832)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\RF.PNG)]
(2)模块接口
信号名 | 方向 | 描述 |
---|---|---|
A1 [4:0] | I | 需要读的寄存器1的地址 |
A2 [4:0] | I | 需要读的寄存器2的地址 |
A3 [4:0] | I | 需要写的寄存器的地址 |
WD [31:0] | I | 需要写的寄存器的数据 |
RFWr | I | 寄存器写使能端 0:寄存器不写 1:寄存器写 |
clk | I | 时钟信号 |
RD1 [31:0] | O | 需要读的寄存器1的数据 |
RD2 [31:0] | O | 需要读的寄存器2的数据 |
(3)功能定义
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 读取通用寄存器 | 根据输入的RS、RT域的值,输出相应通用寄存器所存储的数据。 RD1←RF[A1];RD2←RF[A2] |
2 | 写回通用寄存器 | 当RF写使能有效时,将待写的数据写入给定地址的通用寄存器中。 Clk上升沿时 if (RFWr) then RF[A3]←WD |
(4)模块描述
`define DEBUG 1
module RF( A1, A2, A3, WD, clk, RFWr, RD1, RD2 );input [4:0] A1, A2, A3;input [31:0] WD;input clk;input RFWr;output [31:0] RD1, RD2;reg [31:0] rf[31:0];integer i;initial beginfor (i=0; i<32; i=i+1)rf[i] <= 0;endalways @(posedge clk) beginif (RFWr)rf[A3] <= WD;`ifdef DEBUG$display("R[00-07]=%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X", 0, rf[1], rf[2], rf[3], rf[4], rf[5], rf[6], rf[7]);$display("R[08-15]=%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X", rf[8], rf[9], rf[10], rf[11], rf[12], rf[13], rf[14], rf[15]);$display("R[16-23]=%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X", rf[16], rf[17], rf[18], rf[19], rf[20], rf[21], rf[22], rf[23]);$display("R[24-31]=%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X", rf[24], rf[25], rf[26], rf[27], rf[28], rf[29], rf[30], rf[31]);`endifend assign RD1 = rf[A1];assign RD2 =rf[A2];endmodule
1.6 EXT
[Extender – 扩展器]
信号名 | 方向 | 描述 |
---|---|---|
imm16 | I | I-指令的16位立即数 |
extOp | I | 扩展器控制信号 |
dout | O | 扩展器输出总线 |
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 逻辑扩展 | 当控制信号无效时,对输入的16位立即数逻辑扩展为32位 |
2 | 算术扩展 | 当控制信号有效时,对输入的16位立即数算术扩展为32位 |
module ext (imm16, extOp, dout);input extOp;input [15:0] imm16;output reg [31:0] dout;always @ ( * ) begincase (extOp)0: dout = {16'h0000, imm16};// Logical Cal;1: dout = {{16{imm16[15]}}, imm16};// Arithmetic Cal;;endcaseend
endmodule // Extender;
1.7 IR
[指令寄存器]
(1)基本描述
IR主要功能是完成对来自IM的指令的缓冲。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAylh2U7-1642646412833)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\IR.PNG)]
(2)模块接口
信号名 | 方向 | 描述 |
---|---|---|
[31:0] im_dout; | I | 指令输入 |
IRWr | I | 写使能信号 |
rst | I | 复位信号 |
clk | I | 时钟信号 |
[31:0] instr; | O | 指令输出 |
(3)功能定义
序号 | 功能名称 | 功能描述 |
---|---|---|
1 | 复位 | if rst=1, instr←0 |
2 | 缓冲 | if rst=0, instr←im_dout |
(4)模块描述
module IR (clk, rst, IRWr, im_dout, instr);input clk;input rst;input IRWr; input [31:0] im_dout;output [31:0] instr;reg [31:0] instr;always @(posedge clk or posedge rst) beginif ( rst ) instr <= 0;else if (IRWr)instr <=im_dout;end
endmodule
2.算术逻辑部件的设计(ALU)
Arithmetic Logic Unit – 算术逻辑单元
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V21ILpEY-1642646412833)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\ALU.png)]
11条目标指令对应的4种ALU操作
指令 | 功能 | 运算类型 |
---|---|---|
add rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]+R[rt] | 加(判溢出) |
sub rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]-R[rt] | 减(判溢出) |
subu rd,rs,rt | M[PC],PC←PC+4 R[rd]←R[rs]-R[rt] | 减(不判溢出) |
slt rd,rs,rt | if(R[s]<R[t]) R[d]←1 else R[d]←0 | 减(不判溢出) 带符号整数比较大小 |
sltu rd,rs,rt | if(R[s]<R[t]) R[d]←1 else R[d]←0 | 减(不判溢出) 无符号整数比较大小 |
ori rt,rs,imm16 | R[rt]←R[rs]|ZeroExt(imm16) | 按位或(不判溢出) |
addiu rt,rs,imm16 | R[rt]←R[rs]+SignExt(imm16) | 加(不判溢出) |
lw rt,rs,imm16 | Addr←R[rs]+SignExt(imm16) R[rt]←M[Addr] | 加(不判溢出) |
sw rt,rs,imm16 | Addr←R[rs]+SignExt(imm16) M[Addr]←R[rt] | 加(不判溢出) |
beq rs,rt,imm16 | Cond←R[rs]-R[rt] if(Cond eq 0) PC←PC+4+(SignExt(imm16)*4) | 减(判0) 加(不判溢出) |
j target | PC<31: 2>←PC<31: 28> || target<25: 0> | 无须ALU运算 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RM5yzeOz-1642646412833)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\ALU1.png)]
信号名 | 方向 | 描述 |
---|---|---|
A [31:0] | I | 操作数A |
B [31:0] | I | 操作数B |
ALUCtrl[2:0] | I | 需要进行的运算 000:加法 001:减法 01l:与运算 110:或运算 |
Zero | O | 两操作数是否相等 |
C [31:0] | O | 运算结果 |
ALUCtrl | 功能 | 操作 |
---|---|---|
---- | A等于B? | Zero ← (A==B) ? 1 : 0 |
000 | 加 | C ← A + B |
001 | 减 | C ← A – B |
010 | 与 | C ←A & B |
110 | 或 | C ←A | B |
… | … | … |
module alu (A, B, ALUOp, C, Zero);input [31:0] A, B;input [1:0] ALUOp;output [31:0] C;output Zero;reg [31:0] C;always @( A or B or ALUOp ) begincase ( ALUOp )`ALUOp_ADDU: C = A + B;`ALUOp_SUBU: C = A - B;`ALUOp_OR: C = A | B;//`ALUOp_AND: C = A & B;//`ALUOp_XOR: C = A ^ B;default: ;endcaseend // end always;assign Zero = (A == B) ? 1 : 0;endmodule
3. 单周期MIPS处理器数据通路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifS2BEVo-1642646412834)(C:\Users\ASUS\Desktop\思维导图\计算机组成原理\MIPSCPU\相关图片\单周期CPU数据通路的设计.png)]
|
| C [31:0] | O | 运算结果 |
ALUCtrl | 功能 | 操作 |
---|---|---|
---- | A等于B? | Zero ← (A==B) ? 1 : 0 |
000 | 加 | C ← A + B |
001 | 减 | C ← A – B |
010 | 与 | C ←A & B |
110 | 或 | C ←A | B |
… | … | … |
module alu (A, B, ALUOp, C, Zero);input [31:0] A, B;input [1:0] ALUOp;output [31:0] C;output Zero;reg [31:0] C;always @( A or B or ALUOp ) begincase ( ALUOp )`ALUOp_ADDU: C = A + B;`ALUOp_SUBU: C = A - B;`ALUOp_OR: C = A | B;//`ALUOp_AND: C = A & B;//`ALUOp_XOR: C = A ^ B;default: ;endcaseend // end always;assign Zero = (A == B) ? 1 : 0;endmodule
3. 单周期MIPS处理器数据通路
[外链图片转存中…(img-ifS2BEVo-1642646412834)]