FPGA设计之浮点数的定点化

  • 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,336‬D=1001_001010101100011011000000B
    //_前表示整数,后表示小数。因此定点化后整数部分为9,小数部分为0010 1010 1100 0110 1100 0000‬B=2803392D =>2803392/(2^24)=0.167095184326171875‬
    定点化误差=0.167095184326171875‬-0.1671672068‬=-0.0000720

  • 例二 5 * 3.1415926
    5定点化过程为5/(8/32768)=20,480‬D=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位后加上自己,注意修正结果的的数据位数以防止溢出的问题。

你可能感兴趣的:(ASIC/FPGA设计基础)