1.MFLO
2.MFHI
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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的输出 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| Addr | I | 当前指令的地址 |
| IMEM | I | 指令存储器读写信号 |
| Iout | O | 当前指令 |
| 序号 | 功能 | 描述 |
|---|---|---|
| 1 | 取指令 | 输出Addr地址所代表的当前指令 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| IRin | I | 来自IMEM的指令 |
| IRwr | I | 控制指令寄存器的读写 1:可以写 0:不可写 |
| IRout | O | 当前指令 |
| 序号 | 功能 | 描述 |
|---|---|---|
| 1 | 缓冲 | 对来自IMEM的指令进行缓冲 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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所对应的寄存器中 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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写到计算结果所指定的地址 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| EXTin | I | 16位输入数据 |
| EXTop | I | 扩展方式选择信号 0:符号扩展 1:零扩展 |
| EXTout | O | 扩展到32位后的输出数据 |
| 序号 | 功能 | 描述 |
|---|---|---|
| 1 | 符号扩展 | 将16位的输入数据进行符号扩展,输出32位数据 |
| 2 | 零扩展 | 将16位的输入数据进行零扩展,输出32位数据 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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 | 计算跳转地址 | 通过位拼接 来计算得到跳转地址 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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位指令分割成片段,传到不同的端口中去 |
| 信号名 | 方向 | 描述 |
|---|---|---|
| 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使能信号 |
原文:https://www.cnblogs.com/lautoh/p/14961281.html