当前位置: 首页 > >

原码乘法运算

发布时间:

1、原码一位乘法

首先,符号位和数值位要分开计算,因此分为两步:
(1)确定乘积的符号位。由两个乘数的符号异或得到。
(2)计算乘积的数值位。


已知[x]= X0.X1X2……Xn,[y]= Y0.Y1Y2……Yn
通过数学推导得:
x × y = x × (0.y1y2…yn)
? ? ? ? =x × y1 × 2-1+x × y2 × 2-2 + … +x × yn× 2-n
? ? ? =2-1(2-1(2-1…(2-1(2-1(0 + x × yn)+ x × yn-1)+ … + x × y2) + x × y1


得到递推公式:Pi+1= 2-1(Pi + x × yn-i) ??(i = 0, 1, 2…, n-1)
最终乘积:Pn = x × y


迭代过程如下:


    取乘数的最低位yn-i判断。若yn-i的值为1,则将上一步迭代部分积Pi与x相加;反之为0,则什么也不做。右移一位,产生本次部分积Pi+1


= 0开始,经过n次“判断-加法-右移”循环,直到求出Pn为止。若每次循环在一个时钟周期内完成,则n位乘法需要n个时钟周期来完成。


被乘数寄存器X:存放被乘数 乘积寄存器P:开始置初始部分积P0 = 0;结束时,存放的是64位乘积的高32位乘数寄存器Y:开始时置乘数;结束时,存放的是64位乘积的低32位 进位触发器C:保存加法器的进位信号循环次数计数器Cn:存放循环次数。初值32,每循环一次,Cn减1,Cn=0时结束ALU:乘法核心部件。在控制逻辑控制下,对P和X的内容“加”,在“写使能”控制下运算结果被送回P,进位位在C中


例:[x] = 0.1101, [y] = 0.1011

符号位为0?0=0,所以结果为:0.1000 1111


2、原码二位乘法

对于n位原码一位乘法来说,需要经过n次“判断-加法-右移”循环,运算速度慢,如果对乘数的每两位取值情况进行判断, 使每步求出对应于该两位的部分积,则可将乘法速度提高一倍。
每两位的组合及对应的求部分积的操作情况如下:



若Yi-1Yi = 00, 则Pi+1 = 2-2(Pi + 0)
若Yi-1Yi = 01, 则Pi+1 = 2-2(Pi + X)
若Yi-1Yi = 10, 则Pi+1 = 2-2(Pi + 2X)
若Yi-1Yi = 11, 则Pi+1 = 2-2(Pi + 3X)



对于上述“+0”, “+X",与前面原码一位乘法一样即可;对于“+2X”,可以通过左移一位实现;对于“+3X”,用4X - X代替,本次执行“-X”(“-X”由其补码实现)下一次执行“+4X”。 这种情况下, 部分积可以由Pi+1 = 2-2( Pi + 3X) = 2-2( Pi -X + 4X) = 2-2( Pi - X) + X 得到。所以“+4X”变成“+X”,可以由一个触发器T记录下次是否需要进行“+X”。


例:[x] = 0.111001, [y] = 0.100111

加上符号位,得到结果为:0.100010101111
其中采用了模8补码形式,因为若要用模4补码,则Y和P同时右移两位时,得到的P3是负数,这是错误的,所以要再增加一个符号位。



友情链接: