FPGA中浮点数的定点化笔记

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,所以可以实现无损定点化。

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

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园整体解决方案是响应国家教育信息政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能网络管理,促进个性学习和教学资源的高效利用。同时,教学质量评估心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息水平,而且优了教学和管理流程,为学生、教师和家长提供了更加便捷、个性的教育体验。
FPGA ,通常使用定点数进行数值计算,因为定点数可以更高效地实现。如果需要对浮点数进行计算,需要将浮点数转换为定点数。下面是一种简单的方法来将浮点数转换为定点数。 假设我们要将一个浮点数 x 转换为定点数 Q,其 Q 有 n 位整数部分和 m 位小数部分,总共有 n+m 位。则可以按照以下步骤进行转换: 1. 将浮点数 x 乘以 2^(m),得到一个整数 y。 2. 将整数 y 左移 n 位,得到一个 n+m 位的整数 z。 3. 将整数 z 再除以 2^(m),得到定点数 Q。 这个方法的原理是将浮点数的小数部分转换为整数部分,然后将整数部分左移 n 位,再将小数部分除以 2^(m),得到定点数的小数部分。 在 Verilog ,可以使用 shift 和 divide 操作来实现这个方法。以下是一个示例代码: ```verilog module float2fix(input [31:0] x, output reg [15:0] Q); integer y, z; always @* begin y = x * 65536; // 2^16 = 65536 z = y << 16; // shift left by 16 bits Q = z >> 16; // shift right by 16 bits end endmodule ``` 这个例子将浮点数 x 乘以 2^16,然后将整数部分左移 16 位,最后将结果右移 16 位得到定点数 Q。这个例子定点数 Q 有 16 位整数部分和 16 位小数部分。 需要注意的是,这个方法只是一个简单的转换方法,可能会存在精度损失。如果需要更高精度的定点数转换,可以使用更复杂的算法,例如 CORDIC 算法或者牛顿迭代法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值