Generics 如何简化VHDL中端口的泛型使用?
假设我有一个实体:Generics 如何简化VHDL中端口的泛型使用?,generics,vhdl,Generics,Vhdl,假设我有一个实体: entity myblock is port( input1 : std_logic_vector(15 downto 0); input2 : std_logic_vector(15 downto 0); input3 : std_logic_vector(15 downto 0); -- ... output : std_logic_vector(15 downto 0); )
entity myblock is
port(
input1 : std_logic_vector(15 downto 0);
input2 : std_logic_vector(15 downto 0);
input3 : std_logic_vector(15 downto 0);
-- ...
output : std_logic_vector(15 downto 0);
);
end myblock;
现在,我想将输入的大小设置为通用,因此我可能会执行以下操作:
entity myblock is
generic(
WIDTH : natural;
);
port(
input1 : std_logic_vector(WIDTH-1 downto 0);
input2 : std_logic_vector(WIDTH-1 downto 0);
input3 : std_logic_vector(WIDTH-1 downto 0);
-- ...
output : std_logic_vector(WIDTH-1 downto 0);
);
end myblock;
理想情况下,我想简化一下,比如:
subtype calc_data is std_logic_vector(WIDTH-1 downto 0);
port(
input1 : calc_data;
input2 : calc_data;
input3 : calc_data;
-- ...
output : calc_data;
);
在这种情况下,这是一个非常简单的例子,好处并不巨大。不过,在更复杂的情况下,这确实会有所帮助
这在VHDL中是否可行?您可以使用单一类型规范命名多个端口:
entity myblock is
generic(
WIDTH : natural;
);
port(
input1, input2, input3 : in std_logic_vector(WIDTH-1 downto 0);
-- ...
output : out std_logic_vector(WIDTH-1 downto 0);
);
end myblock;
您可以使用单一类型规范命名多个端口:
entity myblock is
generic(
WIDTH : natural;
);
port(
input1, input2, input3 : in std_logic_vector(WIDTH-1 downto 0);
-- ...
output : out std_logic_vector(WIDTH-1 downto 0);
);
end myblock;
当输入仅仅是向量时,通常使用选项2(通用)
如果您的子类型用于承载“对读者的意义”(而不仅仅是“宽度信息”),则将该子类型存储在包中
另一种选择是使用std_logic_vector
,而不指定宽度,并使宽度从较高级别向下传播
(有一个关于VHDL的新迭代的建议,您可能会对此感兴趣)当输入只是向量时,通常使用选项2(通用)
如果您的子类型用于承载“对读者的意义”(而不仅仅是“宽度信息”),则将该子类型存储在包中
另一种选择是使用std_logic_vector
,而不指定宽度,并使宽度从较高级别向下传播
(有一个关于VHDL的新迭代的建议,你可能会觉得很有趣)嗯,我已经忘记了。帮了我一个忙,我忘了。这是一个帮助。包中的子类型怎么可能是泛型的?通常有意义的子类型不是泛型的-所以你有
子类型地址\u总线:std\u逻辑\u向量(23到0)代码>。使用VHDL 2008,您可以在包中包含泛型,并将它们传播到typesHmm。如果我有一个有意义的子类型,我不能对实体的不同实例有不同的值,但我想这就是你在这里说的,对吗?(另外,我认为Xilinx的工具链还不支持2008年的东西,这就是我正在使用的。)是的,每个实体定义一个子类型,所以你不能每个实例更改它:(包中的子类型怎么可能是泛型的?通常有意义的子类型不是泛型的-所以你有子类型地址\总线:std \逻辑\向量(23到0);
。使用VHDL 2008,您可以在包中包含泛型,并将它们传播到typesHmm。如果我有一个有意义的子类型,我不能为实体的不同实例提供不同的值,但我认为这就是您在这里说的,对吗?(另外,我认为Xilinx的工具链还不支持2008之类的东西,这就是我正在使用的。)是的,每个实体定义一个子类型,因此您不能更改每个实例的子类型:(