原码乘法运算

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

迭代过程如下:

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


   部分积Pi和x进行无符号数相加,可能会产生进位,所以需要一个专门的进位位C。整个迭代过程从乘数最低位yn和P0 = 0开始,经过n次“判断-加法-右移”循环,直到求出Pn为止。若每次循环在一个时钟周期内完成,则n位乘法需要n个时钟周期来完成。
实现32位无符号数乘法运算的逻辑结构图

  • 被乘数寄存器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
x * y
符号位为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是负数,这是错误的,所以要再增加一个符号位。

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值