Последовательность выполнения в Process и, если еще: VHDL - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь что-то сделать за один такт.Каков мой подход:

process begin
if rising_edge(clk) then

if (condition) then 
values of variables a and b are generated;
end if;

Here I want to use these freshly generated values of a and b.

end if;
end process;

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

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Чтобы угадать, чего вы хотите достичь, вам нужны переменные.

Переменные обновляются немедленно в присваивании переменной, тогда как последовательные назначения сигналов в соответствии с графиком до следующего wait заявления достигаются.

Имейте в виду, что список чувствительности процесса является синтаксическим сахаром для оператора wait on <sensitivity list>;, вставленного перед end process.Таким образом, если список чувствительности процесса используется вместо операторов ожидания, сигналы обновляются в конце процесса.

process(<sensitivity list>)
  variable a : std_logic_vector(7 downto 0);
begin
  a := foo;
  if (a = x"55") then
    result <= a;
  else
    result <= not a;
  end if;
end process;

Эквивалентный процесс с wait on:

process
  variable a : std_logic_vector(7 downto 0);
begin
  a := foo;
  if (a = x"55") then
    result <= a;
  else
    result <= not a;
  end if;

  wait on <sensitivity list>;
end process;

Thisтакже объясняет, почему каждый процесс оценивается хотя бы один раз при запуске моделирования.

0 голосов
/ 17 октября 2018

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

...