什么时候应该使用std_logic_vector,什么时候应该使用其他数据类型?

| 我是VHDL的新手,无法确定哪种数据类型适合在哪里使用。如果我理解正确,那么对于综合来说,应该将所有顶级实体端口声明为std_logic_vector或std_logic,并且绝不要声明任何其他类型。 但是std_logic_vector不支持算术运算,那么我应该如何处理呢? 我的直觉告诉我,我应该只在顶层使用std_logic_vector,然后在将其传递给其他实体时在整数数据类型之间进行转换。它是否正确? 在哪里使用什么整数数据类型(整数,无符号,有符号)?我了解有符号和无符号之间的区别,但是什么时候应该使用整数?     
已邀请:
        使用最适合您的建模目的的数据类型,包括端口。综上所述,您仅应将std_logic或std_logic_vector用于端口,这是完全不对的。不要相信那些会告诉您的信息。 如果需要带有算术支持的位向量,请考虑从ieee.numeric_std获得带符号/无符号。 (在VHDL 2008中,有一个标准程序包为std_logic_vector添加了算术支持,但我认为这很邪恶。) 当您要模拟合成的网表时,在合成后的最顶层可能只有一个问题。该网络列表的端口类型可能与您的顶级RTL接口不匹配。但是,您可以通过在此时进行适当的转换,轻松地在实例化门电平时对其进行修复。这是处理此类低级问题的适当时机-它们不应影响您的RTL建模样式。     
        我建议不要使用std_logic和std_logic_vector,除非您尝试对三态信号建模-我认为这是一种邪恶。而是使用无法解析的std_ulogic和std_ulogic_vector。这具有在编译期间检测对未解析信号的多个分配的优点。使用已解析的信号,您将在仿真或综合后期检测到该错误。 缺点:这个建议不是很常见,将std_logic与3rd-party逻辑结合使用可能需要进行一些类型转换。 对于std_ulogic_vector的算术运算,请使用std_numeric。然后需要在执行该操作之前将其强制转换为有符号或无符号,并将结果强制返回给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线束(或更精确的数组)。 整数类型是数字的数学表示。它们通常与泛型一起使用,生成循环和数组索引。但是有时候综合也可以用算术单位处理它们。     

要回复问题请先登录注册