定点数补码加减法运算器设计
注:如果文章有很多地方不懂,请先看上一节内容。https://blog.csdn.net/qq_43355372/article/details/100065075
一,四位串行加法器的设计(基于一位全加器FA)
图 1 图1 图1
之 后 若 不 做 说 明 , 则 X : A 3 A 2 A 1 A 0 Y : B 3 B 2 B 1 B 0 之后若不做说明,则\quad X:A_3A_2A_1A_0\qquad Y:B_3B_2B_1B_0 之后若不做说明,则X:A3A2A1A0Y:B3B2B1B0
二,四位串行加减法器设计
图
2
图2
图2在一的基础上做出如图改进,可实现加减法运算,当 p=0 时,Y值不变,根据公式
[
X
+
Y
]
补
=
[
X
]
补
+
[
Y
]
补
[X+Y]_补=[X]_补+[Y]_补
[X+Y]补=[X]补+[Y]补,实现加法运算。当 P=1时,Y相当于取反加一(别问我一是怎么来的,C0即P),从而实现了
[
Y
]
补
→
[
−
Y
]
补
[Y]_补\rightarrow[-Y]_补
[Y]补→[−Y]补根据公式
[
X
]
补
−
[
Y
]
补
=
[
X
]
补
+
[
−
Y
]
补
[X]_补-[Y]_补=[X]_补+[-Y]_补
[X]补−[Y]补=[X]补+[−Y]补,实现减法运算。(发现没有,就是想办法把减法变为加法)
三,带溢出检测功能的加/减法运算器
图 3 图3 图3
方法一:对操作数与运算结果的符号位进行检测。
图
4
图4
图4
方法二:对最高数据位进位与符号位进行进行检测。纠正:图应是 V = C 3 ⨁ C 4 V=C_3\bigoplus C_4 V=C3⨁C4
方法三:用变形补码。直接将S2与S3进行异或,为1则溢出。(由于过于简单,就不上图了)
四,带无符号数溢出检测功能的加减运算器
图 5 图5 图5
五,串行进位
图
6
图6
图6
由文首到此,不管是加法还是加减法混合或者溢出检测,我们都是用的串行进位,这种方法很容易理解,但是,由上图可以的例子可以发现,若S1想得到结果,必须由上一步的FA得出进位信息才行,以此类推,到了Cout,效率肯定是不高的。那有没有方法让S0,S1,S2,S3不必得出上一步再才到下一步呢,而是同时运行呢?答案肯定是有的——并行进位。
六,并行进位
图
7
图7
图7
因为每一个进位信息都是由参与计算的补码计算而来的,所以我们可以如图7所示把C2,C3,C4用A0,B0,A1,B1…进行替换。
图
8
图8
图8
按照图8的示例可设计出四位并行运算器。
七,多位串行与并行进位运算器
图
9
图9
图9
四位并行加法器组成ALU。现在我们又可以将ALU用来组合。因为每个ALU为4位,所以图9就是一个16位的串行加法器(当然叫串行与并行加法器更合适,因为每个ALU都是并行进位加法器,而ALU与ALU之间是串行连接的)。
图
10
图10
图10
图
11
图11
图11
可以类似将FA做成四位并行加法器的方法,我们也可一将ALU做成并行加法器,图10,图11。现在,不如让我们发挥一下想象力,我们是不是也可以做出32位,甚至64位的加/减法运算器,而且溢出检测是不是也可以运用上去呢?