为VHDL定义溢出numeric_std符号/无符号(Is overflow defined for

2019-09-20 15:46发布

如果我有一个unsigned(MAX downto 0)包含值2**MAX - 1 ,做VHDL(87 | 93 | 200X)标准定义,当我通过一个加一,会发生什么? (或类似地,当我从零递减它由一个?)

Answer 1:

简短的回答:

没有溢出处理,溢流进位简单地丢失。 这样的结果简直是你的操作模2 ^ MAX的整数结果。

更长的答案:

所述numeric_std包是一个标准的包装,但它不是核心的VHDL标准(87,93,200X)。 供参考: numeric_std.vhd

+到底操作员调用ADD_UNSIGNED (L, R : unsigned; C : std_logic)函数(与C = '0' 需要注意的是任何整数/自然操作数首先被转换成unsigned

该函数的定义是:

function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is
    constant L_left : integer   := L'length-1;
    alias XL        : unsigned(L_left downto 0) is L;
    alias XR        : unsigned(L_left downto 0) is R;
    variable RESULT : unsigned(L_left downto 0);
    variable CBIT   : std_logic := C;
begin
    for i in 0 to L_left loop
        RESULT(i) := CBIT xor XL(i) xor XR(i);
        CBIT      := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
    end loop;
    return RESULT;
end ADD_UNSIGNED;

正如可以看到的“溢出”的发生,如果CBIT='1' (进位),用于i = L_left 。 结果位RESULT(i)通常计算和最后进位机器人值被忽略。



Answer 2:

我已经受够了想一个问题unsigned溢出/下溢在C或Verilog和这里是我想出了( resultdeltaunsigned ):

result <= unsigned(std_logic_vector(resize(('1' & result) - delta, result'length))); -- proper underflow
result <= unsigned(std_logic_vector(resize(('0' & result) + delta, result'length))); -- proper overflow

对于溢出'0' & result使得一个unsigned为1位更大,以能够正确地适应加入的值。 的MSB然后被除去resize其产生正确的溢出值命令。 同为下溢。



Answer 3:

为MAX的值等于7加入1〜2 ** 7 - 1(127)将导致值2 ** 7(128)。

的最大无符号值是由一个无符号阵列型的长度来确定:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity foo is
end entity;

architecture faa of foo is
    constant  MAX: natural := 7;
    signal somename:  unsigned (MAX downto 0) := (others => '1');
begin
UNLABELED:
    process
    begin
        report "somename'length = " & integer'image(somename'length);
        report "somename maximum value = " &integer'image(to_integer(somename));
        wait;
    end process;
end architecture;

聚集体(others => '1')表示的各元素的“1” somename这是一个无符号阵列类型和表示最大二进制值成为可能。

这给:

foo.vhdl:15:9:@ 0毫秒:(报告注):somename'length = 8
foo.vhdl:16:9:@ 0毫秒:(报告注):somename最大值= 255

的长度是8并且由无符号的数组类型的数值范围表示的是从0到2 ** 8 - 1(255),最大可能值是大于2 ** 7(128),并且没有溢出。

这是在一个新的问题,注意到VHDL模2 ^ 32除 。 在你接受的答案的背景下,假设你的意思,而不是长度最左边的值。

从零的情况下递减确实导致的2 ** 8的值 - 1(255)(MAX = 7)。 下溢或取决于你的数学宗教溢出。

帽尖乔纳森Drolet在链接新问题,指出了这一点。



文章来源: Is overflow defined for VHDL numeric_std signed/unsigned