pau*_*l23 3 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;
Run Code Online (Sandbox Code Playgroud)
也许我误解了这个问题,但使用泛型的常见解决方案是否解决了您的问题?
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;
Run Code Online (Sandbox Code Playgroud)
另一个解决方案,如果你想保持真正的通用,就是在VHDL-2008中使用酷的泛型类型.我的模拟器还不支持这个功能,所以这里有一本优秀的书VHDL 2008的例子:新的东西:
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;
Run Code Online (Sandbox Code Playgroud)