4位符号加减器
本文最后更新于 982 天前,其中的信息可能已经有所发展或是发生改变。

问题

继续上次的问题再拓展一下,为什么不做一个可加可减的计算器呢?

  • 1.如何识别加减法?
  • 2.正数加负数、正数减负数,负数加负数、负数减负数等怎么判断最终符号、计算结果。

设计思路

第一个问题很简单,只需要用0代替加法用1代替减法就行了。

初步考虑

第二个问题比较复杂,需要考虑到8种情况:

这里就用T表示计算器的加减号(0加法1减法),±A/±B代表A/B的正负(0正1负),±R表示结果的正负(?未知),M表示全加器结果是否加一(下面减法需要用到)。

本篇用到的全加器输入的是不带符号的数,例如计算器输入是00010(+2)/10110(-6),输入全加器的就是0010(+2)/0110(+6)

T=0

±A±B±RM
0000
101
011
1110

T=1

±A±B±RM
001
1010
0100
111

看完上面的表格完全不知道有什么用,下面慢慢解释一下。

* 用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得到下表:

TA>=B±A±B±RM
010000
000000
011011
001001
010101
000111
011110
001110
110001
100011
111010
101010
110100
100100
111111
101101

把这个真值表输入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生成公式再进行简化。

未经允许禁止转载本站内容,经允许转载后请严格遵守CC-BY-NC-ND知识共享协议4.0,代码部分则采用GPL v3.0协议

评论

  1. Hakadao
    Windows Edge
    3 年前
    2022-2-07 23:12:11

    博主很强Σ(っ °Д °;)っ

    • Hakadao
      博主
      Windows Edge
      3 年前
      2022-2-07 23:14:03

      才刚学会逻辑门(/ω\)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇