Menu
Coddy logo textTech

Przypisanie nieblokujące

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

W poprzedniej lekcji omówiliśmy przypisanie blokujące (=), które wykonuje się krok po kroku. Teraz omówimy przypisanie nieblokujące (<=), które wykonuje się jednocześnie, równolegle.

Przypisanie nieblokujące używa operatora <=. Nazywa się je „nieblokującym”, ponieważ nie blokuje wykonania następnej instrukcji. Wszystkie przypisania nieblokujące w bloku wykonują się w tym samym czasie.

Składnia:

variable <= expression;

Kiedy używać przypisania nieblokującego

Przypisania nieblokującego (<=) używa się w logice sekwencyjnej: układach, które korzystają z zegara i mają pamięć. Wyjścia zmieniają się tylko na zboczu zegara (zwykle narastającym).

Przykłady układów sekwencyjnych:

  • Przerzutniki
  • Rejestry
  • Liczniki
  • Automaty stanów
  • Rejestry przesuwne

Przykład Verilog:

initial begin
  a <= 5;      // Zaplanowane, ale jeszcze niewykonane
  b <= a + 2;  // Zaplanowane, używa STAREJ wartości a
  c <= b * 3;  // Zaplanowane, używa STAREJ wartości b
end

Wszystkie trzy przypisania następują w tym samym czasie z użyciem starych wartości. Na końcu kroku czasowego wszystkie aktualizacje zachodzą jednocześnie.

Przypisania nieblokujące w blokach always (logika sekwencyjna)

Przypisań nieblokujących używa się w logice sekwencyjnej: obwodach, które korzystają z zegara i mają pamięć (przerzutniki, rejestry, liczniki).

always @(posedge clk) begin
  q <= d;           // q otrzymuje wartość d na zboczu zegara
  count <= count + 1; // count zwiększa się o 1 na zboczu zegara
end

Oba przypisania zachodzą w tym samym czasie, przy użyciu wartości sprzed zbocza zegara.

Podsumowanie

ZasadaWyjaśnienie
Używaj <= dla logiki sekwencyjnejalways @(posedge clk)
Używaj = dla logiki kombinacyjnejalways @(*)
Przypisanie nieblokujące wykonuje się równolegleWszystkie przypisania następują jednocześnie
Wartości są aktualizowane na końcu kroku czasowegoNie natychmiast
challenge icon

Wyzwanie

Uzupełnij przypisania nieblokujące

Dodaj brakujące przypisania nieblokujące, aby ten 2-bitowy rejestr przesuwny działał.

Jak to działa:

  • Przy każdym zboczu zegara q1 otrzymuje wartość d
  • q2 otrzymuje starą wartość q1

Co należy zrobić:

  1. Przypisz d do q1 (nieblokująco)
  2. Przypisz q1 do q2 (nieblokująco)

Spróbuj swoich sił

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Dodaj logikę przesuwania
      // Krok 1: Przypisz d do q1 (przypisanie nieblokujące)
      // Krok 2: Przypisz q1 do q2 (przypisanie nieblokujące)
    end
  end
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