无符号和 std_logic_vector 之间的区别
Difference between unsigned and std_logic_vector
谁能告诉我下面的书面陈述之间的区别。
signal A: **unsigned**(3 downto 0);
signal B: **std_logic_vector**(3 downto 0);
std_logic_vector
和 unsigned
都是 无约束数组 of 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);
导致 I
被赋予值 15,而
S := "1111";
I := to_integer(S);
导致 I
被赋予值 -1。这是因为 unsigned
类型用来表示一个 unsigned 数,它只能是正数。因此,"1111"
表示数字 15。但是,signed
类型也需要能够表示负数,对于 signed
类型,"1111"
表示 -1 (因为这种类型使用了 twos complement 表示)。
因此,您可以看到同一个函数 - to_integer
- returns 在使用 "1111"
调用时会产生两个不同的结果 - 15 或 -1 取决于参数是否为输入 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);
您希望 to_integer
函数产生什么结果? 15 还是 -1?上面的代码是非法的——它不会编译,解决了这个难题。它不会编译,因为没有为 std_logic_vector
定义的 to_integer
函数版本 - to_integer
函数没有为 std_logic_vector
.[=49= 类型重载]
因此,如果您只需要表示正数,最好使用 unsigned
类型;如果您需要表示负数,则需要使用 signed
类型。如果您真的不在乎,因为您的位模式不是数字,或者因为您没有对其进行任何数学运算(您只是将它从一个地方传输到另一个地方),那么您最好使用 std_logic_vector
.
谁能告诉我下面的书面陈述之间的区别。
signal A: **unsigned**(3 downto 0);
signal B: **std_logic_vector**(3 downto 0);
std_logic_vector
和 unsigned
都是 无约束数组 of 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);
导致 I
被赋予值 15,而
S := "1111";
I := to_integer(S);
导致 I
被赋予值 -1。这是因为 unsigned
类型用来表示一个 unsigned 数,它只能是正数。因此,"1111"
表示数字 15。但是,signed
类型也需要能够表示负数,对于 signed
类型,"1111"
表示 -1 (因为这种类型使用了 twos complement 表示)。
因此,您可以看到同一个函数 - to_integer
- returns 在使用 "1111"
调用时会产生两个不同的结果 - 15 或 -1 取决于参数是否为输入 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);
您希望 to_integer
函数产生什么结果? 15 还是 -1?上面的代码是非法的——它不会编译,解决了这个难题。它不会编译,因为没有为 std_logic_vector
定义的 to_integer
函数版本 - to_integer
函数没有为 std_logic_vector
.[=49= 类型重载]
因此,如果您只需要表示正数,最好使用 unsigned
类型;如果您需要表示负数,则需要使用 signed
类型。如果您真的不在乎,因为您的位模式不是数字,或者因为您没有对其进行任何数学运算(您只是将它从一个地方传输到另一个地方),那么您最好使用 std_logic_vector
.