在单周期数据路径中加载半字和加载字节
有一个问题是关于在单个周期数据路径中实现一个加载字节而不必更改数据存储器,并且解决方案如下所示。
替代文字http://img214.imageshack.us/img214/7107/99897101.jpg
这实际上是一个现实的问题; 大多数内存系统完全是基于字的,并且单个字节通常只在处理器内部处理。 当在许多计算机上看到“总线错误”时,这通常意味着处理器试图访问未正确字对齐的内存地址,并且内存系统引发异常。 无论如何,因为字节地址可能不是4的倍数,我们不能直接将它们传递给内存。 然而,我们仍然可以得到任何字节,因为每个字节都可以在某个字中找到,并且所有字地址都是4的倍数。所以我们要做的第一件事就是确保我们找到正确的字。 如果我们取地址的高30位(即ALUresult [31-2])并将它们与低端的两个0位(这就是“左移2”单位真的在做什么)组合在一起,包含所需字节的字的字节地址。 这只是字节本身的地址,四舍五入为4的倍数。这个改变意味着lw现在也将地址舍入为4的倍数,但这没关系,因为对于这个存储器,非对齐地址对lw无效单元。 好的,现在我们从内存中获取数据字。 我们如何获得我们想要的字节? 那么请注意,字内字节的字节偏移量仅由字节地址的低2位给出。 因此,我们只需使用这2位来选择合适的字节使用多路复用器。 请注意使用big-endian字节编号,适合MIPS。 接下来,我们必须将字节零扩展为32位(即,将其与高端的24个零结合),因为问题指定这样做。 实际上,这在这个问题上是一个小错误:实际上,lbu指令将字节零扩展,但是lb符号将其扩展。 好吧。 最后,我们必须扩展MemtoReg控制的多路复用器来接受一个新的输入:1b情况下的零扩展字节。 MemtoReg控制信号必须加宽到2位。 原始的0和1的情况分别变为00和01,我们增加一个新的情况10,仅在磅的情况下使用。
即使阅读了解释之后,我也不太了解它的工作原理,特别是关于左移ALU结果2将给出字节地址......这怎么可能? 所以如果我想加载一个半字,那么我会做一个左移,我会得到半字的地址? 通过修改数据存储器可以更好地装载字节,加载半字? (上面的问题提出了限制,我们不能修改数据存储器)
原作者似乎正在向从内存中读取的32位数据添加一个字节多路复用器。 该存储器允许一个完整的32位自然对齐的加载(lw指令),附加字节多路复用器和零扩展允许加载字节指令(lbu指令)。
ALU结果的左移产生了一个字地址,而不是一个字节地址,并且说明了信号路由中隐含的右移两位。 最终的结果就是ALU结果的低两位在发送到存储器之前被屏蔽(置零)。 ALU值的两个LSB由存储器的下行流馈送到字节多路复用器,允许字存储器读取任意字节。
所显示的逻辑没有直接支持加载半字(16位),只是字节和完整的32位字。 但是,您可以轻松修改字节寻址逻辑,以使用类似方法支持字而不是字节(甚至两个字)。
链接地址: http://www.djcxy.com/p/19203.html上一篇: Load half word and load byte in a single cycle datapath