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