本资源介绍了一种高效的定点补码一位乘法器设计方案,适用于高性能计算和低功耗需求的应用场景。包含详细的设计原理与实现方法。
在进行[X]补×[Y]补直接求得[X×Y]补的过程中,需要讨论当相乘的两个数中有一个或二个为负数的情况,在这种情况下处理被乘数或部分积时与原码乘法有某些类似之处,但差别在于符号位要和数值一起参加运算。如果[Y]补=Y0Y1Y2…Yn,且当Y0为1,则表示Y=-1+Yi×2-i, 因此X×Y=X×(-1+ Yi × 2^-i) - X; 当 Y 是负值时,用补码乘法计算[X×Y]补是使用[X]补与[Y]补的数值位相乘,并忽略符号位上的1。在完成乘法后,在结果中减去X,即加上-[X]补。
实现补码乘法的一种方法是由BOOTH提出的比较法。这种方法避免了区分乘数符号正负的需求,并允许其参与运算。技巧在于将每一位为1的Y分解成高一位的一个+1和本位上的一个-1: X×Y=X×(-1+Yi × 2^i)。进一步展开,可得:
X×[-Y0 + Y1 × 2^-1 + Y2 × 2^-2 + … + Yn × 2^-n]
接着合并相同幂次项得到:
= X×[(Y1-Y0)+(Y2 - Y1) × 2^-1+…+(Yn – Y(n-1)) × 2^-(n-1)+(0-Yn) × 2^-n]
公式展开后,每次的部分积为:
P1=[2^-1(Y(n+1)-Yn)×X]补
P2=[2^-1(P1 + (Yn - Y(n-1)) × X)]补
...
Pi=[2^-1(P(n-i)+ (Y(n-I+2) – Y(n-I+1)) × X)]补
...
Pn=[2^-1(P(n-1)+(Y2-Y1)×X)]补
P(n+1)=[(Pn+(Y1-Y0)×X)]补
最终的[X*Y]补就是[P(n+1)]补。
通过上述公式可以看出,比较法是用乘数中每相邻两位判断如何求得每次相加数。这四种组合(00, 01, 10, 11)分别对应差值为(0, +1, -1 和 0),非最后一次的部分积分别为上一次部分积的二分之一,加上[X]补或减去[X]补,并且在最后一步中不执行右移操作。计算乘积时需要增加一个额外位Y(n+1)并将其初始值设为0,同时还需要添加对Yn和Y(n+1)两位进行译码的线路来区分四种不同的差值情况。
对于N位数(不含符号位)相乘的情况来说,要计算N+1次部分积,并且在最后一次求出的部分积中不执行右移操作。此时最好使用双符号位方案以提高加法器效率。