OpenMIPS除法指令实现解析

需积分: 0 0 下载量 74 浏览量 更新于2024-08-05 收藏 958KB PDF 举报
"这篇文档详细介绍了除法指令的实现过程,包括试商法的原理和在OpenMIPS架构中的具体应用。" 在计算机系统中,除法指令的实现是一个复杂的过程,尤其在像OpenMIPS这样的处理器架构中。文档"除法指令的实现No.07"探讨了这个主题,主要分为三个部分:除法指令的说明、系统结构修改以及具体实现。 首先,文档解释了除法的基本思想——试商法,这是一种类似于我们小时候学习的除法方法,但在这里全部转化为二进制运算。在OpenMIPS中,32位除法需要至少32个时钟周期来完成。具体步骤如下: 1. 取出被除数的最高位m[k],然后用这个最高位去减去除数n。如果差值大于等于0,说明被除数至少能被除数整除一次,因此商的相应位s[k]为1;否则,s[k]为0。 2. 如果第一步的差值为0,说明当前的被减数小于除数,此时我们需要结合被除数的次高位m[k-1]继续尝试。若差值为1,表示被除数大于除数,需要结合减法结果与m[k-1]进行下一轮减法。 3. 这个过程会不断迭代,每次将k减1,直到k等于1。每次迭代后,根据减法结果更新商的相应位。 此外,文档提到了系统的结构修改,即在执行除法指令时需要暂停流水线。一个名为DIV的新模块被添加,负责执行除法。当执行到EX(执行)阶段时,被除数和除数的值被传入DIV模块,通过signed_div_i标志确定是否进行有符号除法。DIV模块在start_i信号触发后开始工作,完成除法后通过ready_o和result_o接口将结果返回到EX模块,最终结果会存储在HILO寄存器中。 实现这部分,文档指出DIV模块包含一个状态机,具有四个状态:DivFree(空闲)、DivStart(开始)、DivByZero(除以零)和DivEnd(结束)。当start_i信号为DivStart并且annul_i信号为0时,除法开始。如果除数为0,状态机将进入DivByZero状态,商和余数均设为0,然后进入DivEnd状态,准备好返回结果。 这篇文档详细阐述了OpenMIPS中除法指令的实现原理,从试商法的基本逻辑到系统层面的硬件支持,为我们揭示了计算机内部如何执行除法操作的复杂细节。