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
endWszystkie 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
endOba przypisania zachodzą w tym samym czasie, przy użyciu wartości sprzed zbocza zegara.
Podsumowanie
| Zasada | Wyjaśnienie |
|---|---|
Używaj <= dla logiki sekwencyjnej | always @(posedge clk) |
Używaj = dla logiki kombinacyjnej | always @(*) |
| Przypisanie nieblokujące wykonuje się równolegle | Wszystkie przypisania następują jednocześnie |
| Wartości są aktualizowane na końcu kroku czasowego | Nie natychmiast |
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
q1otrzymuje wartośćd q2otrzymuje starą wartośćq1
Co należy zrobić:
- Przypisz
ddoq1(nieblokująco) - Przypisz
q1doq2(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
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online