一文了解FPGA浮点小数与定点小数的换算及应用

电子说

1.3w人已加入

描述

定点小数运算

有些FPGA中是不能直接对浮点数进行操作的,只能采用定点数进行数值运算。

所谓定点小数就是把小数点的位置固定,我们要用整数来表示小数。

先以10进制为例。如果我们能够计算12+34=46的话,当然也就能够计算1.2+3.4 或者 0.12+0.34了。所以定点小数的加减法和整数的相同,并且和小数点的位置无关。乘法就不同了。 12*34=408,而1.2*3.4=4.08。这里1.2的小数点在第1位之前,而4.08的小数点在第2位之前,小数点发生了移动。所以在做乘法的时候,需要对小数点的位置进行调整?!可是既然我们是做定点小数运算,那就说小数点的位置不能动!!怎么解决这个矛盾呢,那就是舍弃最低位。

  也就说1.2*3.4=4.1,这样我们就得到正确的定点运算的结果了。所以在做定点小数运算的时候不仅需要牢记小数点的位置,还需要记住表达定点小数的有效位数。上面这个例子中,有效位数为2,小数点之后有一位。

  现在进入二进制。我们的定点小数用16位二进制表达,最高位是符号位,那么有效位就是15位。小数点之后可以有0 - 15位。我们把小数点之后有n位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数,而Q0就是我们所说的整数。

  Q12的正数的最大值是 0 111 。 111111111111,第一个0是符号位,后面的数都是1,那么这个数是十进制的多少呢,很好运算,就是 0x7fff / 2^12 = 7.999755859375。对于Qn格式的定点小数的表达的数值就它的整数值除以2^n。在计算机中还是以整数来运算,我们把它想象成实际所表达的值的时候,进行这个运算。

  反过来把一个实际所要表达的值x转换Qn型的定点小数的时候,就是x*2^n了。例如 0.2的Q12型定点小数为:0.2*2^12 = 819.2,由于这个数要用整数储存, 所以是819 即 0x0333。因为舍弃了小数部分,所以0x0333不是精确的0.2,实际上它是819/2^12 =0.199951171875。

  我们用数学表达式做一下总结:

  x表示实际的数(*一个浮点数), q表示它的Qn型定点小数(一个整数)。

  q = (int) (x * 2^n)

  x = (float)q/2^n

  验证:

  由于/ 2^n和* 2^n可以简单的用移位来计算,所以定点小数的运算比浮点小数要快得多。下面我们用一个例子来验证一下上面的公式:

  用Q12来计算2.1 * 2.2,先把2.1 2.2转换为Q12定点小数:

  2.1 * 2^12 = 8601.6 = 8602

  2.2 * 2^12 = 9011.2 = 9011

  (8602 * 9011) 》》 12 = 18923

  18923的实际值是18923/2^12 = 4.619873046875 和实际的结果 4.62相差0.000126953125,对于一般的计算已经足够精确了。

  小数的定标精度、范围

  采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。

  对于FPGA而言,FPGA对小数是无能为力的,一种解决方法是采用定标,就是将运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算结束后再缩小相应的倍数。

  通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。

  同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如:

  16进制数2000H=8192,用Q0表示

  16进制数2000H=0.25,用Q15表示

  不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。

  例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

  浮点数与定点数的转换关系可表示为:

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

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

  例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。

  Q和S表示方法,如下表所示。

  Q表示 S表示 十进制表示范围

  Q15 S0.15 -1≤x≤0.9999695

  Q14 S1.14 -2≤x≤1.9999390

  Q13 S2.13 -4≤x≤3.9998779

  Q12 S3.12 -8≤x≤7.9997559

  Q11 S4.11 -16≤x≤15.9995117

  Q10 S5.10 -32≤x≤31.9990234

  Q9 S6.9 -64≤x≤63.9980469

  Q8 S7.8 -128≤x≤127.9960938

  Q7 S8.7 -256≤x≤255.9921875

  Q6 S9.6 -512≤x≤511.9804375

  Q5 S10.5 -1024≤x≤1023.96875

  Q4 S11.4 -2048≤x≤2047.9375

  Q3 S12.3 -4096≤x≤4095.875

  Q2 S13.2 -8192≤x≤8191.75

  Q1 S14.1 -16384≤x≤16383.5

  Q0 S15.0 -32768≤x≤32767

  一般在FPGA中处理小数定点数,需要自己去定点,比如用16位,就可以分成8位整数和8位小数,即(8,8),即“定点”在第8位。那么:

  1 -》 16‘h0100

  1.5 -》 16’h0180

  -1.5 -》 -1.5*256 + 65536(补码) -》 16‘hFE80

  1.164 -》 1.164*256 = 298 = 16’h012A

  

  如果两个小数相乘,即表示定点数相乘,比如,Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,那么乘完之后的Q值为15+15=30.即浮点数表示0.25.

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分