2015-04-26 3 views
2

Я работаю над школьным проектом и имею следующий триггер объект:Как передавать сигналы STD_LOGIC на объект с сигналами STD_LOGIC_VECTOR?

-- define the width-bit flip flop entity 
entity flopr is 
    generic (width: integer); 
    port (clk, reset: in STD_LOGIC; 
      d:   in STD_LOGIC_VECTOR(width-1 downto 0); 
      q:   out STD_LOGIC_VECTOR(width-1 downto 0)); 
end flopr; 

-- define the width-bit flip flop architecture 
architecture asynchronous of flopr is 
begin 
    process(clk, reset) 
    begin 
     if reset ='1' then 
      q <= (others => '0'); 
     elsif rising_edge(clk) then 
      q <= d; 
     end if; 
    end process; 
end; 

Мне нужно передать STD_LOGIC сигналов (биты) для d и q вместо STD_LOGIC_VECTOR (векторов).

Однако, если бы я просто передать их без какого-либо преобразования, то есть ошибка компиляции, так как тип передается (STD_LOGIC) не совпадает с типом в flopr сущности (STD_LOGIC_VECTOR), даже если размер STD_LOGIC_VECTOR равен 1.

из небольшого Googling и экспериментов, я пришел с этим:

zeroMFlopr: entity work.flopr generic map(1) port map(clk => clk, reset => reset, d => (0=>zeroE), q(0) => zeroM); 

Где zeroE и zeroM имеют тип STD_LOGIC.

Он компилируется, но это правильный способ сделать это?

EDIT: Я попытался компиляции в Quartus и, как я сказал, что это работало нормально, но когда я пытаюсь компиляции в ModelSim я получаю сообщение об ошибке:

Actual expression (aggregate) of formal "d" is not globally static.

Ошибка ссылающийся на линии я отправил выше.

+1

Он выглядит хорошо для меня ... –

+0

@KevinCadieux ModelSim дает ошибку, так что я не уверен, что это работает .. Я обновил свой вопрос с ошибкой , Кроме того, я не знаю, кто это сделал, но было бы неплохо узнать, почему. Я ученик, пытающийся выучить крайне неинтуитивный и запутанный язык, и после многих исследований и многочисленных попыток попросил о помощи здесь. Разве это не для этого сайта? – Nate

+1

@Nate: 'port map (clk => clk, reset => reset, d (0) => zeroE, q (0) => zeroM)' –

ответ

2

VHDL-2002 не позволяет d => (0=>zeroE), и что является причиной для:

Actual expression (aggregate) of formal "d" is not globally static.

VHDL-2008 позволяет это, так что это будет работать, если инструменты поддерживают эту особенность VHDL-2008.

Для VHDL-2002 стиля кодирования, с именем ассоциацией родового, написать:

zeroMFlopr: entity work.flopr 
    generic map(
    width => 1) 
    port map(
    clk => clk, 
    reset => reset, 
    d(0) => zeroE, 
    q(0) => zeroM); 
+0

IEEE Std 1076-2008 6.5.6.3 Положения порта «... выражение должно быть одним из следующих: -Имя объекта, подтип которого глобально статичен ... - Агрегат, если все варианты локально статичны и все выражения в ассоциациях элементов - это выражения, описанные в этом списке » – user1155120

+2

Метод Мортена способен работать через любую версию стандарта VHDL (как и дополнительные два метода, показанные в дополнительном ответе). – user1155120

2

Есть еще по крайней мере два способа подключения zeroE и zeroM к формалям типа массива в версиях стандарта VHDL до -2008, кроме использования Мортена из нарезанного официальное название:

Во-первых, прокси-сигналы:

library ieee; 
use ieee.std_logic_1164.all; 

entity flopr_tb is 
end entity; 

architecture foo of flopr_tb is 
    constant width: integer := 1; 
    signal clk:  std_logic := '0'; 
    signal reset: std_logic := '0'; 
    signal zeroE: std_logic; 
    signal zeroM: std_logic; 
    signal d:  std_logic_vector (width -1 downto 0); 
    signal q:  std_logic_vector (width -1 downto 0);  

begin 

    d <= "" & zeroE; 
    zeroM <= q(0); 
DUT: 
    entity work.flopr 
     generic map (width) 
     port map (
      clk => clk, 
      reset => reset, 
      d => d, 
      q => q 
     ); 
end architecture; 

Th ан есть определение сигналов типа массива и используя псевдонимы:

architecture fum of flopr_tb is 
    constant width: integer := 1; 
    signal clk:  std_logic := '0'; 
    signal reset: std_logic := '0'; 
    signal d:  std_logic_vector (width -1 downto 0); 
    signal q:  std_logic_vector (width -1 downto 0); 
    alias zeroE is d(0); 
    alias zeroM is q(0); 

begin 

DUT: 
    entity work.flopr 
     generic map (width) 
     port map (
      clk => clk, 
      reset => reset, 
      d => d, 
      q => q 
     ); 
end architecture;