unsigned和std_logic_vector之间的区别

Kel*_*iya 4 fpga vhdl

谁能告诉我下面的书面陈述之间的区别.

signal A: **unsigned**(3 downto 0);
signal B: **std_logic_vector**(3 downto 0);
Run Code Online (Sandbox Code Playgroud)

Mat*_*lor 10

两个std_logic_vectorunsigned不受约束阵列std_logic.就是这种signed类型.std_logic_vectorstd_logic_1164包装中声明; unsignedsigned在包装中声明numeric_std.这三种类型都是相同的; 唯一的区别是他们的名字.

那么,有什么意义呢?一个例子很好地说明了这一点:

variable U : unsigned(3 downto 0);
variable S : signed(3 downto 0);
variable I : integer;
Run Code Online (Sandbox Code Playgroud)

然后

U := "1111";
I := to_integer(U);
Run Code Online (Sandbox Code Playgroud)

导致I给出值15,而

S := "1111";
I := to_integer(S);
Run Code Online (Sandbox Code Playgroud)

结果在I被给定的值-1.这是因为该unsigned类型用于表示无符号数,只能是正数.因此,"1111"表示数字15. signed然而,类型也需要能够表示负数,并且signed类型"1111"表示-1(因为此类型使用二进制补码表示).

因此,您可以看到相同的函数 - to_integer在调用时返回两个不同的结果"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;
Run Code Online (Sandbox Code Playgroud)

然后

V:= "1111";
I := to_integer(V);
Run Code Online (Sandbox Code Playgroud)

你对这个to_integer功能有什么期望?15或-1?上述代码是非法的 - 这将无法编译,从而解决了这一难题.它不会编译,因为没有to_integer定义函数的版本std_logic_vector- to_integer函数没有为类型重载std_logic_vector.

所以,如果你只需要代表正数,你最好使用这个unsigned类型; 如果您需要表示负数,则需要使用该signed类型.如果你真的不在乎,因为你的比特模式不是一个数字,或者因为你没有做任何数学(你只是将它从一个地方运到另一个地方),那么你最好使用它std_logic_vector.

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