关于div/mod除法和取余的化简及硬件实现

在硬件设计中常会用到整数之间的除法和取余操作,一般而言除法和取余的两个操作数都是变量时,这个算法的实现复杂度包括时间复杂度和空间复杂度是O(N)的,N是被除数和除数的最大位宽【这个复杂度的结论不一定是准确的】。

时间复杂度体现在硬件实现上就是分多少次基础的加减计算上,基础计算越多就需要更多的clk,否则时序无法收敛。

空间复杂度体现在硬件上就是占用内存的大小,或者寄存器的大小。对应的是面积要求。

1.div/mod的几个公式

硬件实现div/mod时,可以从拆分和约分上来降低复杂度。拆分是对于变量和常量(或有限常量集)div/mod都可用的方法。约分是对常量或有限常量集可用的方法。

对于有限常量集的div/mod,它们的复杂度可以做到o(logN).所以硬件在做div/mod的时候,如果发现除数或被除数是比较少的集合,可以不用变量除div/mod这种通用电路。可以根据数据进行优化

floor(a/b)=floor((x+y)/b)\\ =\left\{\begin{matrix}floor(x/b)+floor(y/b) & when\ mod(x,b)+mod(y,b)<b\\ floor(x/b)+floor(y/b) +1& when\ mod(x,b)+mod(y,b)>=b \end{matrix}\right.

mod(a,b)=mod((x+y),b)\\ =\left\{\begin{matrix}mod(x,b)+mod(y,b) & when\ mod(x,b)+mod(y,b)<b\\ mod(x,b)+mod(y,b)-b & when\ mod(x,b)+mod(y,b)>=b \end{matrix}\right.

除法取余的特殊情况有一个公式,在b|a的前提下,即a%b == 0时,(a/b)%mod == a%(mod*b)/b,证明如下:

可参考:

[质因数分解][除法取余]Sumdiv LibreOJ10211_给出a,b求a^b的所有约数之和 mod 9901-CSDN博客

由上面的两个公式可以推导出下面的公式:

如果:
x=kA+y              #y<A
则:
x % AB
=(kA+y) % AB
=(kA%AB + y%AB)%AB  #y<A,所以y%AB=y
=(A(k%B) + y)%AB    #因为k%B必然<=B-1,A(k%B)+y < A(B-1) +A = AB
=A(k%B) + y
x=kA+y y<A
x // (AB)
=(kA+y) // (AB)   #y<A,所以y // AB=0
=kA // AB  
=k//B

例如
x=x[m:b]*(2^b) + x[b-1:0]
则:
x // (2^b)*B
=(x[m:b]*(2^b) + x[b-1:0]) // (2^b)*B
=x[m:b]//B

 2.div/mod的RTL实现

这里只讨论对固定整数求div/mod

在硬件实现中对2^n取div和mod是比较简单的,非2的幂次就会复杂一些。设除数为y,被除数为x则可以将y表示为:

y=AB
 =(2^m)B
其中A=2^m

 x // y
=x[b:m] // B

 x % y
=(x[b:m] % B)<<m + x[m-1:0]

经过化简之后变成了对B的div和mod,从上面的说明可知,B一定是一个奇数。这个时候可以考虑和B附近的2的幂次数做个比较,比如:

2^n<B<2^(n+1)
对x//B用(x>>n)-a或者(x>>(n+1))+b来表示
其中a/b考虑是不是可以找到一些规律,这里
先给出这么个思路

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值