我应该何时使用std_logic_vector,何时应该使用其他数据类型?

时间:2011-05-27 17:23:17

标签: integer port vhdl unsigned signed

我是VHDL的新手,无法确定哪些数据类型适合在哪里使用。如果我理解正确,对于综合,所有顶级实体端口都应该声明为std_logic_vector或std_logic,而不是任何其他类型。

但是std_logic_vector不支持算术,所以我该如何处理呢?

我的直觉告诉我,我应该在顶层使用std_logic_vector,然后在将其传递给其他实体时将其转换为整数数据类型。这是对的吗?

应该在哪里使用积分数据类型(整数,无符号,有符号)?我理解有符号和无符号之间的区别,但什么时候应该使用整数?

3 个答案:

答案 0 :(得分:17)

使用最适合您建模目的的数据类型,包括端口。合成要求您只应将std_logic或std_logic_vector用于端口,这是不正确的。不要相信那些告诉你的人。

如果需要具有算术支持的位向量,请考虑从ieee.numeric_std签名/取消签名。 (在VHDL 2008中,有一个标准包可以为std_logic_vector添加算术支持,但我认为这很邪恶。)

当您想要模拟合成网表时,在合成之后的最顶层可能只会出现问题。该网表的端口类型可能与您的顶级RTL接口不匹配。但是,在实例化门级时,您可以通过在此时进行适当的转换来轻松修复。这是这种低级别问题的适当时机 - 它们不应影响您的RTL建模风格。

答案 1 :(得分:2)

我建议不要使用std_logic和std_logic_vector,除非你试图模拟三态信号 - 我认为这是一种邪恶。而是使用未解析的std_ulogic和std_ulogic_vector。这有利于在编译期间检测对未解析信号的多个分配。使用已解析的信号,您可以在模拟或合成的后期检测到该错误。

缺点:这个建议不常见,使用std_logic的第三方逻辑可能需要一些类型转换。

对于std_ulogic_vector的算术,请使用std_numeric。然后需要在操作之前强制转换为signed或unsigned,并将结果转换回std_ulogic_vector。对于未解析的信号,没有标准的ieee.std_ulogic_unsigned库。

adder_result <= std_ulogic_vector( unsigned(operant1) + unsigned(operant2) ) ;
increment <= std_ulogic_vector( unsigned(operant) + 1 ) ;

整数,自然,正面和无符号以及另一面签名之间的差异是表示。 有符号和无符号是std_logic_vector的子类型,更像是std_logic连接的包(或更精确的数组)。

整数类型是数字的数学表示。它们通常用于泛型,生成循环和数组索引。但有时合成也可以为算术单元处理它们。

答案 2 :(得分:0)

总的来说,关于使用适当类型进行建模的评论是正确的(Jan Decaluwe)。然而,它有一个大问题。如果您正在进行混合语言开发(结合 VHDL、Verilog/System Verilog),您需要注意语言边界。一些工具对跨越语言障碍时使用的信号类型有很大的限制。

我目前正在查看 Vivado 2019 综合用户指南 (UG901),其中列出了您可以在交叉点使用的类型。您需要查看您的工具链。