【问题标题】:VHDL use dependent generic type in port specificationVHDL 在端口规范中使用依赖的泛型类型
【发布时间】:2019-10-16 18:05:36
【问题描述】:

我想要一个包含依赖泛型的类型的包,以便我可以在项目中使用它们。但是我在端口声明中使用这些依赖类型时遇到了问题:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


package dependent_types is
    generic (generic_value : natural);

    subtype dependent_type is std_ulogic_vector (generic_value - 1 downto 0);
end package;


use work.all;

entity dependent_entity_with_dependent_port is
    generic (generic_value : natural);

    package instantiated_types is new dependent_types
        generic map (generic_value => generic_value);
    use instantiated_types.all;

    port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;

似乎实体声明部分(包实例化、使用子句)必须在端口声明之后。这可以防止使用在依赖于实体泛型的泛型包中定义的类型。

有什么办法可以做到吗?

【问题讨论】:

  • 您依赖的是子类型而不是类型。 IEEE Std 1076-2008 6.5.5 接口包声明“接口包声明声明了一个接口包显示为设计实体的通用、组件、块、包或子程序。 "但是,这里不需要。 dependent_port 的子类型可以从 generic_value 构造 - library ieee; use ieee.std_logic_1164.all; entity with_dependent_port is generic ( generic_value: positive); port ( dependent_port: out std_ulogic_vector(generic_value - 1 downto 0)); end entity;
  • 您还可以注意到,实例化包的声明不同于任何其他实例化。尽管有名称,但这种包实例化中的类型声明在端口关联的两侧不会是相同的类型。抽象出类型的正确方法是使用泛型类型,它映射到子类型(并且可以具有兼容的约束以及某些类型)。一般来说,泛型类型不受支持,泛型包在综合中也不受广泛支持。
  • 泛型类型 - 唯一的接口类型声明 (6.5.3) 提供类型的基本和预定义操作。 “块语句(包括表示组件实例或绑定设计实体的隐含块语句)、通用映射包或通用映射子程序的接口类型声明的名称表示指定为相应实际的子类型通用关联列表。”不幸的是,综合工具没有广泛支持(如果有的话)接口类型声明。

标签: generics vhdl


【解决方案1】:

我认为不可能做你想做的事 - 将包泛型设置为普通泛型,然后将其用作端口。但是,您可以在这样的包中使用 延迟常量

这段代码编译一次,稳定:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package dependent_types is
    generic (generic_value : natural);
    subtype dependent_type is std_ulogic_vector (generic_value - 1 downto 0);
end package;

package constants is
  constant generic_value : natural;
end package;

然后每次常量更改时都需要重新编译这段代码:

package body constants is
  constant generic_value : natural := 16;
end package body ;

use work.all;
use work.constants.all;
package instantiated_types is new dependent_types
    generic map (generic_value => generic_value);

use work.instantiated_types.all;
entity dependent_entity_with_dependent_port is
    port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;

architecture A of dependent_entity_with_dependent_port is
begin
end;

https://www.edaplayground.com/x/3vfd

【讨论】:

  • VHDL 2008 允许将包作为泛型。所以你应该能够从通用包中取出任何东西。 (不过不要认为有很多工具支持。ActiveHDL 11.1 最终发布时会有它。)
  • 包实例化是主要单元 (13.1),在 use instantiated_types.all; 之前显示一个新行(不应该是 work.instantiated_types.all 以及是什么让 dependent_typespackage instantiated_types is new dependent_types 中可见?Riviera Pro似乎采用 13.2 设计库的诗意许可“除了上下文声明和包 STANDARD 之外的每个设计单元都假定包含以下隐式上下文项作为其上下文子句的一部分:library STD、WORK;use STD.STANDARD.all;" 添加隐式使用子句use work.all;。可移植性问题。
  • @user1155120 已修复。
  • @user1155120 我也注意到 ActiveHDL 中的“诗意许可”,但似乎在 11.1 中收紧(目前处于预发布阶段)
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多