
最近一直在刷力扣。然后突然又想二刷计算机组成与设计。就结合计算机组成与设计这本书以及北大的同名精品课开始复习。看的是真的舒服。
唔,我自己看计算机组成与设计的时候,看了后面的逻辑设计部分,学到的最大的收获就是,从真值表出发,或许可以推出简单的逻辑运算公式,但是一定可以推出对应的电路图。从逻辑运算公式出手,是一定能够推出真值表的,也一定可以推出电路图的。有了电路图,真值表和逻辑运算公式也一定能够推理出来。
因此,就从半加器出发吧。来试着推一下玩玩。

这是一个半加器的真值表。直接就可以看出C是与,S是异或。
这个比较简单,电路如图所示。

那如果是全加器呢?


来看,A B C 和OUT,很简单,我们直接转换真值表。
第一个A:1 B:1 C: 0 OUT:1.
那么对应得就是

一般逻辑设计,有了真值表,可以直接看输出为1的部分,只要能实现1,那么0自然也实现了。
再来看其它部分:

那么OUT的表达式整体上就是:并且化简以后那就是:

那么看最后的式子来翻译OUT:
那就是 AB的与电路+(AB的异或电路)与C。
那么结构如下:

好了,用同样的道理进行化简,就可以得到S的电路:

两个内容一合成,就是全加器的电路:

4 bit加法器具体是这样形成的:

也就是很简单的4个1 bit 全加器串联在一起就好了。
然后的话每一位分别对应一位加法器。
接下来是我做的一个实例:

好了,我们轻松地做出来了一个4Bit加法器。出发点是什么?真值表和逻辑公式和电路的相互转化!
具体32位加法器我就不具体做了,然后的话32位加法器差不多,下面是1个图:

好了,问题来了,可能出现溢出的情况。具体的话得看到具体的操作。
如果是add,那是有符号数,就可能出现溢出,如果是addu,那是无符号数,那就问题不是太大。
具体的话是这样的:

有符号数嘛,就是因为补码造成的这种情况。无符号数就好多了,不会出现这种尴尬的情况。
当然了,溢出和进位不能一概而论,所以又有了下列的情况:

溢出又要怎么检测呢?很简单,最高位的输出不等于最高位的输入。这就是溢出了。用什么电路合适检测?都是0和1的话输出是0,否则为1.那么显然直接就是异或了。
减法器怎么办?A-B可以看成A+(-B)。那么直接用补码把B取反再+1即可。在具体的加法器的做法是这样的:

当sub信号为0时,那么还是进行加法操作。当sub信号为1时,B取反,之后C0置为1,进位输入为1,那么就做到了按位取反再加1的操作。
以上就是加减法的实现。