&引用;模板";VHDL实体 这有相当长的一段时间我有窃听,但是有可能在VHDL中描述类似于模板如何工作在C++中(或更小的泛型?)的实体。只需在合成/编译期间决定实际的端口类型

&引用;模板";VHDL实体 这有相当长的一段时间我有窃听,但是有可能在VHDL中描述类似于模板如何工作在C++中(或更小的泛型?)的实体。只需在合成/编译期间决定实际的端口类型,vhdl,generic-programming,Vhdl,Generic Programming,一个例子是一个多路复用器,假设我有一个4输入多路复用器,现在我有几个总线大小,我使用这个多路复用器,-4,6,7,8-。目前,我为每个不同的总线大小编写了一个不同的多路复用器;然而,输出仅仅是所选的一个转发输入,因此与总线类型相同 这似乎过于冗余和容易出错(在正确的时间选择正确的多路复用器,使它们保持一致,在我更改总线大小时更新它们)。没有办法将其参数化吗 下面的非通用版本显示了该想法 entity mux_6bit_4input is port ( input_0 : in s

一个例子是一个多路复用器,假设我有一个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;

也许我误解了这个问题,但使用泛型的通用解决方案难道不能解决您的问题吗

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;
ieee库;
使用ieee.std_logic_1164.all;
实体mux_4x1是
一般的(
数据宽度:整数:=8
);
港口(
输入0:标准逻辑向量(数据宽度-1向下至0);
输入1:标准逻辑向量(数据宽度-1向下至0);
输入2:标准逻辑向量(数据宽度-1向下至0);
输入3:标准逻辑向量(数据宽度-1向下至0);
sel:标准逻辑向量(1到0);
输出:输出标准逻辑向量(数据宽度-1到0)
);
结束;
mux_4x1的架构行为是
开始

输出另一个选项是使用无约束数组:

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的答案是我想要的,但无约束数组并没有被提及太多,所以我想我会提供它们!在这种情况下,您可能还需要一些断言,以确保连接的所有内容都具有相同的宽度。

我喜欢此解决方案。无约束数组通常是同时保持代码通用性和干净性的最佳方法。我不知道这是可能的,谢谢Martin。使用这样的无约束数组时要避免什么陷阱?@Russell:我已经提到了一个问题-如果你有多个东西需要相同的宽度,那么
通用方法意味着你不必把你自己的断言放进去。另一个是,如果你想对一个子模块进行试合成,你必须为它创建一个包装器,告诉合成器你想试用的端口有多宽。除此之外,在过去几年里,当我开始做这件事的时候,我没有遇到任何问题。它可能不用于合成,所以没有得到太多的使用,所以一些教科书没有讨论它,所以它没有被使用:)你说你的模拟器不支持这个。合成器的支持也很重要,还是在合成过程中忽略了类型?我使用Modelsim ASE 10.1b进行模拟,使用Quartus II 12.1进行合成。这些版本不支持泛型类型,尽管这两种工具最终可能都会支持。关于您的注释,请注意类型不是“忽略”的,您只是有机会在稍后组件实例化时指定它。合成器的支持在IMO中也很重要,在这种情况下,这应该不会太难;不管你是模拟器还是合成器,你所要做的就是用实际的类型替换泛型类型。忽略我的意思是,就像合成器忽略延迟一样,可能合成器也忽略了所有类型信息,只是使用最小的总线大小。(它不是已经忽略了一半的std_逻辑信息了吗?)不是的,这些类型是真正通用的:相同的代码将用于您创建的std_逻辑向量、整数、自定义数据类型,您可以命名它们。区别不仅仅在于巴士的大小。如果有必要,合成器将为每种类型创建不同的实现。
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;