unsigned和std_logic_vector之间的区别

时间:2017-06-15 04:43:28

标签: vhdl fpga

任何人都可以告诉我下面的书面陈述之间的区别。

signal A: **unsigned**(3 downto 0);
signal B: **std_logic_vector**(3 downto 0);

1 个答案:

答案 0 :(得分:7)

std_logic_vectorunsigned都是<{1}}的无约束数组。和std_logic类型一样。 signed包中声明了std_logic_vector; std_logic_1164unsigned在包signed中声明。这三种类型都是相同的;唯一的区别是他们的名字。

那么,重点是什么?这一点很好地通过一个例子来说明:

使用

numeric_std

然后

variable U : unsigned(3 downto 0);
variable S : signed(3 downto 0);
variable I : integer;

导致U := "1111"; I := to_integer(U); 被赋予值15,而

I

导致S := "1111"; I := to_integer(S); 的值为-1。这是因为I类型用于表示无符号号码,该号码只能是正数。因此,unsigned表示数字15.但"1111"类型也需要能够表示负数,而signed类型signed表示-1 (因为此类型使用二进制补码表示。)

因此,您可以看到相同的函数 - "1111" - 在使用to_integer调用时返回两个不同的结果 - 15或-1,具体取决于参数是否为"1111"类型或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); 函数的期望是什么? 15或-1?上述代码是非法的 - 这将无法编译,从而解决了这一难题。它不会编译,因为没有为to_integer定义的to_integer函数的版本 - std_logic_vector函数没有为类型to_integer重载。

因此,如果您只需要表示正数,则最好使用std_logic_vector类型;如果您需要表示负数,则需要使用unsigned类型。如果你真的不在乎,因为你的比特模式不是一个数字,或者因为你没有对它进行任何数学计算(你只是将它从一个地方运到另一个地方),那么你最好使用{{1 }}

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