использование VHDL дженериков - PullRequest
1 голос
/ 23 марта 2020

Я изучаю VHDL и еще не понял, как правильно использовать дженерики. Давайте предположим, что мне нужно описать различные мультиплексоры, используя MUX 2: 1 с переменным количеством битов. Давайте назовем этот параметр р. Это пример кода (этот код не имеет большого значения в этом контексте)

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;

Я хотел бы использовать этот код для простого создания 8: 1-битного MUX 2: 1, т.е. p = 8 или, может быть, 5: 1 MUX, используя четыре 2: 1 MUX на 1 бит. В общем, я хочу создать другой файл и легко использовать этот код, объявляя только значение p в первом случае и просто что-то большее во втором. Как я могу это сделать?

1 Ответ

3 голосов
/ 23 марта 2020

Все волхвы c происходит в экземпляре (компонент или сущность). Предполагая, что вы уже сделали объявление компонента, в месте, где вы хотите создать мультиплексоры разного размера:

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