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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow