在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 艾克0928

[讨论] 对FPGA实现除法问题的疑问

[复制链接]
发表于 2016-5-12 13:24:27 | 显示全部楼层
做过除法 直接用的“/”,我是菜鸟 没想到其他办法~~
发表于 2016-5-12 14:35:01 | 显示全部楼层
学习学习
发表于 2016-5-12 16:09:45 | 显示全部楼层
回复 10# 艾克0928


    举个例子,乘以固定的数37:
x*37 = x*32 + x*4 + x
        = (x<<5) + (x<<2) + x
假如: reg [31:0]  data_in;
那么: data_out[36:0] = {data_in, 5'b00000} +{3'b000, data_in, 2'b00} + {5'b00000, data_in};
发表于 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, 也可以直接调用,一般面积和速度都还不错。
 楼主| 发表于 2016-5-14 15:12:21 | 显示全部楼层
回复 11# liuzgyt       "/"只适用于除数为2的幂次方(2^n,其中n为整数)这样的情况,对于除数未知或者一般的实数类型,"/"就不适用了。而且,在某些综合工具中,并不支持"/"的综合……
 楼主| 发表于 2016-5-14 15:23:41 | 显示全部楼层
回复 13# vigorkylin
       恩恩,懂了,非常感谢,那么在Verilog中,对于:   reg signed [31:0] data_in;

   data_out <= {data_in,5'b00000}+{3'b000, data_in, 2'b00} + {5'b00000, data_in};
       和
   data_out <= (data_in <<5) + (data_in<<2) + data_in;
两种写法,功能是一样的我知道,但是其消耗的硬件资源有木有区别呢?
 楼主| 发表于 2016-5-14 15:29:30 | 显示全部楼层
回复 14# yaya126       恩恩,有时间去学学,先把手中的任务完成,你说的第1点我知道,第2点和第3点原理明白一些了,但是具体实现我还不太不明白,这个需要我自己去看文献资料才能明白吧,非常感谢!
发表于 2016-5-15 17:02:29 | 显示全部楼层
本帖最后由 yaya126 于 2016-5-15 17:03 编辑

回复 16# 艾克0928
那么: data_out[36:0] = {data_in, 5'b00000} +{3'b000, data_in, 2'b00} + {5'b00000, data_in};
没有区别,但建议你先算好结果的位宽,把其中一个数补到最大位宽,防止系统来帮你截位,
如此处,{1'b0,  data_in, 5'b00000} + {data_in, 2'b00} + data_in
发表于 2016-5-15 18:08:31 | 显示全部楼层
如果自己设计的话,就随便做了,只要定义好规则,大家都照着做就行了,非常简单。比如,被除数位数宽,除数位数窄,永远循环除下去,除不尽就补零。。。
 楼主| 发表于 2016-5-16 09:45:54 | 显示全部楼层
回复 18# yaya126
data_out <={1'b0,  data_in, 5'b00000}+……,data_out的位宽已经定义为37位,为啥前面还要拓宽一位?是为了防止求和溢出吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-12 08:27 , Processed in 0.030531 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表