FPGA中浮点数的定点化笔记

本文详细介绍了FPGA中浮点数转定点数的过程,包括基础概念、定点化步骤、量化误差计算及面试例题解析。适用于对FPGA编程感兴趣或从事相关工作的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FPGA中浮点数的定点化笔记
关于基本相关知识参考该博客
本文只针对FPGA中相关类型题目的做法思考整理,方便查看和复习,以后有时间再深入研究。
浮点数的定点化 FPGA

1.基础概念
浮点数:
简单来说,就是小数点的位置不是固定的
定点数:
简单来说,小数点的位置是固定的,也就是整数位宽与小数的位宽是固定的
以下部分内容摘自该博文
因为在普通的fpga芯片里面,寄存器只可以表示无符号型,不可以表示小数,所以在计算比较精确的数值时,就需要做一些处理,不过在altera在Arria 10
中增加了硬核浮点DSP模块,这样更加适合硬件加速和做一些比较精确的计算。
  浮点数和定点数的区别:定点数的小数点是固定的,而浮点数的小数点的位置不确定,举个例子,定点数 1.11.1 = 1.2(定点一位小数),浮点数1.11.1=1.21,浮点数的小数点发生了移动,而定点数舍弃了一位,小数点的位置没有变。
  在verilog里面,如果用用16位二进制表达定点小数,最高位就是符号位。我们把小数点之后的N位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数
而Q0就是我们所说的整数。
  Q12的最大正数是0111.1111_1111_1111,第一个0是符号位,后面的数都是1,那么这个数的十进制就是0x7fff/212=7.99999…,为啥是除212呢,因为是
十二位小数,0.1111_1111_1111接近与整数1,这样看有多少个1.
反过来,一个实际的数转换成Qn型的定点小数就是就是乘上2^n

2.定点化过程
部分内容来自该博文
定点化的过程:

第一步:
确定好整数与小数的位宽,例如,整数3位,小数12位,符号位1位
第二步:
确定定点数最大值与最小值,用第一步的例子,最大值为32767,最小值为-32768
(整数位+小数位一起表示的最大最小值)
第三步:
将浮点数定点化,例如将3.1415926转化为定点数
3.1415926/(8/(32768))=12867.9632896≈12867
12867就可以用于FPGA处理的定点数
注:
**1).其中8为3位整数,12位小数能表示最大的实际值。
即3位整数最大表示7,加上12位小数为最大值接近1,所以最大值整数+小数为8。
2) 32768为2的15(3+12位)次方,8/32768为精度,即将8分成32768份,令△=8/32768
3) 3.1415926/(8/(32768))即为3.1415926有多少个△
4)浮点数定点化有一定的误差**

其中在此增加量化误差的计算内容:根据以上3.1415926转化为定点数为12867,那么误差有多少呢?
12867二进制表示为0011_0010_0100_0011(一共16位),其中整数部分011表示为3,小数部分0010_0100_0011为580,
十进制580转换为小数为580/4096=0.1416015625
量化误差:0.1415926-0.1416015625=0.0000089625

3.例子
以下内容摘自该博客,对其中一些小瑕疵改正了
例:16位的定点数(MAX:16’d32767 MIN:-32768)
3位整数位宽,12位的小数位,最高位的符号位
取低15位,其中第14,13,12位最大能表示7,
小数最大12位能表示的最大精度:1/4096=0.000244140625
(0.000244140625*4095 = 0.999755859375)
极限最大值表示:7.999755859375

说明:
判断能否用12位精度表示(即:无损失定点化),看能否除尽:
比如:12.918
3位整数位宽最大只能表示7 所以整数12需要4位位宽
小数部分0.918 判断:0.918/0.000244140625 = 3760.128 所以12位小数位能表示0.918

例:2.918进行定点化的过程:
8/32768 = 0.000244140625(最大精度)
2.918/0.000244140625 = 11952.128 ~=11952 表示2.918定点后的值

浮点数的乘法表示(注意相乘后位宽变化):
例:2.9183.1415926 ~= 1195212868
浮点结果 : 2.9183.1415926 = 9.1671672068
定点结果 : 11952
12868 = 153798336 ~= 9.167095184326171875
‭‬
153798336 = 0000 1001 0010 1010 1100 0110 1100 0000‬
整数部分表示: 001001 = 9
小数部分表示: ‭2803392‬/(2^24) = 0.167095184326171875‬

例:正数的定点化
5bit的正数位,8bit的小数位
11.11111定点数的结果

4.面试例题
在这里插入图片描述
以下解析为该博客解释
在FPGA中做小数乘法时,一般需要对定点小数量化处理。
量化过程中首先需要确定量化的位宽,位宽越大量化的精度越高。比如10bit量化,表示的最大值为2^10-1 = 1023。如题所述,对12.918做无损定点化,首先需要确定对整数部分的量化位数。
整数为12,无损量化必须采用4bit;小数部分为0.918,假如采用12bit位宽,整数部分4bit,那么小数部分只有8bit。8bit所能表达的最大的整数为255(注意,定点小数在FPGA运算过程中是没有小数点的,比如12.918,实际存储的是12918的二进制形式,所以8bit表示小数部分最大为255,在后续反量化时再除以256,相当于小数点右移8位即可)。0.918256 = 235.008,换算为整数为235,该值即为对0.918做8bit量化后的整数值。
下面需要对235进行反量化得到:235 / 256 = 0.91796875,和0.918相比误差为0.00003125。因为做的是无损定点化,所以考虑的应该是有效位,0.918的有效位为3位,而误差在小数点后面第三位为0,所以可以实现无损定点化。
再看位宽选择11位时,小数部分用7位表示,按照上面所述方法得到:
(int)(0.918128)/128 = 0.921875,量化误差为0.003875,可见在小数点后面第三位不为0,因此就不能实现无损量化,误差为0.0039

但是我没看明白,根据前面介绍的内容自己推导如下:
首先整数部分为12,整数位宽4bit,按题中所示若位宽为12bit,则小数部分位宽8bit,最大精度1/256=0.00390625;
0.918/0.00390625=235.008可以表示。
如果位宽11bit,则小数部分为7bit,最大精度为16/2048=0.0078125,12.918/0.0078125=1653.504~=1653,
1653二进制为1100_1110101,小数部分1110101为117,117/128=0.9140625
则误差为0.918-0.9140625=0.0039375,此时再根据上面解析说因为做的是无损定点化,所以考虑的应该是有效位,0.918的有效位为3位,而误差在小数点后面第三位为0,所以可以实现无损定点化。

暂时到这里,自己对这一方面理解的还是不够深,如有错误,请指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值