verilog
Bloki proceduralne
Szukaj…
Składnia
- always @ (posedge clk) start / * instrukcje * / end
- always @ (negedge clk) start / * instrukcje * / end
- always @ (posedge clk lub posedge reset) // może syntetyzować mniej wydajnie niż reset synchroniczny
Prosty licznik
Licznik korzystający z inicjalizacji flip-flop w stylu FPGA:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
Licznik zaimplementowany przy użyciu resetu asynchronicznego odpowiedniego do syntezy 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
Przyrosty proceduralne w tych przykładach count
na każdym rosnącym zboczu zegara.
Zadania nieblokujące
Przypisanie nieblokujące ( <=
) jest używane do przypisania wewnątrz bloków always
wrażliwych na krawędzie. W obrębie bloku nowe wartości nie są widoczne, dopóki cały blok nie zostanie przetworzony. Na przykład:
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
Zwróć uwagę na użycie nieblokujących przypisań ( <=
) tutaj. Ponieważ pierwsze przypisanie nie wchodzi w życie dopiero po bloku proceduralnym, drugie przypisanie robi to, co jest zamierzone i faktycznie zamienia dwie zmienne - w przeciwieństwie do przypisania blokującego ( =
) lub przypisań w innych językach; f1
nadal ma swoją pierwotną wartość po prawej stronie drugiego przypisania w bloku.