Non Blocking Assignment
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 50 von 90.
In der vorherigen Lektion haben wir die blocking assignment (=) behandelt, die Schritt für Schritt ausgeführt wird. Nun behandeln wir die non-blocking assignment (<=), die auf einmal, parallel, ausgeführt wird.
Eine Non-blocking-Zuweisung verwendet den Operator <=. Sie wird „non-blocking“ genannt, weil sie die Ausführung der nächsten Anweisung nicht blockiert. Alle Non-blocking-Zuweisungen in einem Block werden zur gleichen Zeit ausgeführt.
Syntax:
variable <= expression;Wann eine Non-Blocking-Zuweisung verwendet wird
Eine Non-Blocking-Zuweisung (<=) wird für sequentielle Logik verwendet: Schaltungen, die einen Takt verwenden und über einen Speicher verfügen. Ausgänge ändern sich nur an einer Taktflanke (normalerweise an der steigenden Flanke).
Beispiele für sequenzielle Logik:
- Flip-Flops
- Register
- Zähler
- Zustandsautomaten
- Schieberegister
Verilog-Beispiel:
initial begin
a <= 5; // Geplant, aber noch nicht ausgeführt
b <= a + 2; // Geplant, verwendet den ALTEN Wert von a
c <= b * 3; // Geplant, verwendet den ALTEN Wert von b
endAll drei Zuweisungen geschehen zur gleichen Zeit unter Verwendung der old values. Am Ende des Zeitschritts erfolgen alle Aktualisierungen gemeinsam.
Nicht-blockierend in Always-Blöcken (sequentielle Logik)
Nicht-blockierend wird für sequentielle Logik verwendet: Schaltungen, die einen Takt verwenden und über einen Speicher verfügen (Flip-Flops, Register, Zähler).
always @(posedge clk) begin
q <= d; // q erhält d bei Taktflanke
count <= count + 1; // count wird bei Taktflanke inkrementiert
endBeide Zuweisungen erfolgen gleichzeitig und verwenden values von vor der clock edge.
Zusammenfassung
| Regel | Erklärung |
|---|---|
Verwende <= für sequenzielle Logik | always @(posedge clk) |
Verwende = für kombinatorische Logik | always @(*) |
| Nicht blockierende Zuweisungen werden parallel ausgeführt | All assignments happen at once |
| Werte werden am Ende des Zeitschritts aktualisiert | Nicht sofort |
Aufgabe
Die Non-Blocking-Zuweisung vervollständigen
Füge die fehlenden non-blocking assignments hinzu, damit dieses 2-Bit-Schieberegister funktioniert.
So funktioniert es:
- Bei jeder clock edge erhält
q1den Wert vond q2erhält den alten Wert vonq1
Aufgabe:
- Weise
dq1zu (non-blocking) - Weise
q1q2zu (non-blocking)
Probier es selbst
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: Shift-Logik hinzufügen
// Schritt 1: Weise d q1 zu (nicht-blockierend)
// Schritt 2: Weise q1 q2 zu (nicht-blockierend)
end
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicÜbe selbstständig: Online-Verilog-Compiler