当前位置:   article > 正文

FPGA浮点转定点运算、除法转乘法运算以及运算误差分析

为什么fpga除出来的值是不对的

点击蓝字关注我们

  1. 关注、星标公众号,精彩内容每日送达
  2. 来源:网络素材

FPGA浮点转定点运算、除法转乘法运算以及运算误差分析

FPGA在常规运算时不能进行浮点运算,只能进行定点整型运算,在处理数据的小数乘加运算和除法运算时FPGA一般是无能为力的,其中一种常用的处理方法就是数据进行浮点到定点的转换。

浮点数转化为定点数一般有两种方法:

浮点数直接乘以一个数值。浮点小数(X)到定点数据(Xq)的转换其实很简单,就是把浮点小数乘以一个很大的2的n次幂的数据Xq=X*2^n,来把小数转化为整数,然后再进行数据的乘加运算,运算结果通过移位来得到实际对应的理论数据结果。

直接把浮点数转化为有符号的二进制小数用SxQn来表示,然后进行乘加运算,运算结果通过移位来得到实际对应的理论数据结果。

通过上述两种方法运算能完成浮点到定点乘加运算的结果,但是上述两种方法存在一定的问题:

存在浮点小数(X)进行整数转化定点数据(Xq)后依然还是一个小数的情况。

浮点数转化为二进制数存在数据位宽激增情况,使得SxQn的数据位宽变大。

数据运算存在一定的截位误差,这部分误差只能减小而不能消除。

浮点到定点数据转化后数据位宽变大,占用逻辑资源增加。

在实际使用时由于直接把浮点数转化为有符号的二进制小数用SxQn来表示这种方法局限性较多,近而大都采用浮点数直接乘以一个数值这种方式,但是这种方式使用时需要注意截位误差和量化误差。

第一种浮点数直接乘以一个数值方法具体过程如下:

浮点数(x)转换为定点数(xq):xq=(int)x2^Q

定点数(xq)转换浮点数(x):x= (float)xq2^(-Q)

比如,16进制数2000H,用Q0表示就是8192;若用Q15表示,则为0.25。下面介绍Q格式运算中Q值的确定:

(1)定点加减法:需要转换成相同Q格式才能加减

(2)定点乘法:不同Q格式的数据相乘,相当于Q值相加

(3)定点除法:不同Q格式的数据相除,相当于Q值相减

(4)定点左移:相当于Q值增加

(5)定点右移:相当于Q值减少

比如,Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,乘完之后Q值变为15+15=30,即结果为0.01B,即为浮点数0.25。

对应浮点数的除法运算时是把除法转换成乘法运算来实现。即分子/分母(A/B)转化为A*(1/B),这时会面临B是固定值和变值两种情况

1、如果B是固定值利用这种方式即可把(1/B)转化为定点数,然后进行乘法运算,这样计算速率较块,且通过合理的选择放大倍数来减小数据的误差。

2、如果对应B不是固定值,那么就将B变为对应位宽的整数,然后再进行数据的乘法运算。

数据的误差来源于浮点转化为定点时截位和运算结果截位引起的,这里可以通过常用的截位方式来实现截位。

常见的截位方式有:

1、负数直接截位后+1,就是所有数都按绝对值取floor

2、Truncate:直接截位,就是正数取floor,负数按绝对值取ceil

3、Rounding:舍入截位,就是所有数按绝对值取四舍五入

5014bdab207a7f359b16350e7c99d4e6.jpeg

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号