Ricerca…


Sintassi

  • sempre @ (posedge clk) begin / * statements * / end
  • sempre @ (negedge clk) begin / * statements * / end
  • sempre @ (posedge clk o posedge reset) // può sintetizzare in modo meno efficiente rispetto al reset sincrono

Contatore semplice

Un contatore che utilizza un'inizializzazione del flip-flop in stile FPGA:

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

Un contatore implementato utilizzando reset asincroni adatti per la sintesi 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

I blocchi procedurali in questi esempi incrementano il count ad ogni fronte del clock in aumento.

Assegnazioni non bloccanti

Un'assegnazione non bloccante ( <= ) viene utilizzata per l'assegnazione all'interno di blocchi always sensibili ai bordi. All'interno di un blocco, i nuovi valori non sono visibili finché non è stato elaborato l'intero blocco. Per esempio:

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

Si noti l'uso di assegnazioni non bloccanti ( <= ) qui. Dal momento che il primo compito non ha effettivamente effetto fino a dopo il blocco procedurale, il secondo compito fa ciò che è inteso e in realtà scambia le due variabili - a differenza di un blocco di assegnazione ( = ) o di assegnazioni in altre lingue; f1 ha ancora il suo valore originale sul lato destro del secondo incarico nel blocco.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow