如果运算的结果中只有其中若干位是后续处理需要的,则需要进行截位或四舍五入处理。如果对精度要求高,就使用四舍五入,否则使用截位。在实际电路设计中,相对于四舍五入,截位更为常见。设计算法电路需要了解各项处理在数学上的本质,对于截位和四舍五入也是如此。
截位的数学本质是向下取整,比如下面的RTL中,信号 a 的低2位被舍弃,并将结果赋给了信号 b 。
上例中, a 和 b 的数学关系如式(2-8)所示,其中, 为对 x 向下取整。例如, a 的值为15,则 b 的值为3。
如果被截位的信号是负数信号,则向下取整的结果是绝对值变大。
比如上例中,信号 a 是有符号信号,可以计算出 a 取值为-15~-12时信号 b 的值为
所以,无论被截位的信号有无符号,截位后的结果一定小于或等于直接使用除法计算得到的浮点值。
在MATLAB使用如下语句表示上例的截取过程,可以得到相同的结果。
在电路中对信号进行四舍五入处理的步骤如下:
第一步:假设要舍弃信号的低 n 位,则只舍弃低 n -1位,保留1位精度。
第二步:将截取的信号加1。
第三步:舍弃第一步保留的小数位。
例如,让6位有符号信号舍弃其低2位,其结果应为4位,且是四舍五入后的结果。实际RTL代码如下例所示。在第二步中,为防止加1可能造成的正数溢出(负数加1不会发生溢出),对信号进行了扩位,但它会导致输出结果比预想的多1位,因而输出前要进行溢出保护,限制输出的位宽。
用上例所示的RTL进行计算,可以得到如下结果。其中,{ x }表示对 x 进行四舍五入, 为对 x 向下取整。
可见,按照上述三步运算,无论信号的值为正或负,均能够得到四舍五入的结果。
用MATLAB计算上例的四舍五入,表达式如下:
上述MATLAB表达式与RTL计算结果有细微差别,区别在a为-14时,MATLAB计算得到的b为-4,而RTL得到的b为-3。从原理上说,-3.5四舍五入后值为-4或-3,误差均为0.5,因此两个答案都正确。但是,正如1.3.2节所介绍的算法验证过程,一般要求算法建模的结果应该与RTL计算结果完全一致。在复杂的系统中不要因为某些细微的不一致,导致整个系统的验证无法通过。为此,这里推荐调整MATLAB算法,并保持RTL算法不变,因为RTL的三步实现比较简单,不适合调整为更复杂、面积更大但效果相同的结构。调整后的MATLAB代码如下:
传统的四舍五入是一种取整的方法,此法可以去除小数位,只保留整数。本节所讲的四舍五入需要对原始的概念进行一定的扩展。如果一个信号包含8位小数精度,但结果只要求它保留2位精度,那么四舍五入的意义就是使得保留的2位小数精度能够体现出3位小数精度的效果,所得数值与原数的差异小于2 -3 。读者须认识到,即使是四舍五入之后,信号也没有变为整数,它仍然保留了2位小数。