vhdl – unsigned和std_logic_vector之间的区别
谁能告诉我下面的书面陈述之间的区别.
signal A: **unsigned**(3 downto 0); signal B: **std_logic_vector**(3 downto 0); 解决方法
std_logic_vector和unsigned都是std_logic的无约束数组.与签名类型一样. 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; 然后 U := "1111"; I := to_integer(U); 导致我被赋予值15,而 S := "1111"; I := to_integer(S); 导致我被赋予值-1.这是因为无符号类型用于表示无符号数,只能是正数.因此,“1111”表示数字15.然而,签名类型也需要能够表示负数,并且带符号类型“1111”表示-1(因为此类型使用二进制补码表示) . 因此,您可以看到相同的函数 – to_integer – 在使用“1111”调用时返回两个不同的结果 – 15或-1,具体取决于参数是unsigned还是signed类型.因此,您可以看到两种类型的关键点,即使它们之间的唯一区别是它们的名称. 实际上,有两个to_integer函数,而不是一个.一个人采取无符号的论证;另一个(名称相同的to_integer)采用带符号的参数.如您所见,它们的行为方式不同.编译器可以根据参数的类型决定需要调用哪个函数.这种想法,编译器可以根据参数的类型在不同(但同名的函数)之间进行选择,称为重载.它在软件语言中很常见. 那么,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函数版本 – 对于std_logic_vector类型,to_integer函数没有重载. 因此,如果您只需要表示正数,那么最好使用无符号类型;如果您需要表示负数,则需要使用签名类型.如果你真的不在乎,因为你的位模式不是数字,或者因为你没有对它进行任何数学计算(你只是将它从一个地方运到另一个地方),那么你最好使用std_logic_vector. https://www.edaplayground.com/x/2Qq4 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |