Help!!这段算法的FPGA 实现!

[复制链接]
 楼主| cuianbin 发表于 2013-3-8 17:44 | 显示全部楼层 |阅读模式
FPGA, TE, hm, TI, RF
FPGA 做算法,真的是让人难受!
iii=0;
while iteration > 0
    iii=iii+1;
    suma = 0;
    sumb = 0;
    for i = 1:1:frequencyN
   
    frqth = Vb(i);
   denominator = (Vb(i)-primaryIteration)*(Vb(i)-primaryIteration) + FWHM*FWHM;
    f(i) = testValue(i)- FWHM*FWHM / denominator ;
    derf(i)=(-2*gain*FWHM*FWHM*(Vb(i)-primaryIteration)/ (denominator*denominator));    suma = suma + f(i) * derf(i);
    sumb = sumb + derf(i) * derf(i) ;
    end
step = -suma/sumb;
我的终极目标是 让以上这段迭代代码用FPGA 实现,可是我学了两个礼拜的DSPbuilder 悲催的发现,也不好实现,里面出现了除法!  
就这么几行代码,用ARM  很快就搞定了,FPGA怎么这么难呢  没有思路啊 没有思路!!! 大神们支个招吧 不想用嵌入式软核去算,还得增加SDRAM
drentsi 发表于 2013-3-8 19:24 | 显示全部楼层
这是算法设计的问题,用了多个除法,尽量把除法去掉。
除法是非常难缠的,别看在ARM上代码写起来简单,执行起来就非常慢了,即使在最快的CPU哪怕是在显卡上,都会非常慢的。
GoldSunMonkey 发表于 2013-3-8 21:12 | 显示全部楼层
drentsi 发表于 2013-3-8 19:24
这是算法设计的问题,用了多个除法,尽量把除法去掉。
除法是非常难缠的,别看在ARM上代码写起来简单,执行 ...

这个是实话啊
 楼主| cuianbin 发表于 2013-3-9 11:31 | 显示全部楼层
drentsi 发表于 2013-3-8 19:24
这是算法设计的问题,用了多个除法,尽量把除法去掉。
除法是非常难缠的,别看在ARM上代码写起来简单,执行 ...

受教了,在尝试修改算法!把除法去掉
GoldSunMonkey 发表于 2013-3-9 21:54 | 显示全部楼层
cuianbin 发表于 2013-3-9 11:31
受教了,在尝试修改算法!把除法去掉

头像很性感
 楼主| cuianbin 发表于 2013-3-10 08:01 | 显示全部楼层
GoldSunMonkey 发表于 2013-3-9 21:54
头像很性感

哈哈,借用了下韩国大明星张东健年轻时的脑袋,不过现在他老了
zyj_hb 发表于 2013-3-10 13:29 | 显示全部楼层
可以试试用task或function做成固定的电路功能。然后像C语言里调用子函数一样调用功能模块。上周刚用task试了一下前导零电路的实现,发现挺好用的。还有我记得以前看到有人说for语句是没办法综合的。我在ISE上实际操作了一下。用verilog写了for语句实现优先编码,可以实现综合。在ISE综合后得到的是组合电路,并下载X3SC500上,可行。
 楼主| cuianbin 发表于 2013-3-11 20:24 | 显示全部楼层
zyj_hb 发表于 2013-3-10 13:29
可以试试用task或function做成固定的电路功能。然后像C语言里调用子函数一样调用功能模块。上周刚用task试 ...

问题在于除法的实现
lwq030736 发表于 2013-3-11 21:57 | 显示全部楼层
你学了DSPbuider的话就用DSPbuider做就可以了,最简单的就是一级一级地做,选好用于运算的定点数的精度就行
如果非要用除法的话可能要加一个比较长的流水线延迟
对速度没要求的话还是能实现的
 楼主| cuianbin 发表于 2013-3-12 14:45 | 显示全部楼层
lwq030736 发表于 2013-3-11 21:57
你学了DSPbuider的话就用DSPbuider做就可以了,最简单的就是一级一级地做,选好用于运算的定点数的精度就行 ...

您说的一级级的做具体是怎么个执行法? 我看DSPbuilder中的除法模块 也是只整出个余数和商来。除一次,只搞出个余数和商,很让人无奈。
lwq030736 发表于 2013-3-12 14:53 | 显示全部楼层
cuianbin 发表于 2013-3-12 14:45
您说的一级级的做具体是怎么个执行法? 我看DSPbuilder中的除法模块 也是只整出个余数和商来。除一次,只 ...

FPGA做的除法本来就是给余数和商的,没小数的
你要根据你的精度要求把被除数放大2的n次方倍,自己给自己定个小数点
比如111.000000001,你看下定点数的小数怎么表示的就知道了
lwq030736 发表于 2013-3-12 15:32 | 显示全部楼层
好像之前跟你讲过了
 楼主| cuianbin 发表于 2013-3-12 15:50 | 显示全部楼层
lwq030736 发表于 2013-3-12 14:53
FPGA做的除法本来就是给余数和商的,没小数的
你要根据你的精度要求把被除数放大2的n次方倍,自己给自己 ...

我理解的您的意思是: 10/3,结果是3.3333. 但是FPGA 只会给出两个数 商是3 余数是1.  如果我 把10 乘以2的10次方,也就是被除数右移10位,再除以3,那么会得到的商是3413,余数是1.   商3413 转换成2进制后 再左移10位,得到的数,转换成小数,与3.3333 更加接近!

我有两个疑问: 余数是否直接丢掉了,只拿商与后面的数做运算?
               整个思路,就是通过扩大缩小,让除数和被除数都转化成整数,进行运算,最后再通过移位移回到真实的数值?
                 DSP builder 里面除法模块数据类型有 Signed  Fractional     这种数据类型,整数位和小数位分别表示。 如果我采用这种类型,得到商和余数,又该如何处理呢?
 楼主| cuianbin 发表于 2013-3-12 15:57 | 显示全部楼层
lwq030736 发表于 2013-3-12 15:32
好像之前跟你讲过了

是的,谢谢您! 当时理解不太透彻。一直没有实现。 我尝试着用DSP builder 做算法,学习了一段时间后,发现 除法照样是给出余数和商,有点失望。我又重新回过头来看! 我打算根据你说的再做一下。
lwq030736 发表于 2013-3-12 16:20 | 显示全部楼层
cuianbin 发表于 2013-3-12 15:50
我理解的您的意思是: 10/3,结果是3.3333. 但是FPGA 只会给出两个数 商是3 余数是1.  如果我 把10 乘以2的 ...

余数不要了,直接丢掉
 楼主| cuianbin 发表于 2013-3-12 16:21 | 显示全部楼层
lwq030736 发表于 2013-3-12 16:20
余数不要了,直接丢掉

好的!!
lwq030736 发表于 2013-3-12 16:22 | 显示全部楼层
cuianbin 发表于 2013-3-12 15:57
是的,谢谢您! 当时理解不太透彻。一直没有实现。 我尝试着用DSP builder 做算法,学习了一段时间后,发 ...

你可以先做一些简单的例子,验证一下
不必一开始就做你上面给的那个公式
 楼主| cuianbin 发表于 2013-3-12 16:49 | 显示全部楼层
lwq030736 发表于 2013-3-12 16:22
你可以先做一些简单的例子,验证一下
不必一开始就做你上面给的那个公式 ...

嗯 好的,这段时间 我就着手做仿真,此贴暂时不结,我有了新的认识,再来和你讨论。谢谢!
GoldSunMonkey 发表于 2013-3-12 21:06 | 显示全部楼层
cuianbin 发表于 2013-3-12 16:49
嗯 好的,这段时间 我就着手做仿真,此贴暂时不结,我有了新的认识,再来和你讨论。谢谢! ...

到時候多來分享啊
 楼主| cuianbin 发表于 2013-3-13 08:37 | 显示全部楼层
GoldSunMonkey 发表于 2013-3-12 21:06
到時候多來分享啊

必须的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:来到这个论坛,乐于分享,好好学习!!

86

主题

439

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部