fpga定点数表示数据的理解

1、对任意一个数,都可以表示成二进制的形式。如十进制数11.625,的二进制数为1011△101。

2、定点数是指小数点在数中的位置是固定保持不变的二进制数。定点数通常把数限制在-1~1之间,把小数点规定在符号位和数据位之间。N bit表示正小数ɑ,则小数ɑ的范围是

      

3、定点数的三种表示方式:原码,反码,补码。

(1)原码

Matlab中dec2bin将十进制数转换成二进制数,而得到的二进制数的小数点在最后面,转换成十进制后是整数。为了将绝对值小于1的数也转换成二进制,需乘以2^(N-1),并取四舍五入的操作(归一化是将数据全部限制在-1~1之间;此处操作类似于归一化的逆向)。量化为Nbit,最高位符号位,小数点,N-1个数据位。

 

dec2bin(round(abs(x)*2^(N-1)) + (x<0)*2^(N-1),N);

 

(2)  反码:整数的原码,反码,补码都是同一个。负数的反码为除符号位以为,其余数据位取反。

(3)  补码:负数的补码为反码加1;补码最重要的性质是将减法用加法形式实现。

dec2bin(round(x*2^(N-1)) + (x<0)*2^(N),N);

Eg:0.75 和 -0.75   原码                   补码             N=16

0.75:0110000000000000        0110000000000000

-0.75:1110000000000000        1010000000000000

4、数的定点化方式举例:

比如,将十进制数2.918量化为16位的(3位整数位宽,12位小数位宽,1个符号位)

(1)整数部分有3位,最大为111,表示7;

(2)小数部分12位,表示范围

(3)即,整数+小数最大能表示7+1 =8;而15位二进制数最大能表示32768;所以此种量化方式的精度为t=(7+1)/32768.

(4)2.918定点化为:2.918/t=11952.128≈11952,定点化为有0.128的误差。误差百分比为0.128/11952=1.0710e-05。近似可以忽略不计。

(5)LSB = 1/2^12 =  2.4414e-04

 

同样,将十进制数0.918量化为16位的(0位整数位宽,15位小数位宽,1个符号位)

(1)整数部分有0位,只能表示为0;

(2)小数部分15位,表示范围

(3)即,整数+小数最大能表示0+1=1;而15位二进制数最大能表示32768;所以此种量化方式的精度为t=(0+1)/32768.

(4)0.918定点化为:0.918/t=30081.024≈30081,定点化有0.024的误差,误差百分比为0.024/30081=7.9785e-07;忽略不计

(5)LSB = 1/2^15 =3.0518e-05

 

5、数在定点化时,小数点位置可以随意定。最常用的还是定点化为-1~1之间,即最高位是符号位,小数点,后面全是数据位。在FPGA中,要心中明确小数点的位置。

 

2018年4月1日星期天

 

你可能感兴趣的:(fpga定点数表示数据的理解)