谁能告诉我下面的书面陈述之间的区别.
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_vector
和unsigned
是不受约束阵列的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;
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