单周期MIPS处理器的设计

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)

  1. 用R[r]表示寄存器堆中寄存器r的内容。
  2. 用M[addr]表示读取存储单元addr的内容
  3. 传送方向用←表示,传送源在右,目的在左。
  4. 程序计数器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) begin
          if ( 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 @(*) begin
          case (NPCOp)
              {00}: NPC <=  PC+1;
              {01}: NPC <=  PC +{ {14{IMM[15]}},IMM[15:0] };
              {10}: NPC <=  {PC[31:28], IMM[25:0] };
              default: ;
          endcase
       end    
    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) 
       begin
          if ( rst ) 
           q_r <=0;
          else 
           q_r <=d;
       end
       assign 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) begin
          if (DMWr)
             dmem[addr] <= din;
             $display("dmem[0-4-16]=%8X, %8X, %8X",  dmem[0], dmem[1], dmem[16]);
       end // end always
    
       assign 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 begin
            for (i=0; i<32; i=i+1)
               rf[i] <= 0;
            end
       always @(posedge clk) begin
          if (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]);
          `endif
       end 
       
       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 @ ( * ) begin
            case (extOp)
                0: dout = {16'h0000, imm16};// Logical Cal;
                1: dout = {{16{imm16[15]}}, imm16};// Arithmetic Cal;;
            endcase
        end
    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) begin
          if ( 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 ) begin
          case ( 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:   ;
          endcase
       end // 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 ) begin
          case ( 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:   ;
          endcase
       end // end always;
    
       assign Zero = (A == B) ? 1 : 0;
    
    endmodule    
    
    
    

    3. 单周期MIPS处理器数据通路

    [外链图片转存中…(img-ifS2BEVo-1642646412834)]

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单周期MIPS处理器的设计

    发表评论