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

Unterschied zwischen Signalen und Variablen in VHDL verstehen

Im vorherigen Tutorial lernten wir, wie man eine Variable innerhalb eines Prozesses deklariert. Variablen eignen sich ideal für lokale algorithmische Arbeit, sind aber außerhalb dieses Prozesses nicht sichtbar. Wenn ein Wert mit anderen Teilen des Designs geteilt werden soll, verwendet man ein Signal.

Signale werden im deklarativen Bereich einer Architecture deklariert – also zwischen der Zeile architecture <architecture_name> of <entity_name> is und dem Schlüsselwort begin.

Dieser Beitrag gehört zur Serie „Basic VHDL Tutorials“.

Die Syntax für die Signaldeklaration lautet:
signal <name> : <type>;

Ein Signal kann optional mit einem Initialwert deklariert werden:
signal <name> : <type> := <initialwert>;

Übung

In diesem Video-Tutorial lernen wir, ein Signal zu deklarieren und den Kernunterschied zwischen Variable und Signal zu erkennen.

Der finale Code dieses Tutorials:

entity T06_SignalTb is end entity;
architecture sim of T06_SignalTb is
  signal MySignal : integer := 0;
begin
  process is
    variable MyVariable : integer := 0;
  begin
    report "*** Process begin ***";
    MyVariable := MyVariable + 1;
    MySignal   <= MySignal + 1;
    report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
    MyVariable := MyVariable + 1;
    MySignal   <= MySignal + 1;
    report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
    wait for 10 ns;
    report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal);
  end process;
end architecture;

Die Ausgabe in der Simulatorkonsole beim Drücken von Run in ModelSim:

VSIM 2> run
# ** Note: *** Process begin ***
# Time: 0 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=1, MySignal=0
# Time: 0 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=0
# Time: 0 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=1
# Time: 10 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: *** Process begin ***
# Time: 10 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=3, MySignal=1
# Time: 10 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=1
# Time: 10 ns Iteration: 0 Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=2
# Time: 20 ns Iteration: 0 Instance: /t06_signaltb ...

Analyse

Wir erstellten ein Signal und eine Variable mit demselben Initialwert 0. Obwohl wir sie im Prozess identisch behandelten, zeigt die Konsolenausgabe unterschiedliches Verhalten. Die wesentlichen Unterschiede sind:

In unserem Beispiel gingen die ersten beiden Inkremente von MySignal verloren, da sie vor dem wait for 10 ns; überschrieben wurden. Der anschließende Inkrement erscheint nach der Unterbrechung, wie erwartet.

Zusammenfassung

Zum nächsten Tutorial »


VHDL

  1. Signed vs. Unsigned in VHDL meistern: Praktische Einblicke
  2. VHDL Variables erklärt: Praxisbeispiele & Regeln für zuverlässiges Design
  3. Cloud Computing vs. Traditional Computing: Praktischer Vergleich
  4. String-Listen in VHDL erstellen: Best Practices & Beispiel
  5. VHDL-Testbench-Simulation sauber beenden
  6. PWM-Controller in VHDL implementieren: Design, Simulation & FPGA-Demo
  7. Zufallszahlen in VHDL generieren: Von Uniform zu OSVVM
  8. In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
  9. VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
  10. BeiDou Navigationssystem erklärt: Wie es sich von GPS abhebt