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之类的东西,这就是我正在使用的。)是的,每个实体定义一个子类型,因此您不能更改每个实例的子类型:(