软件算法在进行映射时需要通过等效转换、近似计算等硬件计算技术来转换成硬件易于实现的方式。【补充上周所学】
-
算法转换
[目的]1.把除法转换为乘法运算;2.把乘法运算转换为移位和加法实现。
[方式]1.把与定常数的乘法或除法转化成乘以“2的倍数”或除以“2的倍数”,以在硬件中通过移位和加法实现替代。
eg.dout = din × 255 可转换为dout = din × (256-1),即
dout = din<<8 - din
2.若相乘除的定常数为小数,则转换为整形处理。根据精度与资源确定最后的位宽。
eg.dout = din/25 可转换为dout = 2^10 × din/(25 × 2^10) = din × 40.96 × 2^-10 ,即din×(2^5 +2^3 + 2^-1 +2^-2 +2^-3 +2^-4 )×2^-10
3.根号和除法转换为乘方和相乘。 -
近似计算
[目的]用有限数代替无限数。
[方式]1.截断:舍去部分小于保留部分最后一位的一个单位的1/2;2.泰勒展开,若误差要求不大于10^-4,则取前5阶即可达到要求。3.浮点转换
eg.1/3 = 1/4 × 1/(1-1/4) = 【1/(1-x)在x=1/4处展开?待补充】 -
增量更新
对于较大尺寸的计算,只需更新需要改变的地方,不需要更新没有改变或者已经更新过的地方。用于流水线处理,及二维卷积处理中。 -
查找表
查找函数可以通过MATLAB或者VC等软件工具生成。对于Altera的器件来说,可以生成mif或hex格式的文件,对于Xilinx的器件,可以生成.coe格式的文件。eg.https://blog.csdn.net/weixin_42570769/article/details/116225912
以及
https://blog.csdn.net/qq_42998564/article/details/120337719?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-120337719-blog-116225912.235%5Ev43%5Epc_blog_bottom_relevance_base8&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-120337719-blog-116225912.235%5Ev43%5Epc_blog_bottom_relevance_base8&utm_relevant_index=1 -
浮点计算
二进制浮点数是一种用于表示实数的方式,其中包括一个整数部分和一个小数部分,通常以二进制形式表示。
【表示形式】一般的二进制浮点数表示形式包括:
带符号位的浮点数表示:其中第一个位表示符号,0 表示正数,1 表示负数,其余位表示实数的二进制表示。
IEEE 754 标准的浮点数表示:该标准定义了单精度(32 位)和双精度(64 位)浮点数的表示方法,包括符号位、指数位和尾数位。(延伸单精度和延伸双精度在此不做介绍。)
eg.假设我们要表示十进制数 -5.75,首先将整数部分和小数部分转换为二进制形式:
整数部分 -5 转换为二进制为 101。
小数部分 0.75 转换为二进制为 0.11。
将整数部分和小数部分合并,得到二进制数 -5.75 的表示为 101.11。
如果是使用 IEEE 754 标准的单精度浮点数表示,其结构为:
第1位表示符号位(0 表示正数,1 表示负数)。
接下来的 8 位表示指数。
最后的 23 位表示尾数。
在这种情况下,-5.75 的单精度浮点数表示为:
符号位:1 (表示负数)
指数位:偏置为 127,指数为 2,因此指数位为 2 + 127 = 129,对应二进制表示为 10000001。(偏置值为2的e-1次方减1,e为指数为的宽度,单精度浮点数的指数位宽度位8,则偏置为127)
尾数位:舍去整数部分的 1,剩下的为 01100000 00000000000000。
因此,-5.75 的单精度浮点数表示为 11000000101100000000000000000000。
将 -5.75 转换为 IEEE 754 标准的双精度浮点数,其结构为:
第 1 位表示符号位(0 表示正数,1 表示负数)。
接下来的 11 位表示指数部分。
最后的 52 位表示尾数部分。
对于 -5.75,规格化表示为 -1.0111 x 2^2。
指数部分:偏置值是 1023,规格化后的指数部分的二进制表示的长度是 3,因此指数部分为 1023 + 3 - 1 = 1025。(偏置值为2的e-1次方减1,e为指数为的宽度,单精度浮点数的指数位宽度位11,则偏置为1023)
将尾数部分转换为 52 位二进制数。在本例中,尾数部分为 0111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000。
因此,-5.75 的双精度浮点数表示为:
合并起来,双精度浮点数表示为:
1 10000000001 0111000000000000000000000000000000000000000000000000
【计算】[乘除]浮点数乘法的基本原理是将两个浮点数的尾数相乘,然后将指数相加(若位数结果大于2,则将其右移1位并且增加指数),并根据乘积的符号位确定结果的符号。浮点数除法的基本原理是将两个浮点数的尾数相除,然后将指数相减(规范化过程中可能包含左移),并根据乘积的符号位确定结果的符号。
[加减]
实现两个浮点数(32bit)的加/减法在FPGA上涉及以下步骤:
解析输入浮点数:将输入的浮点数按照IEEE 754标准解析成符号位、指数部分和尾数部分。
对齐指数:通过调整两个浮点数的尾数和指数,使它们的指数相等。这可以通过移位尾数来实现,将指数较小的尾数向右移动直到两个浮点数的指数相等。
尾数相加/减:将对齐后的尾数进行加法/减法运算。
处理溢出和舍入:检查结果是否溢出,并进行必要的舍入操作,左移或右移。
规范化尾数:根据加法结果的尾数进行规范化处理,以保持尾数的有效位数不变。
组合结果:将处理后的符号位、指数部分和尾数部分组合成最终的浮点数结果。
我们需要对指数位进行规范化,使得两个浮点数的指数相同。然后,将两个浮点数的尾数进行相减,并根据指数位的差异进行尾数的左移或右移,最后,根据符号位确定结果的符号。
此外,FPGA厂家也提供了IP核用于浮点计算。eg.https://blog.csdn.net/sinat_25326461/article/details/72123443
7. cordic技术
cordic是用于计算初等函数的一种迭代方法。基本原理是基于向量旋转,通过简单的移位和加减运算来逼近复杂的三角函数运算。