2011-05-05 3 views
4

Я хочу использовать общий «p», чтобы определить, сколько выходов будет иметь demux. Входные и все выходы 1 бит. Выходы, управление и ввод могут быть примерно такими, как:Использовать общий размер (de) mux в VHDL?

signal control : std_logic_vector(log 2 p downto 0); -- I can use a generic for the log2.. 
signal input : std_logic; 
signal outputs : std_logic_vector(p-1 downto 0); 

Но каков будет код реализации мультиплексирования? Возможно ли это?

ответ

3

нет дженерики:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
entity demux is 
    port(
     control : in unsigned; 
     input : in std_logic; 
     outputs : out std_logic_vector 
     ); 
end entity demux; 

architecture rtl of demux is 
    -- Check size of input vectors 
    assert 2**control'length = outputs'length 
      report "outputs length must be 2**control length" 
      severity failure; 
    -- actually do the demuxing - this will cause feedback latches to be inferred 
    outputs(to_integer(unsigned(control)) <= input; 

end architecture; 

(непроверенная, только набранный в с верхней части моей головы ...)

Это будет вызывать защелки - это то, что вы хотите?

0

Вы должны подать log_p в качестве общего и вычислить p, как вы идете.

library ieee; 
use ieee.std_logic_1164.all; 
entity demux is 
    generic (
     log_p: integer); 
    port(
     control : in std_logic_vector(log_p downto 0); 
     input :in std_logic; 
     outputs : out std_logic_vector(2**log_p - 1 downto 0) 
     ); 
end entity demux; 
+2

Я бы предпочел, чтобы управление было неподписанным типом ... –

0

Вам необходимо пройти как количество выходов и размер массива элементов управления в качестве дженериков, если вы не всегда использовать полномочия двух.

Внешний вид вашего модуля (de) mux (т. Е. При создании экземпляра), вы можете использовать код для вычисления количества бит для шины управления. У меня есть функция в общем пакете я использую для инициализации различных констант конфигурации и дженерики, которые получают передаются код, похожий на ваш (де) мультиплексором применения:

-- Calculate the number of bits required to represent a given value 
function NumBits(val : integer) return integer is 
    variable result : integer; 
begin 
    if val=0 then 
     result := 0; 
    else 
     result := natural(ceil(log2(real(val)))); 
    end if; 
    return result; 
end; 

... что позволяет делать такие вещи, как:

не требуется
constant NumOut : integer := 17; 
signal CtrlBus : std_logic_vector(NumBits(NumOut)-1 downto 0); 

my_mux : demux 
generic map (
    NumOut => NumOut, 
    NumCtrl => NumBits(NumOut)) 
port map (
    control => CtrlBus, 
... 
... 
+1

Downvoted - unconstrained типы являются точными в/из генериков. –

Смежные вопросы