Подпроцедура вызова в VHDL - PullRequest
0 голосов
/ 18 января 2011

У меня есть две вложенные процедуры, где «основная» процедура использует «subproc» для накопления результата в переменных t0 и t1, который затем возвращается в конце.Все это должно быть вычислено за один такт, и схема более или менее состоит из простых логических элементов (xor, или, и).Когда я пытаюсь описать схему, как показано ниже, я получаю следующую ошибку:

Acutal (variable t0) for formal "a" is not a signal

Это имеет смысл, поскольку подпроцесс требует входных сигналов, но я хочу передать ему переменную во время основной процедуры.Есть ли простой способ обойти эту проблему, например, с помощью литья?

Спасибо

procedure subproc
(
  signal a : in  std_logic_vector(31 downto 0);
  signal b : in  std_logic_vector(31 downto 0);
  signal c : in  std_logic_vector(31 downto 0);
  signal d : in  std_logic_vector(31 downto 0);    
  signal e : out std_logic_vector(31 downto 0);
  signal f : out std_logic_vector(31 downto 0)    
)
is
  variable x : std_logic_vector(31 downto 0);
  variable y : std_logic_vector(31 downto 0);    
begin

  x := (others => '0');
  y := (others => '0');

  for i in 0 to 31 loop
      x(i) := (a(i) xor b(i)) and (c(i) xor d(i));
      y(i) := (a(i) xor b(i)) or ((d(i) xor c(i)) xor b(i));
  end loop;

  e <= x(31 downto 0);
  f <= y(31 downto 0);

end;

procedure main
(
  signal a : in  std_logic_vector(31 downto 0);
  signal b : in  std_logic_vector(31 downto 0);
  signal r : out std_logic_vector(31 downto 0)
)
is
  variable res : std_logic_vector(31 downto 0);
  variable t0, t1 : std_logic_vector(31 downto 0);
  constant c : std_logic_vector(31 downto 0) := X"fedcba90";
  constant d : std_logic_vector(31 downto 0) := X"7654321f";       
begin

  t0 := (others => '0');
  t1 := (others => '0');

  for i in 0 to 31 loop
    if ( (c(i) = '0') && (d(i) = '1') ) then
       subproc( t0, t1, 
                a, b, t0, t1 );
    end if;              
  end loop;

  r <= t0;
end;      

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Прежде всего, ваше предложение "if" написано в C-стиле. Вы хотите сказать:

if (c(i) = '0') and (d(i) = '1') then

Но на самом деле проблема в том, что вы описываете процедуру как использование СИГНАЛОВ в качестве аргументов. Если вы хотите, чтобы результаты были назначены переменным, вам нужно объявить другую сигнатуру процедуры:

procedure subproc (
signal a : in  std_logic_vector(31 downto 0);
signal b : in  std_logic_vector(31 downto 0);
signal c : in  std_logic_vector(31 downto 0);
signal d : in  std_logic_vector(31 downto 0);
variable e : out std_logic_vector(31 downto 0);
variable f : out std_logic_vector(31 downto 0))

Но тогда вам также нужно изменить все назначения на e и f, чтобы они были переменными:

e := x(31 downto 0);
0 голосов
/ 18 января 2011

Почему бы вам просто не определить параметры подпроцесса как переменные вместо сигналов?

...