如果我添加两个签名号码,例如-1
和-1
,则结果应为-2
。如果我添加相同的值但是无符号输出将是相同的。
那么签名和未签名之间的区别是什么?
答案 0 :(得分:1)
这是完全正常的,无论操作数是有符号还是无符号,2的补码中的加法在逻辑上是相同的。您对价值的解释会有所不同。
两种类型之间的主要区别在于向量如何扩展到更大的值。 unsigned 始终使用前导零进行扩展,而 signed 则使用符号位(msb)进行扩展。
例如:
signal a_u : unsigned(11 downto 0);
signal b_u : unsigned( 1 downto 0);
signal c_u : unsigned(11 downto 0);
signal a_s : signed(11 downto 0);
signal b_s : signed( 1 downto 0);
signal c_s : signed(11 downto 0);
...
a_u <= X"123";
b_u <= "11"; -- 3
c_u <= a_u + b_u; -- b_u is extended to 12 bits with 0, result is X"126"
a_s <= X"123";
b_s <= "11"; -- -1
c_s <= a_s + b_s; -- b_s is extended with sign bit (1), result is X"122";
答案 1 :(得分:0)
一般情况下: SIGNED和UNSIGNED类型在ieee库的std_logic_arith,numeric_std和numeric_bit包中提供。
UNSIGNED类型表示无符号数值,只能为正数或零。编译器将每个UNSIGNED类型解释为二进制数,左侧的数字为MSB
SIGNED类型表示带符号的数值,可以是正数,零或负数。编译器将每个SIGNED类型解释为二进制补码二进制表示;最左边的位表示值是正还是负
所以你的代码可能有问题......