首页 > 代码库 > 自己动手写CPU之第七阶段(9)——除法指令说明及实现思路

自己动手写CPU之第七阶段(9)——除法指令说明及实现思路

将陆续上传本人写的新书《自己动手写CPU》,今天是第32篇,我尽量每周四篇

亚马逊的销售地址如下,欢迎大家围观呵!

http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4

China-pub的销售地址如下:

http://product.china-pub.com/3804025

北发的销售地址如下:

http://book.beifabook.com/Product/BookDetail.aspx?Plucode=712123950&extra=0_s25960657


7.10 除法指令说明

      除法指令有2条,包括:div、divu,各指令的格式如图7-15所示。从图中可知这2条指令的指令码都是SPECIAL,第6-15bit都为0,可以依据第0-5bit的功能码确定是哪一种指令。


  •  当功能码是6‘b011010时,表示是div指令,有符号除法运算

      指令用法为:div rs, rt

      指令作用为:{HI, LO} <- rs / rt,将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值,作为有符号数进行除法运算,将商保存到寄存器LO,余数保存到寄存器HI。

  •  当功能码是6‘b011011时,表示是divu指令,无符号除法运算

      指令用法为:divu rs, rt

      指令作用为:{HI, LO} <- rs / rt,将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值,作为无符号数进行除法运算,将商保存到寄存器LO,余数保存到寄存器HI。

7.11 除法指令实现思路

7.11.1 试商法

      OpenMIPS设计采用试商法实现除法运算,对于32位的除法,需要至少32个时钟周期才能得到除法结果。本节介绍试商法的一般过程。

      设被除数是m,除数是n,商保存在s中,被除数的位数是k,其计算步骤如下(为了便于说明,在此处将所有数据的最低位称为第1位,而不称为第0位)。

      1、取出被除数的最高位m[k],使用被除数的最高位减去除数n,如果结果大于等于0,则商的s[k]为1,反之为0。

      2、如果上一步得出的结果是0,表示当前的被减数小于除数,则取出被除数剩下的值的最高位m[k-1],与当前被减数组合做为下一轮的被减数;如果上一步得出的结果是1,表示当前的被减数大于除数,则利用上一步中减法的结果与被除数剩下的值的最高位m[k-1]组合做为下一轮的被减数。然后,设置k等于k-1。

      3、新的被减数减去除数,如果结果大于等于0,则商的s[k]为1,否则s[k]为0,后面的步骤重复2-3,直到k等于1。

上述步骤可以使用图7-16描述。                         


      以4‘b1101除以4‘b0010为例, 采用试商法时的计算步骤如表7-4所示。


7.11.2 实现思路

      新建一个模块DIV,在其中实现采用试商法的32位除法运算。当流水线执行阶段的EX模块发现当前指令是除法指令时,首先暂停流水线,然后将被除数、除数等信息送到DIV模块,开始除法运算。DIV模块在除法运算结束后,通知EX模块,并将除法结果送到EX模块,后者依据除法结果设置HI、LO寄存器的写信息,同时取消暂停流水线。

7.11.3 系统结构的修改

      为了实现7.11.2节的思路,修改系统结构如图7-17所示。


      EX模块通过接口div_opdata1_o、div_opdata2_o分别给出被除数、除数,同时通过接口signed_div_o指明是否是有符号除法,然后通过接口div_start_o指示开始除法运算。

      DIV模块在除法运行完毕后,通过接口ready_o告知EX模块,并且通过接口result_o输出除法结果,result_o的宽度是64位,其中高32位是余数,低32位是商。


下一次将给出除法指令的实现代码,敬请关注!


自己动手写CPU之第七阶段(9)——除法指令说明及实现思路