无符号和 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_vectorunsigned 都是 无约束数组 of std_logicsigned 类型也是如此。 std_logic_vectorstd_logic_1164 包中声明; unsignedsigned 在包 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 取决于参数是否为输入 unsignedsigned。因此,您可以看到同时拥有这两种类型的意义,尽管它们之间的唯一区别是它们的名称。

实际上,有两个 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.

https://www.edaplayground.com/x/2Qq4