vhdl中有符号和无符号加法有什么区别?

时间:2015-04-10 22:39:54

标签: vhdl

如果我添加两个签名号码,例如-1-1,则结果应为-2。如果我添加相同的值但是无符号输出将是相同的。

那么签名和未签名之间的区别是什么?

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类型解释为二进制补码二进制表示;最左边的位表示值是正还是负

所以你的代码可能有问题......