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