单周期 32 位 MIPS 处理器上的数据路径
Data path on a single-cycle 32-bit MIPS processor
我正在做作业,我需要回答数据路径上标记为 A、B、C、D、E 的信号值,下面是一个单周期 32 位 MIPS 处理器,但是我有一些关于 D 和 E 的问题,
假设前四行已经执行,处理器正在执行lw指令。第一个addi
指令位于内存地址 0x00040210
addi $t0,$zero,0x3ff0
addi $t0,$t0,16
sw $t0,-8($t0)
addi $t0,$t0,12
lw $s2,-20($t0)
对于 D:
所以它是程序计数器之后的一条路径,我们已经执行了四条指令,第一条指令从地址0x00040210
开始导致:
address 0x00040210: addi $t0,$zero,0x3ff0
address 0x00040214: addi $t0,$t0,16
address 0x00040218: sw $t0,-8($t0)
address ???: addi $t0,$t0,12
address ???: lw $s2,-20($t0)
我卡在了问题标记的地址处,如何从那里计算地址?
对于 E:
不知道该怎么办,希望高人指教?
D:
有一个加法器(在你的示意图中字母 "D" 上方)将常数 4 添加到 PC。
这意味着行 "D" 将始终保持值 PC+4
- 即使当前指令是跳转或分支指令。
如果指令不是跳转或分支指令,"D" 线会通过原理图左上角的两个多路复用器反馈到 PC 寄存器的输入。
这意味着 PC
的下一个值将是 PC+4
的旧值,除非执行跳转或分支指令。
顺便说一句:
原理图中的 CPU 不像真正的 MIPS CPU 那样工作(正如 10 年前在 WLAN 路由器中发现的那样)。
如果我正确理解原理图,只有两条指令可以执行 jump/branch:j
的变体和 beq
之一(或 beqz
)(两种变体都不使用延迟槽)。
使用这样的 CPU 你不能进行子程序调用(函数调用),因为没有指令 "jumping back" 调用函数。
E:
"E" 是一些多路复用器的输出。如果您没有执行 "MemToReg" 指令(我想 lw
的意思),"B" 信号通过多路复用器馈送。
也就是说:如果当前指令不是lw
,"E"和"B"是相等的。
如果指令是lw
,"E"是存储在地址"B"的RAM中的值。
编辑
For E, still not sure how to get that outcome though
这真的是一个编程问题,而不是一个电子问题。让我们看看你的程序:
addi $t0,$zero,0x3ff0
现在 t0
包含 0x3FF0
addi $t0,$t0,16
现在 t0
包含 0x4000
sw $t0,-8($t0)
将值0x4000写入RAM地址0x3FF8(注:0x4000-8=0x3FF8)
addi $t0,$t0,12
现在 t0
包含 0x400C
lw $s2,-20($t0)
从地址0x3FF8读取一个字(注:0x400C-20=0x3FF8)。
以上两条指令,值0x4000已经写入地址0x3FF8。
因此,从 RAM 中读取值 0x4000。因此,值 0x4000 通过多路复用器馈送到行 "E".
我正在做作业,我需要回答数据路径上标记为 A、B、C、D、E 的信号值,下面是一个单周期 32 位 MIPS 处理器,但是我有一些关于 D 和 E 的问题,
假设前四行已经执行,处理器正在执行lw指令。第一个addi
指令位于内存地址 0x00040210
addi $t0,$zero,0x3ff0
addi $t0,$t0,16
sw $t0,-8($t0)
addi $t0,$t0,12
lw $s2,-20($t0)
对于 D:
所以它是程序计数器之后的一条路径,我们已经执行了四条指令,第一条指令从地址0x00040210
开始导致:
address 0x00040210: addi $t0,$zero,0x3ff0
address 0x00040214: addi $t0,$t0,16
address 0x00040218: sw $t0,-8($t0)
address ???: addi $t0,$t0,12
address ???: lw $s2,-20($t0)
我卡在了问题标记的地址处,如何从那里计算地址?
对于 E:
不知道该怎么办,希望高人指教?
D:
有一个加法器(在你的示意图中字母 "D" 上方)将常数 4 添加到 PC。
这意味着行 "D" 将始终保持值 PC+4
- 即使当前指令是跳转或分支指令。
如果指令不是跳转或分支指令,"D" 线会通过原理图左上角的两个多路复用器反馈到 PC 寄存器的输入。
这意味着 PC
的下一个值将是 PC+4
的旧值,除非执行跳转或分支指令。
顺便说一句:
原理图中的 CPU 不像真正的 MIPS CPU 那样工作(正如 10 年前在 WLAN 路由器中发现的那样)。
如果我正确理解原理图,只有两条指令可以执行 jump/branch:j
的变体和 beq
之一(或 beqz
)(两种变体都不使用延迟槽)。
使用这样的 CPU 你不能进行子程序调用(函数调用),因为没有指令 "jumping back" 调用函数。
E:
"E" 是一些多路复用器的输出。如果您没有执行 "MemToReg" 指令(我想 lw
的意思),"B" 信号通过多路复用器馈送。
也就是说:如果当前指令不是lw
,"E"和"B"是相等的。
如果指令是lw
,"E"是存储在地址"B"的RAM中的值。
编辑
For E, still not sure how to get that outcome though
这真的是一个编程问题,而不是一个电子问题。让我们看看你的程序:
addi $t0,$zero,0x3ff0
现在 t0
包含 0x3FF0
addi $t0,$t0,16
现在 t0
包含 0x4000
sw $t0,-8($t0)
将值0x4000写入RAM地址0x3FF8(注:0x4000-8=0x3FF8)
addi $t0,$t0,12
现在 t0
包含 0x400C
lw $s2,-20($t0)
从地址0x3FF8读取一个字(注:0x400C-20=0x3FF8)。
以上两条指令,值0x4000已经写入地址0x3FF8。
因此,从 RAM 中读取值 0x4000。因此,值 0x4000 通过多路复用器馈送到行 "E".