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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow