【问题标题】:usage of VHDL genericsVHDL泛型的使用
【发布时间】:2020-03-23 12:38:54
【问题描述】:

我正在学习 VHDL,但我还不了解如何正确使用泛型。假设我需要使用具有可变位数的 2:1 MUX 来描述不同的多路复用器。我们称这个参数为 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:1 8 位 MUX,即 p = 8 或者可能是一个 5:1 MUX,在 1 位上使用四个 2:1 MUX。所以基本上,我想创建另一个文件并轻松使用此代码,仅在第一种情况下声明 p 的值,在第二种情况下仅声明更多内容。我怎么做?

【问题讨论】:

  • 我希望您意识到,真正的 HDL 设计中没有人会以这种方式使用 MUX。这仅在教育中进行。在实际设计中,您只需使用 if 语句。

标签: generics vhdl


【解决方案1】:

所有的魔法都发生在实例(组件或实体)中。假设您已经在要创建不同大小的多路复用器的地方完成了组件声明:

-- 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) ; 

【讨论】:

  • 所以基本上,我仍然需要手动重新定义端口,即使它依赖于 p 并且我不需要更多的输入/输出?
  • 重新定义不是正确的词。您确实需要单独“连接”组件/实体实例化中的所有端口,即使它们不依赖于泛型。
  • 扩展@Plebala 的想法。实体端口就像芯片上的引脚。名称 A8、B8、Mux8Sel 和 MuxOut8 是板上将芯片连接到其他东西的电线。
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多