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位后加上自己,注意修正结果的的数据位数以防止溢出的问题。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arist9612

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值