verilog
Blocs procéduraux
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.