在16位数据路径上移位32位数字



如何在16位数据路径上移位32位数字

这是一个计算机体系结构问题。


我的数据路径只有16位宽,这意味着我的ALU一次只能处理16位操作数。我的寄存器是32位宽的,可在低位和高位16位部分寻址。

每次我读寄存器的下半部分时,我还会读一个额外的位,告诉我上半部分是否包含任何1(参考文献1(。


到目前为止,我实现了左移逻辑。(sll-rd,rs1,rs2(

  • 读取rs1寄存器的下半部分,并将其移位rs2寄存器中指定的量
  • 我从这16位中移出的位被存储在alu内部的一个临时16位寄存器中
  • 移位后的值将写回较低的rd寄存器,并设置状态位(参见参考文献1(

现在,如果没有数据写入较高的rs1寄存器(请参阅参考文献1(,并且temp-alu寄存器中的位都为0,那么我的移位操作就完成了。

否则需要上半部分的第二个循环

  • 读取高rs1寄存器并将其移位存储在低rs2寄存器中的量
  • 但现在用alu临时寄存器中存储的值填充rs1(而不是像第一个循环中那样用0(
  • 移出16位空间的位将被丢弃
  • 结果被写回较高的rd寄存器,并设置rd状态位(参见参考文献1(

示例1:假设rs1为0x00001234,rs2为0x00000002(左移2(

  • 首先读取rs1和rs2的低16位,表示0x1234和0x0002。但通过阅读,我也得到了两个寄存器的状态位,在这种情况下,rs1为0,rs2为0,因为两个寄存器中的高16位都是0。根据给出的数据,我可以左移2。导致0x48D0。由于没有1从sll中移出,我可以将结果存储在较低的rd中,并将其状态位设置为0。(这都是在一个周期内完成的(

示例2:假设rs1是0x0000D234,rs2是0x00000005(左移5(

  • 首先我读取rs1和rs2的低16位,表示0xD234和0x0005。但通过阅读,我也得到了两个寄存器的状态位,在这种情况下,rs1为0,rs2为0,因为两个寄存器中的高16位都是0。根据给出的数据,我可以左移5。导致0x4680。但现在我将11010(0x1A(从16位空间中移出。这个值存储在Alu临时寄存器中,由于它包含1,我必须执行另一个循环
  • 在第二个周期中,我读取上部rs1和下部rs2,表示0x0000和0x0005。我执行了另一个向左5的移位,但现在Alu临时寄存器用于填充移位后的值。0x0000->0x00__->0x001A。然后,这个结果被写回上面的rd。因此,在两个16位周期中完成了我的32位sll

示例3:假设rs1是0x01231234,rs2是0x00000002(左移2(

  • 首先读取rs1和rs2的低16位,表示0x1234和0x0002。但通过读取,我也得到了两个寄存器的状态位,在这种情况下,rs1为1,rs2为0,因为rs1的高16位是非零的。由于rs1的状态位是非零的,所以即使没有从较低的16位中移出1,我也必须预形成第二个循环(参见示例2(。从现在起,它遵循示例2,通过写回rd并为高位预形成第二个周期

我希望这些例子能提供更好的见解。



现在我想实现右移操作(算术和逻辑(。但是,如何在最多2个周期内执行操作?如果我必须首先读取较低的rs1寄存器(包括状态位(


感谢阅读;这是我在这里的第一个问题,所以请不要对我太苛刻:D

从读取较高部分开始。在第一个循环中,你将阅读高部分。进行右移,移出的位将出现在tmp寄存器的高部分,并且移位的结果将被写回。在第二个循环中,读取低位部分,进行移位和或,结果出现在tmp寄存器中。那么这部分的结果将被写回。

相关内容

  • 没有找到相关文章

最新更新