原创 布思算法

2013-6-17 16:49 1446 2 2 分类: FPGA/CPLD

高性能乘法器是现代微处理器中的重要部件,是实时图像处理和数字信号处理的核心. 同时乘法器也是微处理器数据处理的关键路径, 乘法器完成一次乘法操作的周期基本上决定了微处理器的主频. 因此人们对提高乘法器的性能进行了大量的研究.在这个研究过程中,布思算法便起到了很大的作用。

假设A为乘数,B为被乘数。

乘数A可表示为:
    A = - A[N-1] * 2^N-1 + A[N-2] * 2^N-2 + …… + A[1] * 2^1 + A[0] * 2^0 

则:
    D = A * B
      = (- A[N-1] * 2^N-1 + A[N-2] * 2^N-2 + …… + A[1] * 2^1 + A[0] * 2^0) * B 
      = - A[N-1] * B * 2^N-1 + A[N-2] * B * 2^N-2 + …… + A[1] * B * 2^1 + A[0] * B * 2^0

做变形,得

    A = - A[N-1] * 2^N-1 + A[N-2] * 2^N-2 + …… + A[1] * 2^1 + A[0] * 2^0
      = - A[N-1] * 2^N-1 + (2A[N-2] - A[N-2]) * 2^N-2 + (2A[N-3] - A[N-3]) * 2^N-3 + …… +
        (2A[2] - A[2]) * 2^2 + (2A[1] - A[1]) * 2^1 + (2A[0] - A[0]) * 2^0 
      = - A[N-1] * 2^N-1 + A[N-2] * 2^N-1 - A[N-2] * 2^N-2 + A[N-3] * 2^N-2 - A[N-3] * 2^N-3 + …… +
        A[2] * 2^3 - A[2] * 2^2 + A[1] * 2^2 - A[1] * 2^1 + A[0] * 2^1 - A[0] * 2^0
      = (- A[N-1] + A[N-2]) * 2^N-1 + (- A[N-2] + A[N-3]) * 2^N-2 + …… +
        (- A[2] + A[1]) * 2^2 + (- A[1] + A[0]) * 2^1 + (- A[0] + 0) * 2^0 
      =     Σ
n = 0,A[-1] = 0
N - 1
   ((- A[n] + A[n-1]) * 2^n) 
      =  Σ
n = 0
N - 1
(E * 2n) (3-5)
其中:
    E = - A[n] + A[n-1] (0 ≤ n ≤ (N-1) , A[-1] = 0) (3-6)
其值如下表所示:
A[n]     A[n-1]        E
0            0        - 0 + 0 = 0
0            1        - 0 + 1 = 1
1            0        - 1 + 0 = - 1
1            1        - 1 + 1 = - 0
则:
    D = A * B
      = ( Σ
n = 0
N - 1
(E * 2n)) * B (3-7)
      =  Σ
n = 0
N - 1
((E * B) * 2^n) 这就是布思算法!

它考虑本位及相邻低位,确定操作为加或减、运算量为0或B。总的编码项为N 项,乘积项(被乘数与由乘数所
得某一编码项值的乘积。此表达方式可能更具一般性!)为N项。
 

 

对无符号数乘法:
乘数A可表示为
    A = A[N-1] * 2^N-1 + A[N-2] * 2^N-2 + …… + A[1] * 2^1 + A[0] * 2^0       =  Σ
n = 0
N - 1
(A[n] * 2^n) )
则:
    D = A * B
      = ( Σ
n = 0
N - 1
(A[n] * 2^n)) * B       =  Σ
n = 0
N - 1
((A[n] * B) * 2^n) (3-12)
可见,式(3-8)、式(3-12)表达形式是相同的,在此又将无符号数与符号数的乘法运统一起来。
 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /3 下一条