目录
一、Paper-Pencil Division Algorithm
二、恢复余数法(Restoring Division Algorithm)
三、Verilog设计
本期介绍二进制除法器中的恢复余数法(Restoring Division Algorithm)。
在小学的时候,我们已经掌握了通过除法列式求出商和余数,也就是长除法,如果除数为一位数,则可简化为短除法。又因为可以用纸笔计算,很多外文中称之为Paper-Pencil Division Algorithm。
如以下例子:
124/3 = ?
其中:
被除数(Dividend,下文用符号N表示) :124
除数(Divisor,下文用符号D表示) :3
商(Quotient,下文用符号Q表示) :41
余数(Remainder,下文用符号R表示) :1
以上数的关系满足下式:
Dividend = Divisor * Quotient + Remainder,即 124 = 3*41 + 1
N/D = (Q, R),即124/3 = (41,1)
在求解Q[2]时,由于除数百位数为1,当Q[2]=1时,Q[2]*3=3>1,所以,Q[2]=0,且余数为1。
在求解Q[1]时,由于余数为1,十位数为2,部分余数为12。当Q[1]=5时,Q[1]*3=15>12,当Q[1]=4时,Q[1]*3=12,刚好相等,余数为0。
在求解Q[0]时,由于余数为0,个位为4,部分余数为4。当Q[0]=2时,Q[0]*3=6>4,所以Q[0]=1,余数为1。
在十进制除法中,商数Q[i]有10种可能(0~9),求解每一个商数即从中0-9中选出一个最大的数,通过选择一个商数Q[i]满足以下条件,设部分余数为psum:
0 <= (psum[i] - Q[i]*D)< D
psum[i-1] = psum[i] - Q[i]*D
R = psum[0]
恢复余数法与第一章节中的算法有点类似,对于二进制除法来说,其商数的选择只有{0,1}两个数,参考维基百科,其算法如下:
设n为被除数和除数的位宽,R为部分余数,N为被除数,D为除数,q(i)为第i为的商数,其中R和D的宽度是2*n(设计时只要对齐位数相减即可)
其流程图如下:
求被除数N=10,除数D=3的商Q和余数R?
10的二进制为1010
3的二进制为0011
初始化如下:
n = 4
D = 00110000
A = 00001010
R = 0000
Q = 0000
设计一个基于恢复余数法的32比特无符号除法器,主要有以下几点:
(1)关键部件,商和余数寄存器,ALU计算;
(2)除法控制逻辑,控制除法开始和结束,以及寄存器移位;
(3)错误处理,处理分母为0的情况。
此处使用状态机控制A寄存器初始化、移位和更新。
恢复余数法,每次都需要判断A寄存器是否小于0,再做是否恢复A寄存器的操作;如N=32‘hffff,D=1,则N/D最小需要33个时钟才能计算商和余数;如N=0, D=32’hffff,则N/D最多需要64个时钟才能计算商和余数,由此可见恢复余数法的速度之慢,而它的优点在于资源消耗小,在速度要求不高的场景中比较合适。
在以下代码中,本处稍作了修改,没有严格执行恢复余数法的步骤:即在更新寄存器后,判断寄存器的值是否大于除数。而是在判断寄存器的值是否大于除数,再决定更新寄存器。
所以,在这个新的规则下,32比特无符号除法器只需要32个时钟。
谢谢您的阅读!
原创不易,如果对您有帮助,记得点赞关注哦。欢迎批评指正,谢谢鼓励!
一起“纸上谈芯”,共同学习: