Both std_logic_vector
and unsigned
are 无约束数组 of std_logic
。正如signed
type. std_logic_vector
被声明在std_logic_1164
包裹;unsigned
and signed
在包中声明numeric_std
。这三种类型都是相同的;唯一的区别是他们的名字。
那么,这有什么意义呢?一个例子很好地说明了这一点:
With
variable U : unsigned(3 downto 0);
variable S : signed(3 downto 0);
variable I : integer;
then
U := "1111";
I := to_integer(U);
结果是I
被赋予值 15,而
S := "1111";
I := to_integer(S);
结果是I
被赋予值-1。这是因为unsigned
类型用于表示一个unsigned数,只能为正数。所以,"1111"
代表数字15。Asigned
然而,类型也需要能够表示负数,并且使用signed
type "1111"
代表-1(因为二进制补码该类型使用表示法)。
所以,你可以看到相同的功能 -to_integer
- 调用时返回两个不同的结果"1111"
- 15 或 -1 取决于参数是否为类型unsigned
or signed
。因此,您可以看到同时拥有这两种类型的意义所在,尽管它们之间唯一的区别是它们的名称。
其实有两个to_integer
功能,不是一个。一个需要一个unsigned
争论;另一个(同名to_integer
)需要一个signed
争论。正如您所看到的,它们的行为确实不同。编译器可以根据参数的类型决定需要调用哪个函数。这种想法,编译器可以根据参数的类型在不同(但名称相同的函数)之间进行选择,称为超载。它在软件语言中很常见。
那么,怎么样std_logic_vector
?假设你写道:
variable V : std_logic_vector(3 downto 0);
variable I : integer;
then
V:= "1111";
I := to_integer(V);
您期望得到什么结果to_integer
功能? 15还是-1?这个困境是通过上面的代码非法来解决的——它无法编译。它不会编译,因为没有版本to_integer
定义的函数std_logic_vector
- the to_integer
函数未针对该类型重载std_logic_vector
.
因此,如果您只需要表示正数,那么最好使用unsigned
类型;如果你需要表示负数,你需要使用signed
类型。如果你真的不在乎,因为你的位模式不是数字,或者因为你没有对它进行任何数学运算(你只是将它从一个地方传输到另一个地方),那么你最好使用std_logic_vector
.
https://www.edaplayground.com/x/2Qq4 https://www.edaplayground.com/x/2Qq4