2011-05-27 79 views
13

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

但std_logic_vector不支持算术所以我应该怎么处理呢?

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

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

回答

16

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

如果您需要算法的支持位向量,考虑签署/自ieee.numeric_std签名。 (2008年VHDL,有一个标准包,增加了std_logic_vector算法的支持,但我认为邪恶。)

有可能只在非常顶级问题后合成,当你想模仿综合网表。该网络列表的端口类型可能与您的顶级RTL接口不匹配。但是,在实例化门级别时,可以通过在那一刻进行正确的转换来轻松修复该问题。对于这样的低级问题,这是适当的时机 - 它们不应该影响您的RTL建模风格。

+0

那么只要使用整数也没有问题呢? – 2011-05-29 09:49:04

+0

@Emil。这是正确的(当然受到限制的整数子类型)。但是,整数在实践中有一个(令人烦恼的)32位限制,这意味着您可能更喜欢无符号/有符号的例如如果你担心参数化或一致性。 – 2011-05-29 10:05:40

+4

Nitpick(我知道扬知道这一点,但我会指出它的完整性):整数由标准保证是“不完全32位” - 他们从 - ((2 ** 31)-1)到+((2 ** 31)-1)。许多供应商确实提供了完整的int32_t范围,但不能保证:( – 2011-05-30 16:15:12

1

我建议,除非您尝试三态信号模式,不使用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线束(或更精确的数组)。

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

相关问题