verilog
Procedurblock
Sök…
Syntax
- alltid @ (posedge clk) börja / * uttalanden * / slut
- alltid @ (negedge clk) börja / * uttalanden * / slut
- alltid @ (posedge clk eller posedge reset) // kan syntetisera mindre effektivt än synkron återställning
Enkel räknare
En räknare som använder en flip-flop-initialisering av FPGA-stil:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
En räknare implementerad med asynkrona återställningar lämpliga för ASIC-syntes:
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
Procedurblocken i dessa exempel ökar count
varje stigande klockkant.
Icke-blockerande uppdrag
En icke-blockerande tilldelning ( <=
) används för tilldelning inuti kantkänsliga blockerar always
. Inom ett block är de nya värdena inte synliga förrän hela blocket har bearbetats. Till exempel:
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
Lägg märke till användningen av icke-blockerande ( <=
) uppdrag här. Eftersom den första tilldelningen faktiskt inte träder i kraft förrän efter procedurblocket, gör den andra uppgiften vad som är avsett och byter faktiskt de två variablerna - till skillnad från i en blockeringsuppgift ( =
) eller tilldelningar på andra språk; f1
fortfarande sitt ursprungliga värde till höger om den andra tilldelningen i blocket.