加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

vhdl – unsigned和std_logic_vector之间的区别

发布时间:2020-12-15 04:39:19 所属栏目:Java 来源:网络整理
导读:谁能告诉我下面的书面陈述之间的区别. 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包中声明; unsig
谁能告诉我下面的书面陈述之间的区别.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读