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

Wie sich ein Signal von einer Variable in VHDL unterscheidet

Im vorherigen Tutorial haben wir gelernt, wie man eine Variable in einem Prozess deklariert. Variablen eignen sich gut zum Erstellen von Algorithmen innerhalb eines Prozesses, sind aber für die Außenwelt nicht zugänglich. Wenn sich der Gültigkeitsbereich einer Variablen nur innerhalb eines einzelnen Prozesses befindet, wie kann er dann mit irgendeiner anderen Logik interagieren? Die Lösung dafür ist ein Signal .

Signale werden zwischen architecture <architecture_name> of <entity_name> is deklariert Zeile und die begin Anweisungen in der VHDL-Datei. Dies wird als deklarativer Teil der Architektur bezeichnet.

Dieser Blogpost ist Teil der Reihe Basic VHDL Tutorials.

Die Syntax zum Deklarieren eines Signals lautet:
signal <name> : <type>;

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

Übung

In diesem Video-Tutorial lernen wir, wie man ein Signal deklariert. Wir werden auch den Hauptunterschied zwischen einer Variablen und einem Signal kennenlernen:

Der endgültige Code, den wir in diesem Tutorial erstellt haben:

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 an die Simulatorkonsole, wenn wir in ModelSim die Run-Taste gedrückt haben:

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 haben ein Signal und eine Variable mit demselben Anfangswert von 0 erstellt. In unserem Prozess haben wir sie genau gleich behandelt, aber die Ausdrucke zeigen, dass sie sich anders verhalten haben. Zuerst haben wir gesehen, dass die Zuweisung an eine Variable und ein Signal in VHDL eine andere Schreibweise hat. Die Variablenzuweisung verwendet den := Operator, während die Signalzuweisung den <= verwendet Betreiber.

MyVariable verhält sich so, wie man es von einer Variablen erwarten würde. In der ersten Iteration der Schleife wird es auf 1 und dann auf 2 erhöht. Der letzte Ausdruck der ersten Iteration zeigt, dass sein Wert immer noch 2 ist, wie wir es erwarten würden.

MySignal verhält sich etwas anders. Die erste Erhöhung um +1 scheint keine Wirkung zu haben. Der Ausdruck zeigt, dass sein Wert immer noch 0 ist, der Anfangswert. Dasselbe gilt nach dem zweiten Inkrement von +1. Nun der Wert von MyVariable ist 2, aber der Wert von MySignal ist immer noch 0. Nach wait for 10 ns; der dritte Ausdruck zeigt, dass der Wert von MySignal ist jetzt 1. Die nachfolgenden Ausdrucke folgen ebenfalls diesem Muster.

Was ist das für eine Zauberei? Ich gebe Ihnen einen Hinweis, die wait for 10 ns; hat etwas damit zu tun. Signale werden nur aktualisiert, wenn ein Prozess angehalten wird. Unser Prozess hält nur an einer Stelle an, bei wait for 10 ns; . Daher ändert sich der Signalwert nur bei jedem Treffer auf diese Linie. Die 10 Nanosekunden sind ein willkürlicher Wert, es könnte alles sein, sogar 0 Nanosekunden. Probieren Sie es aus!

Eine weitere wichtige Beobachtung ist dieses Ereignis, obwohl das Signal vor wait zweimal erhöht wurde , sein Wert wird nur einmal erhöht. Denn bei der Zuordnung zu einem Signal in einem Prozess „gewinnt“ die letzte Zuordnung. Die <= Der Operator plant nur einen neuen Wert auf das Signal, er ändert sich nicht bis wait . Daher beim zweiten Inkrement von MySignal , 1 wird zu seinem alten hinzugefügt Wert. Beim erneuten Inkrementieren geht das erste Inkrement vollständig verloren.

Imbiss

Weiter zum nächsten Tutorial »


VHDL

  1. Signiert vs. Unsigniert in VHDL
  2. Variablen – VHDL-Beispiel
  3. Inwiefern unterscheidet sich Cloud Computing von herkömmlichem Computing?
  4. So erstellen Sie eine Liste von Zeichenfolgen in VHDL
  5. So stoppen Sie die Simulation in einer VHDL-Testbench
  6. So erstellen Sie einen PWM-Controller in VHDL
  7. So generieren Sie Zufallszahlen in VHDL
  8. So verwenden Sie eine Prozedur in einem Prozess in VHDL
  9. So verwenden Sie eine Funktion in VHDL
  10. Was ist das BeiDou-Satellitennavigationssystem? Wie unterscheidet es sich von GPS?