打印

求助!FPGA 除法 混合运算

[复制链接]
4061|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cuianbin|  楼主 | 2012-12-20 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我正在用FPGA 做最小二乘法,不可避免的要用到除法。 我要计算 C=A-B/D  其中B/D计算用的是LPM_divider 模块 会得到B/D的余数和商 quotient  ,remain  。 如何用这个余数和商 与A 参与减法运算 得到C 呢? 请大神留步,指点迷津,不胜感激!
沙发
GoldSunMonkey| | 2012-12-21 23:31 | 只看该作者
:L 砸场子么??

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-12-21 23:31 | 只看该作者
:L 砸场子么??

使用特权

评论回复
地板
Oxygen.Chu| | 2012-12-22 11:03 | 只看该作者
人家就是来踢馆的,猴哥你可得给咱踢回去啊!!
用你的佛山无影脚~~

使用特权

评论回复
5
xjsxjtu| | 2012-12-22 22:11 | 只看该作者
:)

使用特权

评论回复
6
GoldSunMonkey| | 2012-12-22 22:30 | 只看该作者
Oxygen.Chu 发表于 2012-12-22 11:03
人家就是来踢馆的,猴哥你可得给咱踢回去啊!!
用你的佛山无影脚~~

哈哈,算了。还是包容一下了

使用特权

评论回复
7
hawksabre| | 2012-12-23 09:32 | 只看该作者
个人觉得应该是可以搞定的

使用特权

评论回复
8
hawksabre| | 2012-12-23 09:34 | 只看该作者
乘法,除法一样,在FPGA上的实现方式,无外乎3种:NIOSII上的软件实现,LEs实现,硬件实现。
至于除法通过LEs来实现,复杂的可以通过除法IP Core,而比较简单的除法大可以通过计数器实现。
比方说,计算:3600/60=?
是不是可以这样呢:
reg[11:0] cnt1,cnt2,result;
reg done_r;
always @(posedge clk or negedge rst_n)
    if(!rst_n) begin cnt1 <= 12'd0; cnt2 <= 12'd0; result <= 12'd0; done_r <= 1'b0; end
    else if(cnt1 < 12'd3600)
        begin
            cnt1 <= cnt1+1'b1;
            if(cnt2 == 12'd59) begin cnt2 <= 12'd0; result <= result+1'b1; end
            else cnt2 <= cnt2+1'b1;
        end
    else done_r <= 1'b1;

下面是我设计电子时钟的一段代码,在时间进位控制时关于除法有以下三种方法的对比:
方法一:完全用除法


方法二:部分用除法





方法三:完全不用除法


通过以上对比,可以很明显看出,一旦调用除法模块,势必会占用更大的面积,但是它可以大大减少设计代码的工作量,所以具体情况要综合考虑。

注:“在 quartus II 9.0 版本中 ,“除法器”可以自己定义。但是在 10.0 版本, 返些选项就消失了。尤其是说消失,还不如说更“默认化”了。默认下“除法器”和“求余器”是 32 位输出。但是经过“编译”过后,编译器会“自动优化”最适合的位宽。所以这也是为什么,在声明时是 32 位呢!除此之外,“除法器”和“求余器”.v 文件会“自劢添加”在原本 .v 文件的局次之下。”

使用特权

评论回复
评论
yulunna 2013-10-26 10:47 回复TA
给力!!!!! 
9
hawksabre| | 2012-12-23 09:39 | 只看该作者
在网上找到了一些技术文档   希望对你有帮助

基于FPGA的快速浮点除法器IP核的实现.pdf

417.95 KB

基于FPGA的除法器设计.pdf

267.7 KB

基于FPGA的32位除法器设计.pdf

203.08 KB

在FPGA中实现高精度快速除法.pdf

194.54 KB

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GoldSunMonkey + 2 很给力!
10
GoldSunMonkey| | 2012-12-23 22:47 | 只看该作者
感谢hawksabre

使用特权

评论回复
11
Backkom80| | 2012-12-24 08:02 | 只看该作者
:)

使用特权

评论回复
12
cuianbin|  楼主 | 2012-12-24 16:37 | 只看该作者
不好意思! 发错版块了! 抱歉! 绝对没有那个意思。

使用特权

评论回复
13
cuianbin|  楼主 | 2012-12-24 16:40 | 只看该作者
Oxygen.Chu 发表于 2012-12-22 11:03
人家就是来踢馆的,猴哥你可得给咱踢回去啊!!
用你的佛山无影脚~~

哈哈 绝无此意!

使用特权

评论回复
14
cuianbin|  楼主 | 2012-12-24 16:42 | 只看该作者
GoldSunMonkey 发表于 2012-12-21 23:31
砸场子么??

没有了!我觉得Xillinx应该也有除法的IP 核 应该也是只得到余数和商 下一部运算如何处理 应该是相同的。我很想用Xillinx 的芯片 只是现在暂时用着Alteral 的低端的。 我现在在学ISE

使用特权

评论回复
15
cuianbin|  楼主 | 2012-12-24 16:44 | 只看该作者
hawksabre 发表于 2012-12-23 09:39
在网上找到了一些技术文档   希望对你有帮助

谢谢! 只是我的困难正在于  除完后 还如何接着去做下一部的运算。  不单单是做个除法。

使用特权

评论回复
16
lwq030736| | 2012-12-24 17:21 | 只看该作者
精度要求不高就四舍五入取整数运算吧,将余数与除数的一半比较,如果小于除数的一半就直接舍去
如果大于那商就加1
如果精度要求高就将被除数左移几位进行除法,其实就是扩展小数位,比如10/3=3.3333,求出来的商是3
将10左移8位变为2560除以3,得出的商是853,二进制表示是1101010101,因为之前左移了8位所以实际值就是11.01010101
那在与C加的时候将C也左移8位,比如原来是4,左移后变成100.00000000再将两个数相加就行了结果为111.01010101。具体你处理时需要多少位就根据你的需要来决定了
小数点只是为了表述方便加上的,实际上硬件上并没有那个点,就是1101010101

使用特权

评论回复
17
cuianbin|  楼主 | 2012-12-24 19:34 | 只看该作者
lwq030736 发表于 2012-12-24 17:21
精度要求不高就四舍五入取整数运算吧,将余数与除数的一半比较,如果小于除数的一半就直接舍去
如果大于那 ...

谢谢!很受启发。突然想起教DSP的那个老师经常说的一句话:小数点在程序员心中。谢谢啦 您讲得很详细!我明白啦!

使用特权

评论回复
18
GoldSunMonkey| | 2012-12-24 21:57 | 只看该作者
:)

使用特权

评论回复
19
51xlf| | 2012-12-24 23:19 | 只看该作者
感谢hawksabre 资料这么多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

86

主题

439

帖子

5

粉丝