【2024第12周】<基于FPGA的数字图像处理原理及应用>-计算技术

软件算法在进行映射时需要通过等效转换、近似计算等硬件计算技术来转换成硬件易于实现的方式。【补充上周所学】

  1. 算法转换
    [目的]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.根号和除法转换为乘方和相乘。

  2. 近似计算
    [目的]用有限数代替无限数。
    [方式]1.截断:舍去部分小于保留部分最后一位的一个单位的1/2;2.泰勒展开,若误差要求不大于10^-4,则取前5阶即可达到要求。3.浮点转换
    eg.1/3 = 1/4 × 1/(1-1/4) = 【1/(1-x)在x=1/4处展开?待补充】

  3. 增量更新
    对于较大尺寸的计算,只需更新需要改变的地方,不需要更新没有改变或者已经更新过的地方。用于流水线处理,及二维卷积处理中。

  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

  5. 浮点计算
    二进制浮点数是一种用于表示实数的方式,其中包括一个整数部分和一个小数部分,通常以二进制形式表示。
    【表示形式】一般的二进制浮点数表示形式包括:
    带符号位的浮点数表示:其中第一个位表示符号,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是用于计算初等函数的一种迭代方法。基本原理是基于向量旋转,通过简单的移位和加减运算来逼近复杂的三角函数运算。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值