自定义类型为VHDL 2008泛型

自定义类型为VHDL 2008泛型,vhdl,Vhdl,我想使用VHDL-2008在我的实体的generic部分创建一个自定义类型。然而,我得到了一个错误立即在Modelsim与此代码。错误是: **错误:C:/Projects/source/My_Mux.vhd(35):接近“is”:应为“;”或‘’ 请注意,第35行是下面的类型t_数组: entity My_Mux is generic ( g_MUX_INPUTS : integer := 2; type t_Array is array (0 to g_MUX_INPUT

我想使用VHDL-2008在我的
实体的
generic
部分创建一个自定义类型。然而,我得到了一个错误立即在Modelsim与此代码。错误是:

**错误:C:/Projects/source/My_Mux.vhd(35):接近“is”:应为“;”或‘’

请注意,第35行是下面的
类型t_数组

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;
实体我的Mux是
一般的(
g_MUX_输入:整数:=2;
类型t_数组是标准逻辑向量(7到0)的数组(0到g_MUX_输入-1)
);
港口(
i_选择:在标准逻辑向量中(1到0);
i_Mux_数据:在t_数组中;
o_数据:输出标准逻辑向量(7到0)
);
结束实体My_Mux;
My_Mux的体系结构RTL是
开始

o_Data如果一个类型的声明实际上是在泛型声明中进行的,那么您希望在正式声明和实际声明之间具有类型兼容性吗

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

如何声明泛型类型见IEEE Std 1076-2008 6.5.3接口类型声明:

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

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

接口\u不完整\u类型\u声明::=类型标识符

接口类型为环境提供了一种方法,用于确定用于描述特定部分中对象的类型。接口类型的值集和适用操作可由环境中的关联子类型确定。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;
上面的两个示例按顺序进行了分析,并进行了详细阐述,测试台进行了模拟(但除了告诉我们子类型约束传递到实际端口之外,没有做任何特别有趣的事情)

组件或实体实例化和端口实际声明位置都需要可以访问自定义类型

使用泛型类型将允许您从
my\u mux
上下文子句中删除
my\u package
use子句,这取决于实际关联


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

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

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

如何声明泛型类型见IEEE Std 1076-2008 6.5.3接口类型声明:

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

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

接口\u不完整\u类型\u声明::=类型标识符

接口类型为环境提供了一种方法,用于确定用于描述特定部分中对象的类型。接口类型的值集和适用操作可由环境中的关联子类型确定。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;
上面的两个示例按顺序进行了分析,并进行了详细阐述,测试台进行了模拟(但除了告诉我们子类型约束传递到实际端口之外,没有做任何特别有趣的事情)

组件或实体实例化和端口实际声明位置都需要可以访问自定义类型

使用泛型类型将允许您从
my\u mux
上下文子句中删除
my\u package
use子句,这取决于实际关联


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

我最终使用包方法解决了这个问题。谢谢你的详细回答,这是非常有益的。我最终使用包的方法来解决这个问题。谢谢你的详细回答,内容非常丰富。