- FPGA只能处理定点小数,用于需要高精度快速运算的地方。
主要分为三步:
- 一. 根据计算数值范围/精度设计数据结构,包括位数/有无符号/整数小数分别用多少位来表示
- 二. 计算精度,量化误差,看看能否满足需求
- 三. 进行量化转换,调用IP核或者设计移位计算模块
举例
-
例一 2.918 * 3.1415926
转成定点数需要定义,小数和整数的位数。
(1)3位整数,12位的小数,最高位为符号位。共计16位的定点数。
(2)最大值16’d32767(2^15-1),最小值-32767(- (2^15-1)).
取低15位,其中14,13,12这三位最大能表示7;剩下的位数可以把1分成2^12份,最大精度为1/4096(LSB);
最大值为8-LSB~=8
(3)量化转换
2.918进行定点的过程为2.918/(8/32768)=11952.128~=11952,舍去的部分是量化误差.
3.1415926 :3.1415926/(8/32768)=12867.963~=12868
量化后的值为3.1416015625-3.1415926=0.0000089625//量化后的11952/12868可以在fpga中进行处理。乘法结果的整数位是6位,小数位是24位,再加一个符号位总共是31位。
2.918 * 3.1415926(9.1671672068)~=11952*12868(153,798,336)=10_111010110000B * 11_001001000100B=1001_001010101100011011000000B
浮点结果:9.1671672068(没有量化误差)
定点结果:153,798,336D=1001_001010101100011011000000B
//_前表示整数,后表示小数。因此定点化后整数部分为9,小数部分为0010 1010 1100 0110 1100 0000B=2803392D =>2803392/(2^24)=0.167095184326171875
定点化误差=0.167095184326171875-0.1671672068=-0.0000720 -
例二 5 * 3.1415926
5定点化过程为5/(8/32768)=20,480D=0101 0000 0000 0000B
5 * 3.1415926(15.707963)=>0101 0000 0000 0000B * 0011 0010 0100 0100
=1111_101101010100000000000000B=>15_11878400=>15+0.7080078125(11878400/(2^24))
//FPGA可以利用IP计算,也可以用移位方式计算,要注意计算结果的表示方式整数位是6位,小数位是24位,再加一个符号位总共是31位
//1111_101101010100000000000000B可以传输到上位机,或者传输到别的模块即可进行后续处理,但是一定要明白数据结构。
//也可以用移位的方式来处理,乘以5就相当于*4+1,可以左移2位后加上自己,注意修正结果的的数据位数以防止溢出的问题。