【问题标题】:Overflow bit 32Bit ALU VHDL溢出位 32Bit ALU VHDL
【发布时间】:2017-02-10 16:46:32
【问题描述】:

我目前正在用 VHDL 编写一个 32 位 ALU(加/减)。我遇到了溢出位的问题。 根据运算(加法、减法)和输入值,我看不到何时设置溢出。

你能帮帮我吗?

最好的问候, 安德烈

【问题讨论】:

    标签: overflow vhdl


    【解决方案1】:

    只是为了给 Martin 的答案添加一些额外的信息,您需要小心使用 2 的补码算法检测溢出。

    例如,如果您有以二进制补码格式表示的 3 位有符号值,并且您想检测溢出,则需要将符号扩展到额外位,然后查看额外位是否与最重要的通缉:

    例如,如果要计算a = b + c:

    --Declare the signals
    signal overflow : std_logic;
    signal a : signed(2 downto 0);
    signal b : signed(2 downto 0);
    signal c : signed(2 downto 0);
    
    -- Declare some additional signals with one more MSB than the original signals
    signal a_extended : std_logic(3 downto 0);
    signal b_extended : std_logic(3 downto 0);
    signal c_extended : std_logic(3 downto 0);
    
    -- Sign extend the MSB
    b_extended <= b(2) & b;
    c_extended <= c(2) & c;
    
    -- Perform the addition
    a_extended <= b_extended + c_extended;
    
    -- Detect the overflow case
    overflow <= '1' when a_extended(3) /= a_extended(2) else '0';
    
    -- Calculate the answer
    -- Limit to 100 (-4) or 011 (+3) in the case of overflow
    process(a_extended)
    begin
       if a_extended(3) /= a_extended(2) then
          if a_extended(3) = '1' then
             a <= "100";
          else
             a <= "011";
          end if;
       else
          a <= a_extended(2 downto 0);
       end if;
    end process;
    

    【讨论】:

    • 添加到贾斯汀的答案(这很有意义:)在 ieee.numeric_std 库中有调整向量大小的函数。加法可以写成a&lt;=resize(b,a'length)+resize(b,a'length)。此外,在溢出的情况下限制答案通常不是您想要做的 - 它需要额外的逻辑。如果进位用于多字加法,你真的不想饱和算术。
    【解决方案2】:

    规范说它应该做什么?应该有关于在什么条件下应该设置溢出标志的描述。

    通常,当输出太大而无法存储时,会设置溢出位。您可以将其视为对两个 32 位数字求和的答案中的第 33 位。在有符号算术中,如果运算结果的幅度太大,则可能发生这种情况,而与符号无关。使用 2-s 补码算法,您必须小心一点,因为最大负数比您可以在给定位数中表示的最大正数稍微负数。

    就实际操作而言,只需创建一个比输入宽 1 位的 numeric_std 向量,就可以了

    a&lt;=b+c;

    并让合成器创建逻辑。这样您就不必担心细节了。

    “a”的最高位可以去掉(使用a(a'high),作为溢出使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多