Можно ли использовать синхронный процесс в функциях?

i=0;
If rising_edge (clk) then
y(i)<=x(i) ;
i=:i+1;
end if;

Возможен ли блок, как указано выше, в функциональном блоке? Если это не так, есть ли какой-нибудь функциональный стиль подпрограммы для этого?

Или есть ли синтезируемое использование цикла for вместо оператора if?

2 ответа

Вы можете использовать процедуры:

  procedure SetBits(signal clk : in std_logic; signal y : out std_logic_vector(7 downto 0)) is
  begin
    for i in 7 downto 0 loop
      wait until (rising_edge(clk));
      y(i) <= '1';
    end loop;
  end procedure;

а потом как то так

  sequential : process
  begin
    SetBits;
    wait;
  end process sequential;

Нет, вы не можете иметь синхронизированный процесс внутри функции. Вы можете использовать цикл, хотя:

if rising_edge(clk) then
  for i in 0 to x'length - 1 loop
    y(i) <= x(i); -- or whatever operation
  end loop;
end if;

Вы можете обернуть часть цикла for только в функцию, если вы действительно хотите:

function f(x : std_logic_vector) return std_logic_vector is
  variable result : std_logic_vector(x'range);
begin
  for i in x'range loop
    result(i) := x(i); -- or whatever operation
  end loop;
  return result;
end function f;

if rising_edge(clk) then
  y <= f(x);
end if;

Я предполагаю, что вы хотите делать больше, чем просто назначать биты, конечно, иначе вам вообще не понадобится цикл или функция.

Другие вопросы по тегам