Generics VHDL泛型的使用

Generics VHDL泛型的使用,generics,vhdl,Generics,Vhdl,我正在学习VHDL,但还不知道如何正确使用泛型。让我们假设我需要描述不同的多路复用器,它使用具有可变位数的2:1多路复用器。我们称这个参数为p。 这是一个示例代码。在这个上下文中,这个代码并不重要 library ieee; use ieee.std_logic_1164.all; entity mux2to1_gen is generic ( p : POSITIVE := 1 ); port ( x,y : in std_logic_vector ( p-1 dow

我正在学习VHDL,但还不知道如何正确使用泛型。让我们假设我需要描述不同的多路复用器,它使用具有可变位数的2:1多路复用器。我们称这个参数为p。 这是一个示例代码。在这个上下文中,这个代码并不重要

library ieee;
use ieee.std_logic_1164.all;

entity mux2to1_gen is
generic ( p : POSITIVE := 1 );    
port ( 
       x,y : in std_logic_vector ( p-1 downto 0 );  
       s : in std_logic;    
       m : out std_logic_vector ( p-1 downto 0 )
);
end mux2to1_gen;


architecture logic of mux2to1_gen is
     signal s_vector : std_logic_vector ( p-1 downto 0 );   
begin
     s_vector <= ( others => s ); 
     m <= (NOT (s_vector) AND x) OR (s_vector AND y);   
end architecture;


我想用这段代码轻松创建一个2:18位的多路复用器,即p=8,或者可能是一个5:1的多路复用器,在1位上使用4个2:1的多路复用器。因此,基本上,我想创建另一个文件,并轻松地使用此代码,在第一种情况下仅声明p的值,在第二种情况下仅声明更多值。我该怎么做

所有的魔力都发生在实例组件或实体中。假设您已经在要创建不同大小多路复用器的位置进行了组件声明:

-- Create 8:1 Mux
Mux8_1 : mux2to1_gen 
  generic map (p => 8 )
  port map (x => A8, y => B8, s => Mux8Sel, m => MuxOut8) ; 

-- Create 5:1 Mux
Mux5_1 : mux2to1_gen 
  generic map (p => 5 )
  port map (x => X5, y => Y5, s => Mux5Sel, m => MuxOut5) ; 
上述方法使用了一般首选的命名关联方法。您还可以按如下所示位置关联端口,但这会使设计更难维护和查看。请记住,大多数代码都是由一个人编写的,但会有很多人(包括进行下一次修订的人)审阅,因此命名关联会增加设计捕获的工作量,但会减少总体工作量

-- Create 8:1 Mux
Mux8_1 : mux2to1_gen 
  generic map (8 )
  port map (A8, B8, Mux8Sel, MuxOut8) ; 

所有的魔力都发生在实例组件或实体中。假设您已经在要创建不同大小多路复用器的位置进行了组件声明:

-- Create 8:1 Mux
Mux8_1 : mux2to1_gen 
  generic map (p => 8 )
  port map (x => A8, y => B8, s => Mux8Sel, m => MuxOut8) ; 

-- Create 5:1 Mux
Mux5_1 : mux2to1_gen 
  generic map (p => 5 )
  port map (x => X5, y => Y5, s => Mux5Sel, m => MuxOut5) ; 
上述方法使用了一般首选的命名关联方法。您还可以按如下所示位置关联端口,但这会使设计更难维护和查看。请记住,大多数代码都是由一个人编写的,但会有很多人(包括进行下一次修订的人)审阅,因此命名关联会增加设计捕获的工作量,但会减少总体工作量

-- Create 8:1 Mux
Mux8_1 : mux2to1_gen 
  generic map (8 )
  port map (A8, B8, Mux8Sel, MuxOut8) ; 

我希望你能意识到,在真正的HDL设计中,没有人会以这种方式使用多路复用器。只有在教育中才能做到这一点。在真正的设计中,你只需要使用if语句。我希望你意识到,在真正的HDL设计中,没有人会以这种方式使用多路复用器。只有在教育中才能做到这一点。在实际设计中,您只需要使用if语句。因此,基本上,我仍然需要手动重新定义端口,即使它依赖于p,并且我不需要更多的输入/输出?重新定义不是正确的词。您确实需要单独连接组件/实体实例化中的所有端口,即使它们不依赖于generic.expansing on@Plebala thinks。实体端口就像芯片上的引脚。名称A8、B8、Mux8Sel和MuxOut8是板上连接芯片与其他设备的导线。因此,基本上,我仍然需要手动重新定义端口,即使它依赖于p,并且我不需要更多输入/输出?重新定义不是正确的词。您确实需要单独连接组件/实体实例化中的所有端口,即使它们不依赖于generic.expansing on@Plebala thinks。实体端口就像芯片上的引脚。名称A8、B8、Mux8Sel和MuxOut8是板上连接芯片与其他设备的导线。