无异常指令(共38条)
1.算术指令
- ADDIU
- ADDU
- SUBU
- MULU
- DIVU
- MUL
- DIV
2.逻辑指令
- AND
- ANDI
- NOR
- OR
- ORI
- XOR
- XORI
- LUI
3.移位指令
- SLLV
- SLL
- SRAV
- SRA
- SLT
- SLTI
- SLTIU
- SLTU
- SRL
- SRLV
4.分支跳转指令
- J
- JAL
- JR
- BEQ
- BNE
- BGEZ
- BGTZ
- BLEZ
- BLTZ
5.读写指令
- LW
- SW
6.数据移动
1.MFLO
2.MFHI
建议包括的模块
- mips模块是一个CPU,只含有复位信号rst和时钟信号clk,内部由PC、NPC、DM、IM、EXT、ALU、IR、Ctrl等模块以及一些多路选择器和缓冲器组成。
- PC(程序计数器):PC是指令计数器,主要功能是完成输出当前指令地址并保存下一条指令地址。复位后,PC指向0x0000_3000,此处为第一条指令的地址。
- NPC(NextPC计算单元):NPC是下条指令计数器,主要功能是计算下一条指令地址,NPCOp[1:0]决定如何计算NPC。
- RF(通用寄存器组,也称为寄存器文件、寄存器堆):RF主要功能是保存寄存器文件,并支持对通用寄存器的访问。
- ALU(算术逻辑单元):ALU主要功能是完成对输入数据的算数逻辑计算,包括加法、减法、按位或运算以及判断两个操作数是否相等。
- EXT(扩展单元):EXT主要功能是将16位的数据扩展为32位数据。
- IM(指令存储器):IM是指令存储器,主要功能是根据读控制信号DMWr,读写对应addr地址的32位数据。
- IR(指令寄存器):IR主要功能是完成对来自IM的指令的缓冲。
- DM(数据存储器):DM是数据存储器,主要功能是根据读写控制信号DMWr,读写对应addr地址的32位数据。
- Flopr(数据寄存器):DR、A、B、ALUOut由flopr模块实例化,主要功能是数据缓冲,由带复位的D触发器构成。
- 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使能信号 |