任何人都可以告诉我下面的书面陈述之间的区别。
signal A: **unsigned**(3 downto 0);
signal B: **std_logic_vector**(3 downto 0);
答案 0 :(得分:7)
std_logic_vector
和unsigned
都是<{1}}的无约束数组。和std_logic
类型一样。 signed
包中声明了std_logic_vector
; std_logic_1164
和unsigned
在包signed
中声明。这三种类型都是相同的;唯一的区别是他们的名字。
那么,重点是什么?这一点很好地通过一个例子来说明:
使用
numeric_std
然后
variable U : unsigned(3 downto 0);
variable S : signed(3 downto 0);
variable I : integer;
导致U := "1111";
I := to_integer(U);
被赋予值15,而
I
导致S := "1111";
I := to_integer(S);
的值为-1。这是因为I
类型用于表示无符号号码,该号码只能是正数。因此,unsigned
表示数字15.但"1111"
类型也需要能够表示负数,而signed
类型signed
表示-1 (因为此类型使用二进制补码表示。)
因此,您可以看到相同的函数 - "1111"
- 在使用to_integer
调用时返回两个不同的结果 - 15或-1,具体取决于参数是否为"1111"
类型或unsigned
。所以,你可以看到两种类型的关键点,即使它们之间唯一的区别就是它们的名称。
实际上,有两个signed
函数,而不是一个。一个人需要to_integer
个参数;另一个(名称相同的unsigned
)采用to_integer
参数。如您所见,它们的行为方式不同。编译器可以根据参数的类型决定需要调用哪个函数。这种想法,编译器可以根据参数的类型在不同(但同名的函数)之间进行选择,称为重载。它在软件语言中很常见。
那么,signed
呢?假设您写道:
std_logic_vector
然后
variable V : std_logic_vector(3 downto 0);
variable I : integer;
您对V:= "1111";
I := to_integer(V);
函数的期望是什么? 15或-1?上述代码是非法的 - 这将无法编译,从而解决了这一难题。它不会编译,因为没有为to_integer
定义的to_integer
函数的版本 - std_logic_vector
函数没有为类型to_integer
重载。
因此,如果您只需要表示正数,则最好使用std_logic_vector
类型;如果您需要表示负数,则需要使用unsigned
类型。如果你真的不在乎,因为你的比特模式不是一个数字,或者因为你没有对它进行任何数学计算(你只是将它从一个地方运到另一个地方),那么你最好使用{{1 }}