如果类型的声明实际上是在泛型声明中进行的,那么您如何期望在正式和实际之间具有类型兼容性?
VHDL 中的每个声明都是唯一的,不是通过名称而是通过声明出现。名称引用的声明取决于范围和可见性。使用名称的两个(所有)地方都必须能够达到相同的声明。
如何声明泛型类型可在 IEEE Std 1076-2008 6.5.3 接口类型声明中找到:
接口类型声明声明的接口类型显示为设计实体、组件、块、包或子程序的泛型。
interface_type_declaration ::=
interface_incomplete_type_declaration
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;
添加了一个包含类型声明 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;
上面的两个示例按顺序分析,详细说明和测试台模拟(除了告诉我们在实际端口上传递子类型约束之外,没有做任何特别有趣的事情)。
组件或实体实例化以及声明实际端口的位置都需要可以访问自定义类型。
使用泛型类型将允许您从 my_mux 上下文子句中删除 my_package use 子句,而改为依赖实际关联。
您还可以在细化时绑定类型,而无需切换包(或依赖 -2008 中的包实例化及其自己的泛型)。