Always Block
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 46 von 90.
Ein prozeduraler Block ist ein Codeblock, in dem Anweisungen eine nach der anderen und in einer bestimmten Reihenfolge ausgeführt werden, genau wie in Programmiersprachen wie C oder Python. Verilog verfügt über zwei prozedurale Blöcke: initial (wird einmal ausgeführt) und always (wird kontinuierlich ausgeführt). Beginnen wir mit dem always-Block.
Der always block runs kontinuierlich. Er wiederholt sich für immer, sobald die Simulation startet. Er wird verwendet, um Hardware zu beschreiben, die weiterlaufen muss, beispielsweise Flip-Flops, Zähler und kombinatorische Logik.
Grundlegende Syntax:
always @(sensitivity_list) begin
// Code, der wiederholt ausgeführt wird
end@(sensitivity_list) teilt dem Block mit, wann er ausgeführt werden soll. Ohne ihn (und ohne eine Verzögerung wie #5 darin) würde der Block endlos laufen und die Simulation aufhängen.
Beispiel für einen always-Block: Counter
Hier ist ein Beispiel dafür, wie wir den always-Block verwenden können, um einen Zähler zu erstellen.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleSo funktioniert dieser Code
| Teil | Bedeutung |
|---|---|
always | Führe diesen Code wiederholt und für immer aus |
@(posedge clk) | Warte, bis der Takt von 0 auf 1 wechselt (steigende Flanke) |
count <= count + 1 | Nimm den aktuellen Wert von count, addiere 1 und speichere ihn wieder |
Der block runs an jeder rising edge der clock. Jedes Mal erhöht sich count um 1.
Die Sensitivitätsliste @(posedge clk) weist es an, nur bei Taktflanken ausgeführt zu werden, nicht kontinuierlich. Ohne diese würde die Schleife ohne Verzögerung für immer laufen.
Always-Block mit mehreren Signalen
Du kannst bestimmte Signale auflisten:
always @(a or b) begin
out = a & b;
endDies wird ausgeführt, wenn sich a oder b changes.
Aufgabe
Add den fehlenden always block hinzu, damit dieses module funktioniert.
So funktioniert es:
- Bei jeder rising clock edge toggelt
out1(wechselt) von 0 zu 1 oder von 1 zu 0 out2followsout1(derselbe Wert wieout1)
Was zu tun ist:
- Füge einen
always @(posedge clk)block hinzu - Lasse darin
out1toggeln (verwendeout1 = ~out1) - Setze
out2gleichout1
Probier es selbst
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: Always-Block mit posedge clk hinzufügen
// out1 toggelt bei jedem Takt
// out2 folgt out1
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