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中可能吗?

4

2 回答 2

3

您可以使用单一类型规范命名多个端口:

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;
于 2012-09-14T01:25:04.297 回答
1

当输入只是向量时,通常使用选项 2(通用)

如果您的子类型用于携带“对读者的意义”(而不仅仅是“宽度信息”),则将该子类型存储在一个包中。

另一种选择是在std_logic_vector没有宽度规范的情况下使用,并让宽度从更高级别向下传播。

(有一个针对匿名类型的 VHDL 新迭代的提议,您可能会觉得这很有趣)

于 2012-09-14T10:11:05.967 回答