【问题标题】:Why does a 4 bit adder/subtractor implement its overflow detection by looking at BOTH of the last two carry-outs?为什么 4 位加法器/减法器通过查看最后两个进位来实现其溢出检测?
【发布时间】:2013-01-15 15:34:57
【问题描述】:

这是我们为班级提供的图表:

为什么不在这张图片中使用 C4?如果 C4 为 1,那么最后的加法导致溢出,这就是我们想知道的。为什么我们需要看 C3?

【问题讨论】:

  • 提示:写出这个东西可以生成的 2 的补码负数...
  • 1111, 1110, 1101, 1100, 1011, 1010, 1001, 1000
  • 或者更简单地说,通过0 - 1和1000 - 1的计算工作(删除以前的,误导,评论)
  • 真不知道词是怎么弄的?是加/减的结果吗
  • 从简单的角度来看,如果丢弃C4位,结果值是否会改变?只有当 C4 和 C3 不同时它才会改变。如果它们相同,则值相同。

标签: vhdl boolean-logic circuit


【解决方案1】:

Overflow flag 表示 签名 操作的溢出条件。

在签名操作中要记住的几点:

  • MSB 始终保留以指示数字的符号
  • 负数用 2 的补码表示
  • 溢出导致无效操作

Two's complement overflow rules:

  • 如果两个正数之和产生负数,则和已溢出。
  • 如果两个负数之和得出正结果,则和已溢出。
  • 否则,总和没有溢出。

例如:

**Ex1:**
 0111   (carry)  
  0101  ( 5)
+ 0011  ( 3)
==================
  1000  ( 8)     ;invalid (V=1) (C3=1) (C4=0)


**Ex2:**
 1011   (carry)  
  1001  (-7)
+ 1011  (−5)
==================
  0100  ( 4)     ;invalid (V=1) (C3=0) (C4=1)


**Ex3:**
 1110   (carry)  
  0111  ( 7)
+ 1110  (−2)
==================
  0101  ( 5)     ;valid (V=0) (C3=1) (C4=1)

在有符号运算中,如果最左边的两个进位位(在这些示例中位于顶行最左侧的位)均为 1 或均为 0,则结​​果有效;如果左两个进位位是“1 0”或“0 1”,则发生符号溢出。方便的是,对这两个位进行 XOR 操作可以快速确定是否存在溢出条件。 (参考:Two's complement)

溢出与进位:溢出可以被认为是Carry.的二进制补码形式在有符号操作中溢出标志被监控并且进位标志被忽略。类似地,在 unsigned 操作中,进位标志被监控​​,溢出标志被忽略。

【讨论】:

    【解决方案2】:

    当最高有效位的进位不等于进位时,会发生有符号数的溢出。

    例如,使用 8 位,65 + 64 = 129 实际上会导致溢出。这是因为这是二进制的 1000 0001 也是 2 的补码的 -127。如果你通过这个例子,你可以看到这是进位不等于进位的结果。

    即使进位标志为高,也可以进行正确的计算。

    考虑

      1000 1000   = -120
    + 1111 1111   = -1
    
    =(1) 10000111 = -121 
    

    有 1 的进位,但没有溢出。

    【讨论】:

      【解决方案3】:

      对于任何正的自然位数,我想给出一个更一般的答案。

      让我们调用最后一个进位输出 C1、倒数第二个进位输出 C0、和符号输出 S0 以及 A 和 B 的符号位分别为 A0 和 B0。

      那么以下成立:

      • C1 = A0 + B0 + C0
      • S0 = A0*B0 + A0*C0 + B0*C0

      现在让我们来看看各种可能性。

      • 如果C1 == 1有两种可能:
        • 如果C0 == 0: A0 和 B0 必须都为 1(因此 A 和 B 都必须为负)。这 表示 S0 必须为 0 表示解决方案为正,而 A 和 B 是负数 => 溢出
        • 如果C0 == 1:要么
          • A 和 B 的符号相反,因此不可能溢出。 => 没有溢出
          • A0 和 B0 都是 1(因此 A 和 B 必须都是负数)。这意味着 S0 必须为 1 意味着解决方案是负数 => 没有溢出
      • 如果C1 == 0有两种可能:
        • 如果C0 == 0:要么
          • A0 和 B0 都是 0(因此 A 和 B 必须都是正数)。这意味着 S0 必须为 0 意味着解决方案是肯定的 => 没有溢出
          • A 和 B 符号相反 => 没有溢出
        • 如果C0 == 1: A0 和 B0 必须都为 0(因此 A 和 B 必须都是正数)这 表示 S0 必须为 1,表示解决方案为负,而 A 和 B 为正 => 溢出

      希望能帮助到那里的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 2021-11-16
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多