последовательное выполнение в операторе процесса в VHDL - PullRequest
0 голосов
/ 03 мая 2018

для оператора процесса в vhdl, говорят, что порядок выполнения внутри оператора процесса является последовательным. Мой вопрос заключается в том, что, пожалуйста, сначала посмотрите на приведенный ниже код, являются ли сигналы a, b и c назначенными их новым значениям одновременно или последовательно в операторе if, который находится в операторе процесса?

   process(clk) is
   begin
   if rising_edge(clk) then
   a <= b ;
   b <= c ;
   c <= a;
   end if;
   end process;

Так что, если это последовательно, я должен сказать, что после окончания процесса a равно b, b равно c и c равно b, потому что мы присвоили b a, прежде чем присвоили a c. Тем не менее, это не представляется возможным для аппаратного обеспечения.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Построение минимального, полного и проверяемого примера, содержащего ваш процесс:

library ieee;
use ieee.std_logic_1164.all;

entity sequent_exec is
end entity;

architecture foo of sequent_exec is
    signal a:       std_ulogic := '1';
    signal b, c:    std_ulogic := '0';
    signal clk:     std_ulogic := '0';
begin
    CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 200 ns then
            wait;
        end if;
    end process;
DUT:
    process(clk) is
    begin
    if rising_edge(clk) then
    a <= b ;
    b <= c ;
    c <= a;
    end if;
    end process;
end architecture;

Мы видим значения сдвига a, b и c от одного к другому как регистр сдвига с рециркуляцией:

sequent_exec.png

Почему это происходит, зависит от того, как работает цикл симуляции VHDL.

См. IEEE Std 1076-2008

10.5 Простые назначения сигналов (10.5.1 Общие положения):

Оператор назначения сигналов изменяет проецируемые выходные сигналы, содержащиеся в драйверах одного или нескольких сигналов (см. 14.7.2), планирует силу для одного или нескольких сигналов или планирует выпуск одного или нескольких сигналов (см. 14.7.3). ).

Назначение сигнала ставит в очередь новое значение для обновления сигнала. Как работает очередь прогнозируемого выходного сигнала, описано в 10.5.2.2 Выполнение простого оператора присваивания:

Оценка элемента формы сигнала приводит к одной транзакции. Компонент времени транзакции определяется текущим временем, добавленным к значению выражения времени в элементе формы волны. Для элемента формы сигнала первой формы компонент значения транзакции определяется выражением значения в элементе сигнала.

Назначение без выражения времени относится к текущему времени моделирования. (Произойдет дельта-цикл - цикл симуляции без увеличения времени симуляции). Последовательность транзакций описана в 10.5.2.2 сообщить нам, что старые транзакции к тому же времени симуляции удалены.

Это означает, что есть только одна запись в очереди для любого времени моделирования и объясняет, почему последнее присвоение определенному сигналу является результатом, приводящим к транзакции (и создающей событие для сигнала, к которому чувствителен процесс).

14.7 Выполнение модели содержит информацию о том, как работает цикл моделирования (14.7.5 Выполнение модели).

14.7.5.1 Общее:

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

14.7.5.3 Цикл моделирования описывает цикл моделирования, здесь используется стандарт IEEE 1076-1993 для простоты, чтобы не загромождать действия VHPI:

12.6.4 Цикл моделирования

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

В начале инициализации текущее время Tc принимается равным 0 нс.

Фаза инициализации состоит из следующих шагов:

- Расчетное значение и эффективное значение каждого явно объявленного сигнала вычисляются, а текущее значение сигнала устанавливается на эффективное значение. Предполагается, что это значение было значением сигнала в течение бесконечного промежутка времени до начала симуляции.

- Значение каждого неявного сигнала в форме S'Stable (T) или S'Quiet (T) установлено в True. Значение каждого неявного сигнала вида S'Delayed (T) устанавливается равным начальному значению его префикса S.

- Значение каждого неявного сигнала GUARD устанавливается на результат вычисления соответствующего защитного выражения.

- Каждый неотложенный процесс в модели выполняется до тех пор, пока он не приостановится.

- Каждый отложенный процесс в модели выполняется до тех пор, пока он не приостановится.

- Время следующего цикла моделирования (которое в данном случае является первым циклом моделирования), Tn, рассчитывается в соответствии с правилами шага f цикла моделирования, приведенными ниже.

Цикл моделирования состоит из следующих шагов:

а. Текущее время Tc установлено равным Tn. Симуляция завершается, когда Tn = TIME'HIGH, и в Tn нет активных драйверов или возобновлений процессов.
б. Каждый активный явный сигнал в модели обновляется. (В результате на сигналах могут происходить события.)
с. Каждый неявный сигнал в модели обновляется. (В результате на сигналах могут происходить события.)
д. Для каждого процесса P, если P в настоящее время чувствителен к сигналу S и если в этом цикле моделирования произошло событие S, то P возобновляется.
е. Каждый неотложенный процесс, который возобновился в текущем цикле моделирования, выполняется до тех пор, пока не будет приостановлен.
е. Время следующего цикла моделирования, Tn, определяется путем установки его на самое раннее из

  1. TIME'HIGH,
  2. В следующий раз, когда драйвер станет активным, или
  3. В следующий раз, когда процесс возобновится.
  4. Если Tn = Tc, то следующий цикл моделирования (если есть) будет дельта-циклом.

г. Если следующий цикл симуляции будет дельта-циклом, оставшаяся часть этого шага пропускается. В противном случае каждый отложенный процесс, который возобновился, но не был выполнен с момента его последнего возобновления, выполняется до его приостановки. Затем Tn пересчитывается по правилам шага f. Ошибка, если выполнение какого-либо отложенного процесса приводит к появлению дельта-цикла сразу после текущего цикла моделирования.

Значения сигнала не меняются во время выполнения процесса. Их обновления ставятся в очередь и применяются на другом этапе выполнения цикла моделирования.

назад к -2008:

  1. Последовательные утверждения, 10.1 Общие положения

В этом разделе описаны различные формы последовательных операторов. Последовательные операторы используются для определения алгоритмов выполнения подпрограммы или процесса; они выполняются в том порядке, в котором они появляются.

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

0 голосов
/ 03 мая 2018

Сигналы назначений - это события, находящиеся в очереди, см. Ссылки в комментариях. Итак, после оценки a (новый) = b (старый), b (новый) = c (старый) и c (новый) = a (старый).

Если вы действительно хотите последовательное присваивание, вы можете использовать переменные (но не рекомендуется, потому что вы легко можете ошибиться)

process(clk) is
    variable i_a, i_b, i_c : [some type];
begin
    if rising_edge(clk) then
        -- initialize with signal value
        i_a := a;
        i_b := b;
        i_c := c;
        --- modify
        i_a := i_b;
        i_b := i_c;
        i_c := i_a;
        -- write back to signal
        a <= i_a;
        b <= i_b;
        c <= i_c;
    end if;
end process;

Теперь c (новый) = a (новый) = b (старый) и b (новый) = c (старый)

...