MCU

Blackfin处理器的浮点运算功能学习

0
阅读(4193)

    以前没开始学习DSP之前,认为DSP就是非常高级的高速运算器,能够实现各种各样的浮点运算,但有了Blackfin的开发板后,却只顾学习类似于单片机外设的DSP外设,像GPIO、UART、SPI、定时器等等。于是今天决定学习一下Blackfin处理器的浮点运算。

    一般来说,DSP处理器可以分为两大类:定点和浮点。先进的定点DSP家族速度快,功耗低,价格也便宜;而浮点DSP则计算精确,动态范围大。于是我又查找了一下,Blackfin处理器架构是专为定点计算设计的,但由于于它能产生足够高的时钟频率,从而能够在软件上模拟浮点运算。在Blackfin 处理器平台上,IEEE-754 浮点功能都可以通过库调用在C/C++和汇编语言中实现。这些库采用定点逻辑模拟了浮点处理过程。为了降低运算复杂度,使用更松散更快的浮点格式更有利。用这种方法常能显著地节省时钟周期。

    在定点数字表示法中,小数点总是在同一位置。虽然这可以简化数字运算,节省内存,同时也对量级和精度带来了局限。面对要求更大数字范围或更高分辨率的情况,就需要位置可变的小数点。

    Blackfin DSP的寄存器堆包(file)含有16个16-bit寄存器,也可以把它当作8个32-bit寄存器来使用。有两个计算单元,数据寄存器堆可以存放32-bit数据。整套的算术计算和逻辑运算指令集都支持仿真浮点计算,非IEEE格式;也支持可以显著简化计算要求的多重精度的定点表示方法。为了能够充分利用DSP的寄存器堆包资源,仿真浮点计算程序可以使用双字格式,即用一个16-bit字表示指数,另一个16-bit字表示尾数。两个字都使用带符号位的2的补码表示法。 
 DSP的体系结构,除了可以将16-bit与32-bit寄存器结合使用以外,还包括有可以简化浮点运算算法的特殊指令:SIGNBITS指令,是将数的符号位返还给该数值。实际是直接传给ASHIFT,而ASHIFT则可以移动小数点的位置,将尾数格式化。

    可以将一个定点数变化为一个浮点数。变化的方法是:首先通过确定符号位数,再将小数点按照符号位数移动,然后再将尾数格式化。反之,一个浮点数也可以通过移动尾数的小数点位置,来变换成为定点数。小数点移动的位数就是符号位的位数。

    可以采用下述方法,实现浮点数的加法: 以两个数中具有较大指数的指数作为和数的指数;向右移动比较小的数的尾数,移动的位数等于两个数的指数的差;将尾数相加,得到和数的分数部分;将和数格式化。 

    两个用浮点格式表示的数,进行乘法运算时,比进行加法运算更简单。因为不需要将两个数的小数点位对齐。乘法的运算算法如下所述:将两个数的指数相加;将两个数的尾数相乘,即为乘积数的分数部分;将乘积数格式化。 

    浮点的乘/累加过程则是先依次求两个操作数的积,累计求N次,再计算其总和。可以首先重复调用浮点乘法程序,再调用加法程序。但是如果使用乘/累加程序函数,则由于省去了内务开销而更有效率。乘/累加算法可以按以下的方式实现:先求第一组两个操作数的乘积,并对此积进行规格化;取第二组操作数,求乘积,再对其进行规格化;将求得的积,和累加的和进行比较,对其中的积,或累加的和进行移位,使小数点对齐;将这个乘积,和累加的和相加,并对求得的结果进行规格化;重复进行第2到第4过程,一直到将全部操作数都进行完毕为止。 

    现在的定点DSP处理器由于性能的提高,已经可以在某些应用场合进行仿真的浮点运算,从而达到系统的要求,而不必采用浮点DSP处理器了,所以Blackfin处理器也是可以很好地实现浮点运算的功能的。