verilog
Blocchi procedurali
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.