思路:

无异常指令(共38条)

1.算术指令

  1. ADDIU
  2. ADDU
  3. SUBU
  4. MULU
  5. DIVU
  6. MUL
  7. DIV

2.逻辑指令

  1. AND
  2. ANDI
  3. NOR
  4. OR
  5. ORI
  6. XOR
  7. XORI
  8. LUI

3.移位指令

  1. SLLV
  2. SLL
  3. SRAV
  4. SRA
  5. SLT
  6. SLTI
  7. SLTIU
  8. SLTU
  9. SRL
  10. SRLV

4.分支跳转指令

  1. J
  2. JAL
  3. JR
  4. BEQ
  5. BNE
  6. BGEZ
  7. BGTZ
  8. BLEZ
  9. BLTZ

5.读写指令

  1. LW
  2. SW

6.数据移动

1.MFLO
2.MFHI

建议包括的模块

  1. mips模块是一个CPU,只含有复位信号rst和时钟信号clk,内部由PC、NPC、DM、IM、EXT、ALU、IR、Ctrl等模块以及一些多路选择器和缓冲器组成。
  2. PC(程序计数器):PC是指令计数器,主要功能是完成输出当前指令地址并保存下一条指令地址。复位后,PC指向0x0000_3000,此处为第一条指令的地址。
  3. NPC(NextPC计算单元):NPC是下条指令计数器,主要功能是计算下一条指令地址,NPCOp[1:0]决定如何计算NPC。
  4. RF(通用寄存器组,也称为寄存器文件、寄存器堆):RF主要功能是保存寄存器文件,并支持对通用寄存器的访问。
  5. ALU(算术逻辑单元):ALU主要功能是完成对输入数据的算数逻辑计算,包括加法、减法、按位或运算以及判断两个操作数是否相等。
  6. EXT(扩展单元):EXT主要功能是将16位的数据扩展为32位数据。
  7. IM(指令存储器):IM是指令存储器,主要功能是根据读控制信号DMWr,读写对应addr地址的32位数据。
  8. IR(指令寄存器):IR主要功能是完成对来自IM的指令的缓冲。
  9. DM(数据存储器):DM是数据存储器,主要功能是根据读写控制信号DMWr,读写对应addr地址的32位数据。
  10. Flopr(数据寄存器):DR、A、B、ALUOut由flopr模块实例化,主要功能是数据缓冲,由带复位的D触发器构成。
  11. MUX(数据选择器):主要功能是多路选择器。mux.v文件包含二选一、四选一、八选一、十六选一4中多路选择器。实例化多路选择器时,可使用#(XXX),实例化位宽为XXX的多路选择器。

模块

1.PC

端口说明

信号名 方向 描述
Clk I 时钟信号
Rst I 复位信号
1:将PC置为初始值
0:无效
PCwr I PC读写使能端信号
1:可以写
0:不可写
PCin[31:0] I 下一条指令的地址
PCout[31:0] O 当前指令的地址

功能定义

序号 功能 描述
1 复位 将PC置为初始值
2 计数 当PCWR有效并且时钟上升沿,PC就更新为NPC的输出

2.IMEM

端口说明

信号名 方向 描述
Addr I 当前指令的地址
IMEM I 指令存储器读写信号
Iout O 当前指令

功能定义

序号 功能 描述
1 取指令 输出Addr地址所代表的当前指令

3.IR

端口说明

信号名 方向 描述
IRin I 来自IMEM的指令
IRwr I 控制指令寄存器的读写
1:可以写
0:不可写
IRout O 当前指令

功能定义

序号 功能 描述
1 缓冲 对来自IMEM的指令进行缓冲

4.Regfile

端口说明

信号名 方向 描述
Clk I 时钟信号
rst I 重置信号
Ra[4:0] I 5位地址输入信号,将寄存器中的内容读出到Raout
Rb[4:0] I 5位地址输入信号,将寄存器中的内容读出到Rbout
Rw[4:0] I 5位地址输入信号,将寄存器作为目标寄存器
Wd[31:0] I 32位数据输入信号
IRwr I 控制IR读写
Raout O 输出Raout所指定的寄存器中的32位数据
Rbout O 输出Rbout所指定的寄存器中的32位数据

功能定义

序号 功能 描述
1 读数据 读出Ra,Rb地址所对应寄存器中1的数据到Raout,Rbout
2 写数据 当RFwr有效且时钟上升沿来临,将Wd中的数据写入Rw所对应的寄存器中

5.ALU

端口说明

信号名 方向 描述
A[31:0] I 操作数A
B[31:0] I 操作数B
ALUop[3:0] I 详见功能表
Out[31:0] O ALU输出结果为32位数据

功能定义

序号 功能 描述
1 加运算 0000:Out = A + B
2 减运算 0001:Out = A - B
3 与运算 0010:Out = A & B
4 或非运算 0011:Out = ~(A | B)
5 异或运算 0100:Out = A ^ B
6 或运算 0101:Out = A | B
7 逻辑左移 0110:Out = B << A[4:0]
8 逻辑右移 0111:Out = B >> A[4:0]
9 算术右移 1000:Out = Signed(B) >>> A[4:0]
10 小于置1(有符号) 1001:Out = Signed(A) < Signed(B) ? 1 : 0
11 小于置1(无符号) 1010:Out = A < B ? 1 : 0
12 将A操作数左移16位(LUI) 1011:Out = A << 16

6.DMEM

端口说明

信号名 方向 描述
DMwr I 数据存储器写使能信号
1:可写
0:无效
Addr[31:0] I 32位地址输入,指定读出或写入地址数据
Imm[31:0] I 经过拓展的32位立即数,用于计算地址
Din[31:0] I 32为数据输入
Dtype I 控制读写状态
0:读
1:写
Dout[31:0] O 32为数据输出,由计算后的地址指定

功能定义

序号 功能 描述
1 读数据 读出Addr所指定的数据到Dout
2 计算地址 计算出由Addr和立即数相加的地址
3 写数据 当DMwr有效且时钟上升到来时,将输入的数据Din写到计算结果所指定的地址

7.EXT

端口说明

信号名 方向 描述
EXTin I 16位输入数据
EXTop I 扩展方式选择信号
0:符号扩展
1:零扩展
EXTout O 扩展到32位后的输出数据

功能定义

序号 功能 描述
1 符号扩展 将16位的输入数据进行符号扩展,输出32位数据
2 零扩展 将16位的输入数据进行零扩展,输出32位数据

8.NPC

端口说明

信号名 方向 描述
Immj[25:0] I 跳转指令目的地址中间26位
ImmB[31:0] I 分支指令的偏移00量(分支选择时加上)
PC[31:0] I 分支指令基地址
CmpA I 分支指令第一个比较数,指令为Jump时当做地址使用
CmpB I 分支指令第二个比较数
is_JR I 单独判断是不是JR指令
NPCop[2:0] I 详见功能表
JORB I 对Jump和Branch选择
0:Jump
1:Branch
NPCout[31:0] O 从Jump和Branch里选出来的下一条指令地址
NextPC O 常规情况下PC + 4

功能定义

序号 功能 描述
1 计算分支地址 先拓展立即数,根据比较结果来计算分支地址:
000:BEQ
001:BNE
010:BLEZ
011:BGTZ
100:BLTZ
101:BGEZ
2 计算跳转地址 通过位拼接 来计算得到跳转地址

9.MDU

端口说明

信号名 方向 描述
clk I 时钟信号
rst I 重置信号
MDUressel I 读寄存器选择信号
0:读LO寄存器
1:读HI寄存器
A[31:0] I 参与计算的第一个值
B[31:0] I 参与计算的第二个值
MDUcoac I MDU使能端
MDUop[2:0] I MDU功能选择信号
000:{HI, LO} = $signed(A) * $signed(B)
001:{HI, LO} = A * B
010:LO = A / B, HI = A % B
011:LO = $signed(A) / $signed(B, HI = $signed(A) % $signed(B)
100:LO = A
101:HI = A
MDUout[31:0] O 将计算结果输出

功能定义

序号 功能 描述
1 无符号乘 {HI, LO} = A * B
2 有符号乘 {HI, LO} = $signed(A) * $signed(B)
3 无符号除 LO = A / B, HI = A % B
4 有符号除 LO = $signed(A) / $signed(B, HI = $signed(A) % $signed(B)
5 写LO寄存器 LO = A
6 读LO寄存器 MDUout = LO
7 写HI寄存器 HI = A
8 读HI寄存器 MDUout = HI

10.ICUT

端口说明

信号名 方向 描述
Ins[31:0] I 传入的32位指令
rs[5:0] O rs寄存器
rt[4:0] O rt寄存器
rd[4:0] O rd寄存器
op[4:0] O 操作码
sa[4:0] O 位移量
Imm[15:0] O 立即数
Addr[25:0] O J指令地址片段
Insout[31:0] O 传给control的32位指令

功能定义

序号 功能 描述
1 分割 将32位指令分割成片段,传到不同的端口中去

11.Control

端口说明

信号名 方向 描述
Rst I 重置
Clk I 时钟信号
Ins I 32位指令,用来译码
PCwr O 控制PC是否可写
0:不可写
1:可写
IRwr O 控制IR是否可写
0:不可写
1:可写
Regin[1:0] O 选择写入Regfile的地址
00:写到rt寄存器
01:写到rd寄存器
10:写到1F寄存器
RFwr O 控制是否可以写入Regfile
0:不可写
1:可写
SEL_A O 选择A操作数
0:从Regfile中来
1:从EXT来
SEL_B O 选择B操作数
0:从Regfile中来
1:从EXT来
ALUop[3:0] O 控制ALU选择哪种运算,详见ALU端口描述
JORB O 控制NPCout选择Jump还是Branch
0:Jump
1:Branch
NPCop[2:0] O 选择Branch的种类
MDUressel O 读寄存器选择信号
0:读LO寄存器
1:读HI寄存器
MDUop[2:0] O 选择MDU的功能,详见功能表
DMwr O 控制DM是否可写
0:不可写
1:可写
Wr1F O 控制是否写入31号寄存器
0:不写
1:写
EXTop[1:0] O 控制扩展方式,详见功能表
WBsel[1:0] O 选择写回寄存器的数据从哪里来
NPCOsel O 选择正常执行下一条还是跳转分支
is_JR O 判断是不是将CMPA作为JR的地址使用
Dtype O 判断数据存储器是要读还是要写
MDUcoac O MDU使能信号

思路:

上一篇:Lambda 表达式


下一篇:关于performSelector afterDelay:0 的使用