DSP硬件实现的优化(八)— saturation, rounding的原理和实现

2019-07-29 16:08发布

          在数字信号处理系统中,大部分情况下数据都是用定点表示。但是由于DSP经常使用到乘法器,那么两个定点数相乘后的数的位宽将是两个操作数位宽之和。比如说A*B,A的位宽是(1,7,4),B的位宽是(1,9,5),相乘后的结果将会变成(1,16,9),相乘结果的数据位宽此时竟然达到了16比特。

              如果此结果以后还要再做乘法运算,那么位宽将会越扩越大。乘法器所占的资源基本上在数字信号处理系统中的比重很大,乘法器的位宽越大,部分积也越多,加法树的层级也越来越多,直接影响了系统的Fmax(时序)和资源。因此在实际的定点化仿真阶段时,算法设计会综合考虑系统性能(因为对数据进行截位会影响系统性能和精度)和实现资源,对某些时候的乘法结果作rounding(四舍五入)或者saturation(饱和)处理。

            那么rounding是如何操作的呢?比如说有一个数,经过乘法后得到的结果表示方式为(1,16,12),也就是说前面的第0到第11比特是小数位,第12到14比特是整数位,第15比特是符号位。如果想把该数rounding到(1,10,7),也就是只用10个比特表示,第0到第6个比特是小数位,第7到第8比特是整数位,第9比特是最高位。此时的rounding规则是怎样的呢?以上面为例,假设A = 1010'1011'1111'1111,那么此时截位时,把第0到第4比特截取掉,第4比特为1,那么截取的时候要进行进位,即B = 101'0101'1111 + 1'b1。此时有个问题需要注意,由于截位后是要做4舍五入,需要进位,那么实际上B的位宽是需要扩一位的。由于A是有符号数,所以在截位四舍五入时需要按符号位扩展,即原来的符号位是什么该比特就扩展成什么。以上面的例子B = 1101'0110'0000。这时候B的位宽是12比特,但是我们的目标是把数rounding到10比特。
           
         那么下一步该如何操作呢?事实上我们的小数位已经是7比特,无法做截取,此时应该对整数位做saturation(饱和)操作:即大于所能表达的最大数就令其为最大数,小于所能表达的最小数就令其为最小数。还是以B为例子,由于我们的目标是把B变成(1,10,7),而此时B是(1,12,7),整数位多出了两比特,所以要对整数位进行截取。如果此时B(1,12,7)的超过1'1111'1111或者是小于100'000'0000,那么统统表示为01'1111'1111或者是100'000'0000。此即为饱和操作。

           做饱和操作时有个小技巧,即对B(1,12,7)扩展后的符号位跟第11位,第10位(即rounding目标数的符号位)做比对,如果都是同样的值,即都为0或都为1,那么就直接把第11和第12位截取即可,因为此时四舍五入没有发生进位,如果不相同,则表示发生了进位,那么此时就要按照最高位是0还是1选择把rounding后的目标数变为01'1111'1111或者是100'000'0000。在上面那个例子中,第12位到10位的值不一样,因此可以知道10位数肯定不能表达该数,所以只能选择饱和,饱和后的数值为10'0000'0000。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。