verilog
Verfahrensblöcke
Suche…
Syntax
- immer @ (Posedge clk) begin / * Anweisungen * / end
- immer @ (negedge clk) begin / * Anweisungen * / end
- always @ (Posedge clk oder Posedge Reset) // kann weniger effizient synthetisieren als synchrones Reset
Einfacher Zähler
Ein Zähler, der eine FPGA-Flip-Flop-Initialisierung verwendet:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
Ein Zähler, der mit asynchronen Resets implementiert wurde, die für die ASIC-Synthese geeignet sind:
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
Die prozeduralen Blöcke in diesen Beispielen erhöhen die count
bei jeder steigenden Taktflanke.
Nicht blockierende Zuweisungen
Eine nicht blockierende Zuweisung ( <=
) wird für die Zuweisung innerhalb von kantenempfindlichen always
Blöcken verwendet. Innerhalb eines Blocks sind die neuen Werte erst sichtbar, wenn der gesamte Block verarbeitet wurde. Zum Beispiel:
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
Beachten Sie hier die Verwendung von nicht blockierenden ( <=
) Zuweisungen. Da die erste Zuweisung erst nach dem Verfahrensblock wirksam wird, erfüllt die zweite Zuweisung das, was beabsichtigt ist, und vertauscht die beiden Variablen - anders als bei einer blockierenden Zuweisung ( =
) oder Zuweisungen in anderen Sprachen; f1
hat seinen ursprünglichen Wert immer noch auf der rechten Seite der zweiten Zuweisung im Block.