FPGA中定点、浮点、量化
1.原码、反码、补码表示:
FPGA支持定点运算和浮点运算,但是浮点运算更复杂:
定点包括原码、反码、补码表示:
原码:1_110表示-0.75 0_110表示0.75
补码:通常,有符号数指二进制数用补码表示
正数原码补码反码都一样,
对于负数,原码、反码、补码均不同
如-1,如果用四比特有符号数表示,
则原码:1001,反码:1110,补码:1111。
即原码补码转化原理:补码等于反码+1
当然,负数的补码也可以这样计算:若原来的负数是a,则转化为补码是2^N+a,所以-1的补码就是15.
2.定点、浮点区别及易误点
11 浮点:小数点“浮动”:不固定。IEEE754-1985标准定义了32位浮点数(单精度)、64位(双精度)
易误点:浮点数并不仅仅是“float”"double"小数,也可以表示整数,IEEE表示范围为 1.1810e38~~3410e38.
22定点:小数点“固定”。
易误点:定点数不仅仅是“int”(小数点在最后)这样的整数,也可表示小数、负数,需程序设计者自己指定各位表示的含义。
易误点:所谓的浮点和定点是程序设计者逻辑层面的理解,计算机cpu的读取只是0、1这样的比特流。
33为什么要把浮点转化为定点???
答:浮点数占用存储空间大、而且读取效率不高,计算复杂。
因此转化为定点数,定点数计算简单、占用空间小
但是转化为定点数损失了精度,浮点数可以表示更大范围、更高精度的实数
3.浮点转定点(量化)
11怎么把浮点转定点???
答:如浮点数-0.5001,要转化为定点小数(1位符号位、1位整数位、6位小数位)
只需要-0.5001*2^6(量化系数)~=-32,
补码表示:256-32=224(11100000)这个过程也叫量化
22 matlab量化
x = [1.0000 0.8660 0.5001 -0.4997 -0.8658];
x_fix = quantizer(‘fixed’,‘round’,‘saturate’,[8,6]);%'fixed’表示有符号定点,'round’表示四舍五入取整
c=num2bin(x_fix ,x)%将定点数转化为有符号二进制,负数用补码表示
c =
5×8 char 数组
'01000000'
'00110111'
'00100000'
'11100000'
'11001001'
fix_x = quantize(qpath,x)
fix_x =
1 至 4 列
1.0000 0.8594 0.5000 -0.5000
5 列
-0.8594
c=num2int(qpath ,x)
c =
64 55 32 -32 -55
c=num2hex(qpath ,x)
c =
5×2 char 数组
'40'
'37'
'20'
'e0'
'c9'