原创 底层硬件如何实现浮点运算

2009-9-10 18:41 4481 9 12 分类: FPGA/CPLD

底层硬件如何实现浮点运算


首先,我们需要明确一个概念:FPGA所能表示的信号电平只有01。如表1所示,如果给出一组16位二进制数据,一般人肯定会很自然的认为它代表的是一组相应的10进制整数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


1



16位二进制数据


10进制数据


16’b0000_0000_0000_0001


16’d1


16’b0000_0001_0000_0001


16’d257


16’b0100_0001_0000_1001


16’d16649


16’b1111_1111_1111_1111


16’65535


在不涉及浮点数之前(我们暂不讨论符号问题),的确就这么简单。但是现在我们换个角度来看看同样的一组16位二进制数所代表的浮点数值。


    首先,我们要讨论定标的问题。如果定义了16位二进制数中的后8位代表小数,高8位依然代表整数,那么这个小数的最小单位是1/2560.0039065),代表了这个浮点数的精度。同样的,表2列出了16位二进制数不同定标值的对应精度。


2



定标(小数位数)


精度值


4


1/160.0625


8


1/2560.0039065


12


1/40960.000244140625


16


1/655360.0000152587890625


    如表3所示,列出了定标为816位二进制数组所代表的浮点数。感兴趣的朋友也可以自己算一遍,加深理解。


3



16位二进制数据


浮点数


16’b0000_0000_0000_0001


0.0039065


16’b0000_0001_0000_0001


1.0039065


16’b0100_0001_0000_1001


1023. 0351565


16’b1111_1111_1111_1111


2559960935


    下面我们就要实现一组很有意思的运算:


R = 1.164(Y-16) + 1.596(Cr-128)


G = 1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128)


B = 1.164(Y-16) + 2.018(Cb-128)


这是图像处理中YCbCr转换为RGB的公式。我们不讨论它的具体涵义,我们只研究如何实现这样一组运算。RGBYCrCb这些变量都是8位无符号二进制整数,取值可以为0-255的任意值。


对上述公式中的出现的小数我们用一个12位数表示,我们注意到这些浮点数的整数部分最大值为2,那么我们只使用2位二进制数(可以表示0-3的整数,满足应用要求)来表示整数部分即可。用剩下的10位二进制数来表示小数部分。我们的思路是:先对这些浮点数左移10位(放大1024倍),然后代入公式运算,运算完成后对得到的RGB数据值右移10位(缩小1024倍)。


R*1024 = 1192*(Y-16) + 1634*(Cr-128)


= 1192*Y + 1634*Cr – 228224


= RR


G*1024 = 1192* (Y-16) – 400*(Cb-128) – 832*(Cr-128)


        = 1192*Y – 400*Cb – 832*Cr + 138624


        = GR


B*1024 = 1192* (Y-16) + 2066*(Cb-128)


            = 1192*Y + 2066*Cb – 283520


            = BR


    这个运算也不是就此就结束了,由于在对浮点数的放大缩小过程中难免出现四舍五入的状况,因此也就带进了一定的误差。这个误差也许无关痛痒,但是在RGB计算的两个极端值(0或者255)附近就有可能出现类似溢出的问题。


    所以,上一步运算完成得到的RRGRBR值需要做一些判断处理后再输出。YCrCb位宽是8,浮点参数的位宽是12,那么RRGRBR值的位宽就取20(对于这个特定的公式,该位宽是绰绰有余的)。RRGRBR值右移10位后得到的RGB值是10位,而实际上使用低8位就足以表示实际值。但是此时有可能出现一些超出8位值的数据,这些数据就是放缩误差带来的牺牲品,我们对它的判断准则是:主要是针对RGB数值的最高2位取值,如果是00,则说明该值处于正常范围,直接输出低8位数据;如果是01,那么该值一定是正向溢出了,取低8位数据为255输出;如果是11,那么该值一定是负向溢出了,取低8位数据为0输出;该实例放缩1024倍,精度比较好,理论上不会出现最高两位是10的情况。


    关于更多应用可以参考xilinxIPcore中的一些运算相关的datasheet,《cordic.pdf》就是一份不错的资料。


 


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1587732 2015-3-5 15:00

good, thanks. it is help in my project

用户122143 2015-1-25 13:53

谢谢

用户1002534 2014-2-15 19:47

谢谢 楼主的分享

用户444450 2013-8-4 02:56

特权同学,深入浅出玩转fpga是不是第二版出来了? 博客藏经阁?

用户492577 2013-7-3 15:11

很不错的学习资料

用户136726 2009-12-8 10:50

学习,很好的文章

用户182915 2009-9-20 10:08

学习

ash_riple_768180695 2009-9-10 21:55

好文章!
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
EE直播间
更多
我要评论
3
9
关闭 站长推荐上一条 /3 下一条