问题
继续上次的问题再拓展一下,为什么不做一个可加可减的计算器呢?
- 1.如何识别加减法?
- 2.正数加负数、正数减负数,负数加负数、负数减负数等怎么判断最终符号、计算结果。
设计思路
第一个问题很简单,只需要用0代替加法用1代替减法就行了。
初步考虑
第二个问题比较复杂,需要考虑到8种情况:
这里就用T表示计算器的加减号(0加法1减法),±A/±B代表A/B的正负(0正1负),±R表示结果的正负(?未知),M表示全加器结果是否加一(下面减法需要用到)。
T=0
±A | ±B | ±R | M |
0 | 0 | 0 | 0 |
1 | 0 | ? | 1 |
0 | 1 | ? | 1 |
1 | 1 | 1 | 0 |
T=1
±A | ±B | ±R | M |
0 | 0 | ? | 1 |
1 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 1 | ? | 1 |
看完上面的表格完全不知道有什么用,下面慢慢解释一下。
* 用A<0 B<0的加法举例,对照表格发现它们的结果一定是负数,因此只要去掉两数的符号相加即可,最后的结果就是±R拼接上全加器的结果,所以这里的首位一定是1。
*用A>0 B>0的减法举例,这里直接就是正数减去正数。
还记得减法器吗?它可以实现两正数的减法,只需要把减数取反+1即可,但是只能在A>B的情况下A – B。
因此这里只需要先判断两数大小,把较小的数取反+1再与另一个数相加就得到了结果。
但是根据表格来看我们并不能确定最终的符号,因此需要进一步分类讨论。
深入讨论
结果符号确定
现在我们对符号不定的情况讨论,先看看符号确定的情况是怎么样的:
例如A>0 B>0的加法,符号一定是正号(0),所以无论是A>B还是A<B,全加器计算的都是加法。
再看A>0 B<0的减法,正数减去负数一定是正数,所以无论是A>B还是A<B,全加器都是加法运算。
结果符号不定
下面来正式对四种不定符号讨论(以下A、B均取绝对值):
T=0 A<0 B>0
若A>B,我们知道负数越小绝对值就越大,所以这种情况下A+B只能是负数,因此A>B或A=B,结果的符号一定是负号(1)。
相反地,若A<B,结果的符号一定是正号(0)。
概况一下就是:
A>B ±R = 1 取反B
A<B ±R = 0 取反A
怎么计算两种情况的结果呢?
例如 -9 + 4 = -5,A>B且结果是负数,观察一下就知道,结果等同于 – (9 – 4) = -5。
– (9 – 4) = -5是一个两正数的减法,这样就转换成了减法器能计算的式子,现在又知道了结果的正负,只需要在最前面拼接上符号位就是结果了。
例如 -4 + 9 = 5,A<B且结果是正数,等同于 9 – 4 = 5,同样是两个正数的减法。
推论
按照上面的思路继续推出剩下6种情况,就会发现在符号不定的情况下,全加器一定在计算减法,并且结果的符号由A、B的大小关系决定。
计算减法还需要将减数取反+1,所以我们判断出A、B的大小关系就可以决定要将哪一个取反。
T=0 A>0 B<0
A>B ±R = 0 取反B
A<B ±R = 1 取反A
T=1 A>0 B>0
A>B ±R = 0 取反B
A<B ±R = 1 取反A
T=1 A<0 B<0
A>B ±R = 1 取反B
A<B ±R = 0 取反A
推论2
观察一下发现,只要是M=1的情况下,A>B对B取反,A<B对A取反。
得出判断是否取反A的公式:RA = A>B·M
,则RB = ¬RA
·M
结果进位
因为全减器要舍弃最高位,而这里是用M和RA、RB改造全加器变成全加减器。
因此若是M=1的情况就舍弃输出进位C(out),得到结果进位C的公式:C = C(out)·¬M
真值表
根据上面提到的T A>B ±A ±B ±R M C得到下表:
T | A>=B | ±A | ±B | ±R | M |
0 | 1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 0 | 1 |
把这个真值表输入Logisim,用它自带的功能生成公式:
再把得到的公式化简一下,这里具体步骤就不展示了,直接给出结果(下面AB表示A>=B):
- M = ¬A · ((¬T · B) + (T ·¬B)) + A · (¬(T + B) + (T · B))
- ±R = ¬AB · ((¬T · B) + (T ·¬B)) + A · AB
- RA = AB · M
- RB = ¬RA·M
- C = C(out)·¬M
观察上面的式子发现(¬T · B) + (T ·¬B)可以用两次,令它为F。
实践
根据上面的公式画出如下逻辑电路:
其中Compare_4Bit用于4位无符号数值比较,FullAdder_4Bit是一个4位全加器。
图中rB_T表示¬B ? T,ReA、ReB即为RA、RB,M1 + M2和R1 + R2构成M、±R,C为最终结果进位,AgtB(A>B)、AeqB(A=B)、AltB(A<B)。
拆分来看,左下框选的是A、B取反模块,分别由4个异或门控制。
右上是±R和M的公式翻译,可以和RA、RB一起封装成模块简化电路。
检验
下面我们来检验一下最终成品:
加法器
00011(+3) + 00011(+3) = 000110(+6)
减法器
00110(+6) – 00101(+5) = 000001(+1)
混合加减
10110(-6) + 00101(+5) = 100001(-1)
10110(-6) – 10101(-5) = 100001(-1)
溢出
00111(+7) + 01001(+9) = 010000(+16)
最后
多种情况已经检验完成并且没有任何问题,本计算器可能可以进一步简化但是目前我还没想到。
对于上面的复杂真值表,由于我不会用卡诺图,因此就直接用Logisim生成公式再进行简化。
博主很强Σ(っ °Д °;)っ
才刚学会逻辑门(/ω\)