verilog
Procedurele blokken
Zoeken…
Syntaxis
- altijd @ (posedge clk) begin / * statements * / end
- always @ (negedge clk) begin / * statements * / end
- altijd @ (posedge clk of posedge reset) // kan minder efficiënt synthetiseren dan synchrone reset
Eenvoudige teller
Een teller die een FPGA-stijl flip-flop-initialisatie gebruikt:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
Een teller geïmplementeerd met behulp van asynchrone resets geschikt voor ASIC-synthese:
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
De procedurele blokken in deze voorbeelden count
op bij elke stijgende klokflank.
Niet-blokkerende opdrachten
Een niet-blokkerende toewijzing ( <=
) wordt gebruikt voor toewijzing binnen always
randgevoelige blokken. Binnen een blok zijn de nieuwe waarden niet zichtbaar totdat het hele blok is verwerkt. Bijvoorbeeld:
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
Let hier op het gebruik van niet-blokkerende ( <=
) toewijzingen. Aangezien de eerste toewijzing pas effectief wordt na het procedurele blok, doet de tweede toewijzing wat de bedoeling is en verwisselt de twee variabelen feitelijk - in tegenstelling tot een blokkerende toewijzing ( =
) of toewijzingen in andere talen; f1
nog steeds zijn oorspronkelijke waarde aan de rechterkant van de tweede toewijzing in het blok.