Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog Control Flow meistern: IF-ELSE, Case, Loops und mehr

Hardware-Verhalten lässt sich ohne bedingte Anweisungen und andere Möglichkeiten zur Steuerung des Logikflusses nicht implementieren. Verilog bietet eine Reihe von Control-Flow-Blöcken und -Mechanismen, um dies zu erreichen.

if-else-if

Diese bedingte Anweisung dient dazu, eine Entscheidung darüber zu treffen, ob bestimmte Anweisungen ausgeführt werden sollen oder nicht. Sie ist der if-else-if-Anweisung in C sehr ähnlich. Wenn der Ausdruck zu true ausgewertet wird, wird die erste Anweisung ausgeführt. Wenn der Ausdruck zu false ausgewertet wird und ein else-Teil existiert, wird der else-Teil ausgeführt.

Syntax
// if-Anweisung ohne else-Teil
if (expression) [statement]

// if-Anweisung mit else-Teil
if (expression) [statement] else [statement]

// if-else für mehrere Anweisungen muss 
// in "begin" und "end" eingeschlossen werden
if (expression) begin [multiple statements] end
else begin [multiple statements] end

// if-else-if-Anweisung
if (expression) [statement]
else if (expression) [statement]
else [statement]

Der else-Teil eines if-else ist optional und kann Verwirrung stiften, wenn ein else in einer verschachtelten if-Folge weggelassen wird. Um diese Verwirrung zu vermeiden, ist es einfacher, das else immer dem vorherigen if zuzuordnen, dem ein else fehlt. Eine andere Möglichkeit ist, Anweisungen in einen begin-end-Block einzuschließen. Der letzte else-Teil behandelt den "none-of-the-above"- oder Default-Fall, bei dem keine der anderen Bedingungen erfüllt war.

Hier klicken, um mehr über if-else-if zu erfahren

Schleifen bieten eine Möglichkeit, einzelne oder mehrere Anweisungen innerhalb eines Blocks ein- oder mehrmals auszuführen. In Verilog gibt es vier verschiedene Arten von Schleifenanweisungen.

forever-Schleife

Diese führt die Anweisungen innerhalb des Blocks kontinuierlich aus.

forever [statement]
forever begin [multiple statements] end

Beispiel

module my_design;
  initial begin
    forever begin
      $display ("This will be printed forever, simulation can hang ...");
    end
  end
endmodule

Simulationslog:

ncsim> run
This will be printed forever, simulation can hang ...
This will be printed forever, simulation can hang ...
...
This will be printed forever, simulation can hang ...
This will be printed forever, simulation can hang ...
This will be printed forever, simulation can hang ...
This will be printed forever, simulation can hang ...
Result reached the maximum of 5000 lines. Killing process.

repeat-Schleife

Diese führt Anweisungen eine feste Anzahl von Malen aus. Wenn der Ausdruck zu X oder Z ausgewertet wird, wird er als Null behandelt und gar nicht ausgeführt.

repeat ([num_of_times]) begin [statements] end
repeat ([num_of_times]) @ ([some_event]) begin [statements] end

Beispiel

module my_design;
  initial begin
    repeat(4) begin
      $display("This is a new iteration ...");
    end
  end
endmodule

Simulationslog:

ncsim> run
This is a new iteration ...
This is a new iteration ...
This is a new iteration ...
This is a new iteration ...
ncsim: *W,RNQUIE: Simulation is complete.

while-Schleife

Diese führt Anweisungen so lange aus, wie ein Ausdruck wahr ist, und beendet sich, sobald die Bedingung falsch wird. Wenn die Bedingung von Anfang an falsch ist, werden die Anweisungen überhaupt nicht ausgeführt.

while (expression) begin [statements] end

Beispiel

module my_design;
  integer i = 5;
  initial begin
    while (i > 0) begin
      $display ("Iteration#%0d", i);
      i = i - 1;
    end
  end
endmodule

Simulationslog:

ncsim> run
Iteration#5
Iteration#4
Iteration#3
Iteration#2
Iteration#1
ncsim: *W,RNQUIE: Simulation is complete.

for-Schleife

for (initial_assignment; condition; increment_variable) begin [statements] end

Dies steuert Anweisungen mittels eines Dreischritt-Prozesses:

Beispiel

module my_design;
  integer i = 5;
  initial begin
    for (i = 0; i < 5; i = i + 1) begin
      $display ("Loop #%0d", i);
    end
  end
endmodule

Simulationslog:

ncsim> run
Loop #0
Loop #1
Loop #2
Loop #3
Loop #4
ncsim: *W,RNQUIE: Simulation is complete.

Hier klicken, um mehr über for-Schleifen zu erfahren.

Verilog

  1. C# Ausdrücke, Anweisungen & Blöcke: Umfassender Leitfaden mit Beispielen
  2. Java Ausdrücke, Anweisungen und Blöcke verstehen
  3. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  4. Verilog Concatenation meistern: Praktischer Leitfaden
  5. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  6. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  7. Verilog Control Flow meistern: IF-ELSE, Case, Loops und mehr
  8. Verilog Functions meistern für effizientes RTL-Design
  9. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  10. Verilog Delay Control verstehen: Timing-Techniken und Best Practices