笔算实现

无符号

笔算过程和十进制的笔算过程类似

image.png|700

机器实现

无符号

image.png|550

运算的过程可以看作位移运算和加法运算的组合, 但是这样运算会产生多个问题, 为此我们要简化运算的流程

image.png|800

所以对于4位二进制数乘法运算, 我们需要的条件是

  • 一个4位二进制数寄存器, 用于储存被乘数x
  • 两个4位二进制数寄存器, 用于储存运算后得到的数的高位和低位(因为右移运算了4位, 4+4=8, 低位存储了乘数y)

ALU功能和计算示意图|550

这里是ALU的大致示意图,我们将被乘数存入X, 乘数存入MQ, 最后通过运算后, 乘积的高位和低位分别存入ACC和MQ中.

image.png|800

这里是逻辑的大致示意图, 和 ACC 被初始化为 0 和 0000, X 为 1101, MQ 为 1011.

原码

原码表示相对于无符号来说, 存在一位符号位表示

image.png|800

如果想用四位来表示也是可以的, 仍然需要自己补上符号位

X     C ACC  MQ
01101 0 0000 1011
 
01101 0 1101 1011
01101 0 0110 1101
 
01101 1 0011 1101
01101 0 1001 1110
 
01101 0 0100 1111
 
01101 1 0001 1111
01101 0 1000 1111
 
// 最后就是 (0 ^ 1).10001111 也就是 1.10001111

补码运算方式

也叫做Booth算法, 推导分自行搜索.

image.png|800

举个栗子

image.png|800

y的补码是 1.0011(0), 由后往前进行相减计算得到的每一位是 -1 0 1 0 -1, 对应的就是 -x 0 x 0 -x, 每一轮运算过后跟上位移运算即可.

image.png|800

这里是一个例子, 本质上还是先加再位移运算. 只不过控制了是否加 0, +1, -1 的区别.
注意:

  • 位移运算是有符号的
  • 最后省略符号位和最后的辅助位

阵列乘法器

原码、补码一位乘法的硬件逻辑实现,需要在时钟节拍下、通过控制逻辑的控制,执行相应轮次的“加法、右移”操作来实现,速度较慢。

为了提高运算速度,可以仅采用组合逻辑电路以专用硬件方式构建阵列乘法器
构建阵列乘法器的基本思想是模仿二进制乘法的笔算方法

无符号阵列乘法器

image.png|800

补码阵列乘法器

  • 原码与补码之间可以相互转换,可采用反码法或扫描法
    • 如果将补码的符号位单独处理,将补码的数值位转换成原码的数值位,就可利用无符号阵列乘法器进行乘法运算。
    • 得到的结果为无符号乘积,将其转换成补码的数值位,然后在其前面添加单独处理的符号位即可得到补码乘法的结果。

其实本质上就是将补码转换成无符号码进行运算后变回补码, 而符号位单独参与运算.

流程图

image.png|800

注意点:

  • 最后的 2n 位求补电路是根据两个补码的符号位的异或结果决定要不要激活的.(1 为激活)
  • 同理开始的两个 n 位求补电路也是根据符号位决定是不是要激活的.

N 位求补电路的实现

第一种实现

image.png|800

注意:

  • 0, 1 控制是否激活求补功能.
  • 一位全加器的一个输入端默认为0.

第二种实现

image.png|800

注意:

  • 接地表示输入为0