您的位置:首页 > 其它

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

2014-09-05 13:23 483 查看
将陆续上传本人写的新书《自己动手写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位是商。

下一次将给出除法指令的实现代码,敬请关注!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐