постановка или необходимость в теле цикла - PullRequest
0 голосов
/ 28 июня 2019

У меня следующий код verilog. Я не могу найти ответ, каков эффект использования posedge в середине цикла или после a <= x;b<=ri. Я думаю, что always begin выполняется всегда, и после этого функция будет заблокирована на posedge clk (после строки integer d). Когда clock поднимется, будет выполнена следующая строка (а именно r <= 0).

Если это так, то следующие posedge clk (после <= x ; b <= ri и c = ri) будут выполняться на одном и том же фронте тактовой частоты или требуют другого фронта тактовой частоты, и какова причина использования posedge в середине кода, а не в начале?

always
begin :two
   real c;
   integer d;
   @(posedge clk)
      r <= 0;
   if (k) 
   begin
      a <= x; b <= ri;
      @(posedge clk);
      begin :loop
      forever
      begin
         c = ri;
         @(posedge clk);
         d = $rtoi(c*4);
         if (abs(b-c) > abs(a-b)) disable loop;
         r <= $rtoi(j*4);
      end
   end 
   d = 3*d; k <= 1’b0; r <= d + 1;
end

1 Ответ

2 голосов
/ 28 июня 2019

, тогда следующий шаг clk (после <= x; b <= ri и c = ri) будет выполнен на одном и том же фронте тактовой частоты </p>

Нет, каждый @(posedge clk); будетвыполнение блока до тех пор, пока не будет замечен передний фронт, и после этого оно продолжится.

В чем причина использования posedge в середине кода, а не в начале?

Я не знаю, почему код был написан таким образом, для этого мне пришлось бы знать (или догадываться), какую проблему пытался решить автор.

Как уже упоминалось выше: @(posedge clk); будет блокировать выполнение, пока не будет замечен передний фронт.Таким образом, вы должны прочитать код как определенную последовательность событий:

  1. дождаться нарастающего фронта тактового сигнала, а затем установить r в ноль.

  2. if k установите a, b и снова дождитесь повышения фронта тактовой частоты.

  3. установите c (по какой-то причине это назначение блокировки) и снова подождитедля повышения частоты.

    и т. д.

...