Recherche…


Syntaxe

  • toujours @ (posedge clk) begin / * instructions * / end
  • always @ (negedge clk) begin / * instructions * / end
  • always @ (posedge clk ou posedge reset) // peut synthétiser moins efficacement que la réinitialisation synchrone

Compteur simple

Un compteur utilisant une initialisation à bascule de type FPGA:

module counter(
    input clk,
    output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
    count <= count + 1'b1;
end

Un compteur implémenté en utilisant des réinitialisations asynchrones adaptées à la synthèse ASIC:

module counter(
  input            clk,  
  input            rst_n, // Active-low reset
  output reg [7:0] count
)
always @ (posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    count <= 'b0;
  end
  else begin
    count <= count + 1'b1;
  end
end

Les blocs procéduraux dans ces exemples incrémentent le count à chaque front montant.

Affectations non bloquantes

Une affectation non bloquante ( <= ) est utilisée pour l'affectation dans les blocs always sensibles aux contours. Dans un bloc, les nouvelles valeurs ne sont pas visibles tant que le bloc entier n'a pas été traité. Par exemple:

module flip(
    input clk,
    input reset
)
reg f1;
reg f2;

always @ (posedge clk) begin
  if (reset) begin // synchronous reset
    f1 <= 0;
    f2 <= 1;
  end
  else begin
    f1 <= f2;
    f2 <= f1;
  end
end
endmodule

Notez l'utilisation des assignations non bloquantes ( <= ) ici. Étant donné que la première affectation n'entre en vigueur qu'après le bloc procédural, la deuxième attribution fait ce qui est prévu et échange les deux variables - contrairement à une affectation de blocage ( = ) ou à des affectations dans d'autres langues; f1 toujours sa valeur d'origine sur le côté droit de la deuxième affectation dans le bloc.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow