Menu
Coddy logo textTech

Blok always

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 46 z 90.

Blok proceduralny to blok kodu, w którym instrukcje wykonują się jedna po drugiej, sekwencyjnie, tak jak w językach programowania, takich jak C czy Python. Verilog ma dwa bloki proceduralne: initial (wykonuje się raz) i always (wykonuje się ciągle). Zacznijmy od bloku always.

Blok always działa nieprzerwanie. Powtarza się bez końca po rozpoczęciu symulacji. Służy do opisywania sprzętu, który musi działać stale, takiego jak przerzutniki, liczniki i logika kombinacyjna.

Podstawowa składnia:

always @(sensitivity_list) begin
  // Kod, który wykonuje się wielokrotnie
end

@(sensitivity_list) informuje blok, kiedy ma się wykonać. Bez niego (i bez opóźnienia, takiego jak #5 wewnątrz), blok zapętlałby się w nieskończoność i zawiesił symulację.

Przykład bloku always: licznik

Oto przykład tego, jak możemy użyć bloku always, aby utworzyć licznik.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Jak działa ten kod

CzęśćZnaczenie
alwaysWykonuj ten kod wielokrotnie, bez końca
@(posedge clk)Poczekaj, aż sygnał zegara zmieni się z 0 na 1 (zbocze narastające)
count <= count + 1Pobierz bieżącą wartość count, dodaj 1 i zapisz ją z powrotem

Blok wykonuje się przy każdym narastającym zboczu zegara. Za każdym razem count zwiększa się o 1.

Lista czułości @(posedge clk) informuje, że kod ma być wykonywany tylko na zboczach zegara, a nie w sposób ciągły. Bez tego pętla działałaby bez końca, bez opóźnienia.

Blok always z wieloma sygnałami

Możesz wymienić konkretne sygnały:

always @(a or b) begin
  out = a & b;
end

To uruchamia się, gdy zmieni się a lub b.

challenge icon

Wyzwanie

Dodaj brakujący blok always, aby ten moduł działał.

Jak to działa:

  • Przy każdym narastającym zboczu zegara out1 zmienia stan (przełącza się) z 0 na 1 lub z 1 na 0
  • out2 podąża za out1 (ma taką samą wartość jak out1)

Co zrobić:

  1. Dodaj blok always @(posedge clk)
  2. Wewnątrz spraw, by out1 zmieniał stan (użyj out1 = ~out1)
  3. Spraw, by out2 miało taką samą wartość jak out1

Spróbuj swoich sił

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: Dodaj blok always z posedge clk
  // out1 zmienia stan przy każdym takcie zegara
  // out2 podąża za out1

endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online