原码乘法运算
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
部分积Pi和x进行无符号数相加,可能会产生进位,所以需要一个专门的进位位C。整个迭代过程从乘数最低位yn和P0 = 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是负数,这是错误的,所以要再增加一个符号位。