“模板”VHDL实体

时间:2013-11-25 22:50:06

标签: vhdl generic-programming

这让我有一段时间的烦恼,但是有可能用VHDL描述类似于模板在C ++中工作的实体(或者用于较小的扩展泛型吗?)。只是将实际的端口类型保留为仅在合成/编译期间决定?

一个例子是多路复用器,比如我有一个4输入多路复用器,现在我有几个总线大小,我使用这个多路复用器,-4,6,7,8-。目前我为每种不同的总线大小写了一个不同的多路复用器;但是输出只是转发的所选输入之一,因此与总线的类型相同。

这似乎过于冗余且容易出错(在正确的时间选择正确的多路复用器,将它们全部保持一致,在更改总线大小时更新它们)。有没有办法参数化这个?

下面的非通用版本显示了这个想法。

entity mux_6bit_4input is
    port (  input_0 : in    std_logic_vector (5 downto 0);
        input_1 : in    std_logic_vector (5 downto 0);
        input_2 : in    std_logic_vector (5 downto 0);
        input_3 : in    std_logic_vector (5 downto 0);
        sel : in    std_logic_vector (1 downto 0);
        output  : out   std_logic_vector (5 downto 0)
    );
end entity mux_6bit_4input;

2 个答案:

答案 0 :(得分:5)

也许我误解了这个问题,但使用泛型的常见解决方案是否解决了你的问题呢?

library ieee;
use ieee.std_logic_1164.all;

entity mux_4x1 is
    generic (
        DATA_WIDTH: integer := 8
    );
    port (
        input_0: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_1: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_2: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_3: in std_logic_vector(DATA_WIDTH-1 downto 0);
        sel: in std_logic_vector (1 downto 0);
        output: out std_logic_vector(DATA_WIDTH-1 downto 0)
    );
end;

architecture behavior of mux_4x1 is
begin
    output <=
        input_0 when sel = "00" else
        input_1 when sel = "01" else
        input_2 when sel = "10" else
        input_3;
end;

另一种解决方案,如果你想保持真正通用的东西,就是在VHDL-2008中使用酷的泛型类型。我的模拟器还没有支持这个功能,所以这里有一本优秀的书VHDL 2008: Just the New Stuff的例子:

entity generic_mux2 is
    generic (type data_type);
    port (
        sel: in bit;
        a, b: in data_type;
        z: out data_type
    );
end;

architecture rtl of mux2 is
begin
    z <= a when sel = '0' else b;
end;

答案 1 :(得分:4)

另一种选择是使用无约束数组:

entity mux_4input is
    port ( 
        input_0 : in    std_logic_vector ;
        input_1 : in    std_logic_vector ;
        input_2 : in    std_logic_vector ;
        input_3 : in    std_logic_vector ;
        sel     : in    std_logic_vector (1 downto 0);
        output  : out   std_logic_vector
    );
end entity mux_4input;

它们将从它们在实例化实体中所连接的信号继承它们的宽度(和方向)。
在这个mux的特殊情况下,这可能不是正确的做法,rick的回答是我想要的,但是无约束的数组没有被提及太多,所以我想我会提供它们!在这种情况下,您可能还需要一些断言来确保您连接的所有内容都具有相同的宽度。