【问题标题】:When should I use std_logic_vector and when should I use other data types?什么时候应该使用 std_logic_vector,什么时候应该使用其他数据类型?
【发布时间】:2011-09-03 13:59:10
【问题描述】:

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

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

我的直觉告诉我,我应该简单地在顶层使用 std_logic_vector,然后在将其传递给其他实体时将其与整数数据类型相互转换。这是正确的吗?

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

【问题讨论】:

    标签: integer port vhdl unsigned signed


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我建议不要使用 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 ) ;
      

      integer,natural,positive 一方面与 unsigned 和signed 之间的区别在于表示。 有符号和无符号是 std_logic_vector 的子类型,更像是 std_logic 线束(或更精确的数组)。

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 那么用整数也没什么问题吧?
        • @Emil。没错(当然是受约束的整数子类型)。但是,整数在实践中具有(令人不安的)32 位限制,这意味着您可能更喜欢无符号/有符号,例如如果您担心参数化或一致性。
        • Nitpick(我知道 Jan 知道这一点,但为了完整性我会指出):标准保证整数是“不完全是 32 位”——它们来自 -((2 31)-1) 到 +((231)-1)。许多供应商确实提供完整的 int32_t 范围,但不能保证:(
        • 你认为 VHDL 2008 标准包是……邪恶的吗?!如果有,为什么?
        猜你喜欢
        • 2023-04-02
        • 2011-04-15
        • 2017-04-10
        • 2012-03-19
        • 2018-05-12
        • 2018-12-11
        • 1970-01-01
        • 2022-09-28
        • 2021-09-07
        相关资源
        最近更新 更多