自定义类型为 VHDL 2008 通用

Rus*_*ell 1 vhdl

generic我想在使用 VHDL-2008的部分中创建自定义类型entity。但是我在 Modelsim 中使用此代码立即收到错误。错误是:

** 错误:C:/Projects/source/My_Mux.vhd(35):靠近“is”:期待“;” 或者 ')'

请注意,第 35 行如下type t_Array

entity My_Mux is
  generic (
    g_MUX_INPUTS : integer := 2;
    type t_Array is array (0 to g_MUX_INPUTS-1) of std_logic_vector(7 downto 0)
    );
  port (
    i_Select   : in std_logic_vector(1 downto 0);
    i_Mux_Data : in t_Array;
    o_Data     : out std_logic_vector(7 downto 0)
    );
end entity My_Mux;

architecture RTL of My_Mux is

begin

  o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);

end architecture RTL;
Run Code Online (Sandbox Code Playgroud)

我考虑创建一个在代码的通用部分中定义的特殊函数。但这需要我重载实例化模块中的函数,我真的不想这样做,这似乎不必要地复杂。如果我可以在泛型中创建自定义类型,它将解决我的问题。可以使用VHDL-2008吗?

小智 5

如果类型声明实际上是在泛型声明中进行的,您如何期望形式声明和实际声明之间具有类型兼容性?

VHDL 中的每个声明都是唯一的,不是通过名称而是通过声明的出现来实现的。名称引用的声明取决于范围和可见性。使用名称的两个(所有)位置都必须能够达到相同的声明。

泛型类型的声明方式可参见 IEEE Std 1076-2008 6.5.3 接口类型声明:

接口类型声明声明一个接口类型,该接口类型显示为设计实体、组件、块、包或子程序的泛型。

接口类型声明 ::=
      接口不完整类型声明

interface_incomplete_type_declaration ::=类型标识符

接口类型为环境提供了一种方法来确定描述的特定部分中的对象所使用的类型。接口类型的值和适用操作的集合可以由环境中的关联子类型确定。建立此类关联的方式在 6.5.7 中描述。

需要注意的重要一点是,这是一个不完整的类型声明,其中实际指定了具有子类型约束的预先存在的类型(6.5.6.2):

泛型类型表示的子类型由泛型关联列表中相应的实际值指定。如果没有为给定的正式泛型类型指定此类实际值(或者因为正式泛型未关联,或者因为实际值是开放的),则这是一个错误。

因为该关联与先前声明的类型相关,所以与使用 -1993 方式执行相同的操作几乎没有什么区别:

library ieee;
use ieee.std_logic_1164.all;

package my_package is
    type my_array is array (natural range <>) of std_logic_vector(7 downto 0);
end package;

library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;

entity My_Mux is
    generic (
        g_MUX_INPUTS:  integer := 2
        --type t_Array is array (0 to g_MUX_INPUTS-1) of 
                -- std_logic_vector(7 downto 0)
    );
    port (
        i_Select:    in  std_logic_vector(1 downto 0);
        -- i_Mux_Data:  in t_Array;
        i_Mux_Data:  in  my_array (0 to g_MUX_INPUTS - 1);
        o_Data :     out std_logic_vector(7 downto 0)
    );
end entity My_Mux;

architecture RTL of My_Mux is

begin

    o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);

end architecture RTL;
Run Code Online (Sandbox Code Playgroud)

添加了一个具有类型声明的包,my_array该类型声明是未绑定(部分约束)的多维数组类型。

这允许使用包my_package来指定实际的类型:

library ieee;
use ieee.std_logic_1164.all;
use work.my_package.all;

entity my_mux_tb is
end entity;

architecture foo of my_mux_tb is
    constant MUX_INPUTS:    natural := 2;
    signal i_Select:    std_logic_vector (1 downto 0);
    signal i_Mux_Data:  my_array (0 to MUX_INPUTS -1);
    signal o_Data:      std_logic_vector(7 downto 0);
begin
DUT:
    entity work.My_mux 
        generic map (
            g_MUX_INPUTS => MUX_INPUTS
        )
        port map (
            i_Select => i_Select,
            i_Mux_Data => i_Mux_Data,
            o_Data => o_Data
        );
end architecture;
Run Code Online (Sandbox Code Playgroud)

上面的两个示例按顺序进行了分析、详细说明和测试平台模拟(除了告诉我们子类型约束在实际端口上传递之外,没有做任何特别有趣的事情)。

自定义类型需要能够被组件或实体实例化以及声明端口实际的位置访问。

my_package使用泛型类型将允许您从上下文子句中删除use 子句my_mux,而是依赖于实际的关联。

您还可以在精化时绑定类型,而无需切换包(或依赖 -2008 中的包实例化及其自己的泛型)。