【HDL系列】除法器(1)——恢复余数法

目录

一、Paper-Pencil Division Algorithm

二、恢复余数法(Restoring Division Algorithm)

三、Verilog设计


本期介绍二进制除法器中的恢复余数法(Restoring Division Algorithm)。

一、Paper-Pencil Division Algorithm

在小学的时候,我们已经掌握了通过除法列式求出商和余数,也就是长除法,如果除数为一位数,则可简化为短除法。又因为可以用纸笔计算,很多外文中称之为Paper-Pencil Division Algorithm。

如以下例子:

124/3 = ?

【HDL系列】除法器(1)——恢复余数法_第1张图片

其中:

被除数(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]

 

二、恢复余数法(Restoring Division Algorithm)

 

恢复余数法与第一章节中的算法有点类似,对于二进制除法来说,其商数的选择只有{0,1}两个数,参考维基百科,其算法如下:

【HDL系列】除法器(1)——恢复余数法_第2张图片

设n为被除数和除数的位宽,R为部分余数,N为被除数,D为除数,q(i)为第i为的商数,其中R和D的宽度是2*n(设计时只要对齐位数相减即可)

其流程图如下:

【HDL系列】除法器(1)——恢复余数法_第3张图片 恢复余数法流程图

 

求被除数N=10,除数D=3的商Q和余数R?

10的二进制为1010

3的二进制为0011

初始化如下:

n = 4

D = 00110000

A = 00001010

R = 0000

Q = 0000

【HDL系列】除法器(1)——恢复余数法_第4张图片

三、Verilog设计

设计一个基于恢复余数法的32比特无符号除法器,主要有以下几点:

(1)关键部件,商和余数寄存器,ALU计算;

(2)除法控制逻辑,控制除法开始和结束,以及寄存器移位;

(3)错误处理,处理分母为0的情况。

【HDL系列】除法器(1)——恢复余数法_第5张图片

此处使用状态机控制A寄存器初始化、移位和更新。

恢复余数法,每次都需要判断A寄存器是否小于0,再做是否恢复A寄存器的操作;如N=32‘hffff,D=1,则N/D最小需要33个时钟才能计算商和余数;如N=0, D=32’hffff,则N/D最多需要64个时钟才能计算商和余数,由此可见恢复余数法的速度之慢,而它的优点在于资源消耗小,在速度要求不高的场景中比较合适。

在以下代码中,本处稍作了修改,没有严格执行恢复余数法的步骤:即在更新寄存器后,判断寄存器的值是否大于除数。而是在判断寄存器的值是否大于除数,再决定更新寄存器。

所以,在这个新的规则下,32比特无符号除法器只需要32个时钟。

 

【HDL系列】除法器(1)——恢复余数法_第6张图片 除法控制状态机

 

【HDL系列】除法器(1)——恢复余数法_第7张图片 寄存器移位和运算
【HDL系列】除法器(1)——恢复余数法_第8张图片 寄存器更新逻辑

 

谢谢您的阅读!

原创不易,如果对您有帮助,记得点赞关注哦。欢迎批评指正,谢谢鼓励!

一起“纸上谈芯”,共同学习:

【HDL系列】除法器(1)——恢复余数法_第9张图片

你可能感兴趣的:(纸上谈芯)