自定义类型为VHDL 2008泛型
我想使用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
实体的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中的包实例化和它自己的泛型)。我最终使用包方法解决了这个问题。谢谢你的详细回答,这是非常有益的。我最终使用包的方法来解决这个问题。谢谢你的详细回答,内容非常丰富。