我应该在什么时候使用std_logic_vvector,什么时候使用其他数据类型



我是VHDL的新手,很难弄清楚哪些数据类型适合在哪里使用。如果我理解正确的话,对于合成,所有顶级实体端口都应该声明为std_logic_vvector或std_logic,而不是任何其他类型。

但是std_logic_vvector不支持算术,那么我应该如何处理呢?

我的直觉告诉我,我应该简单地在顶层使用std_logic_vvector,然后在将其传递给其他实体时将其转换为积分数据类型或从积分数据类型转换而来。这是正确的吗?

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

使用最适合建模目的的数据类型,包括端口。合成要求您只对端口使用std_logic或std_logic_vvector,这根本不是真的。不要相信那些告诉你的。

如果您需要具有算术支持的位向量,请考虑ieee.numeric_std中的有符号/无符号。(在VHDL 2008中,有一个标准包为std_logic_vvector添加了算术支持,但我认为这很糟糕。)

当您想模拟合成的网络列表时,可能只有在合成后的最顶层才会出现问题。该网络列表的端口类型可能与您的顶级RTL接口不匹配。但是,在实例化门级别时,通过在该时刻进行适当的转换,可以很容易地解决这个问题。这是处理这种低级问题的合适时机——它们不应该影响您的RTL建模风格。

我建议不要使用std_logic和std_logic_vvector,除非你试图对三态信号进行建模——我认为这是一种邪恶。而是使用未解析的std_ulogic和std_ulogic_vector。这具有在编译期间检测对未解析信号的多个分配的优点。有了解决的信号,你会在模拟或合成的后期发现错误。

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

对于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_vvector的子类型,更像是std_logic导线的束(或更精确的数组)。

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

通常,关于使用适当类型进行建模的注释是正确的(Jan Decauwe)。然而,有一个大问题。如果你正在进行混合语言开发(结合VHDL、Verilog/System-Verilog),你需要小心语言边界。一些工具对跨越语言障碍时使用的信号类型有很大的限制。

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

相关内容

  • 没有找到相关文章

最新更新