|
发表于 2016-5-12 17:00:26
|
显示全部楼层
方法好多种:
1. 移位减,又可以分为每次移动1bit或者多bit,一般我也就做到一次算3个bit. 1bit的,把除数被除数补到相同位宽。优点面积小,但计算cycle长。 一次算两个bit或者3个bit,面积大些但速度快。
2. 查表,考虑牛顿迭代法。 表也不是很大。
求 f(x) = 1/x, 计算 f'(x) = -1/x2.
y = f(x0) + f'(x0)(x-x0) = LUT(i) - (LUT(i)- LUT(i+1) ) *R
y(x) = 2f(x0) - f(x0)/f'(x0) = 2f(x0) -y2*x
3. 针对特殊除数,可以考虑泰勒展开。用2的幂次和来近似。
如下 用最近的2的幂去近似的除,将余数和商迭代知道其和小于除数。 Div/(2^X - K)
step 1 Div/2^X = M0 ... R0 if K*M0 + R0 >=2^X - K, to step 2, else M= M0, R=R0+K*M0
step 2 (K*M0+R0)/2
100/7 = 14 ...2 step 1 100/8 = 12 .. 4 if (12+4) >= 7, to step 2
step 2 (12+4)/8 = 2 ...0 if (2 +0 )<7 . result = 12 +2 ...2.
4. 如果有design ware, 也可以直接调用,一般面积和速度都还不错。 |
|