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

So erstellen Sie einen Signalvektor in VHDL:std_logic_vector

Der std_logic_vector Typ kann zum Erstellen von Signalbussen in VHDL verwendet werden. Die std_logic ist der am häufigsten verwendete Typ in VHDL und der std_logic_vector ist die Array-Version davon.

Während die std_logic eignet sich hervorragend zum Modellieren des Werts, der von einem einzelnen Draht übertragen werden kann, ist jedoch nicht sehr praktisch zum Implementieren von Sammlungen von Drähten, die zu oder von Komponenten gehen. Die std_logic_vector ist ein zusammengesetzter Typ, was bedeutet, dass es sich um eine Sammlung von Unterelementen handelt. Signale oder Variablen des std_logic_vector type kann eine beliebige Anzahl von std_logic enthalten Elemente.

Dieser Blogpost ist Teil der Reihe Basic VHDL Tutorials.

Die Syntax zum Deklarieren von std_logic_vector Signale ist:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
oder
signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
wobei <name> ist ein willkürlicher Name für das Signal und <initial_value> ist ein optionaler Anfangswert. Die <lsb> ist der Index des niedrigstwertigen Bits und <msb> ist der Index des höchstwertigen Bits.

Die to oder downto gibt die Richtung der Reichweite des Busses an, im Grunde seine Endianness. Obwohl beide gleich gut funktionieren, deklarieren VHDL-Designer Vektoren am häufigsten mit downto . Daher empfehle ich Ihnen, immer downto zu verwenden wenn Sie Bitvektoren deklarieren, um Verwirrung zu vermeiden.

Der VHDL-Code zum Deklarieren eines Vektorsignals, das ein Byte enthalten kann:
signal MySlv : std_logic_vector(7 downto 0);

Der VHDL-Code zum Deklarieren eines Vektorsignals, das ein Bit enthalten kann:
signal MySlv : std_logic_vector(0 downto 0);

Der VHDL-Code zum Deklarieren eines Vektorsignals, das Null-Bits enthalten kann (ein leerer Bereich ):
signal MySlv : std_logic_vector(-1 downto 0);

Übung

In diesem Video-Tutorial lernen wir, wie man std_logic_vector deklariert Signale und geben ihnen Anfangswerte. Wir lernen auch, wie man mit einer For-Schleife über die Bits in einem Vektor iteriert, um ein Schieberegister zu erstellen :

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

library ieee;
use ieee.std_logic_1164.all;

entity T11_StdLogicVectorTb is
end entity;

architecture sim of T11_StdLogicVectorTb is

    signal Slv1 : std_logic_vector(7 downto 0);
    signal Slv2 : std_logic_vector(7 downto 0) := (others => '0');
    signal Slv3 : std_logic_vector(7 downto 0) := (others => '1');
    signal Slv4 : std_logic_vector(7 downto 0) := x"AA";
    signal Slv5 : std_logic_vector(0 to 7)     := "10101010";
    signal Slv6 : std_logic_vector(7 downto 0) := "00000001";

begin

    -- Shift register
    process is
    begin

        wait for 10 ns;

        for i in Slv6'left downto Slv6'right + 1 loop
            Slv6(i) <= Slv6(i-1);
        end loop;

        Slv6(Slv6'right) <= Slv6(Slv6'left);

    end process;

end architecture;

Das Wellenformfenster in ModelSim, nachdem wir auf Ausführen gedrückt und die Zeitachse vergrößert haben:

Analyse

In dieser Übung haben wir sechs std_logic_vector deklariert Busse, jeweils acht Bit lang (ein Byte).

Signal Slv1 wurde ohne Anfangswert deklariert. Der Bus hat im Wellenform-Screenshot den Wert XX. Dies liegt daran, dass der auf dem Bus angezeigte Wert hexadezimal ist und XX einen nicht hexadezimalen Wert angibt. Aber als wir den Bus in der Wellenform erweiterten, konnten wir sehen, dass die einzelnen Bits tatsächlich U’s waren.

Signal Slv2 wurde mit einem Anfangswert aus lauter Nullen deklariert. Anstatt den genauen Wert für jedes Bit anzugeben, haben wir (other => '0') verwendet anstelle des Anfangswertes. Dies wird als Aggregat bezeichnet Abtretung. Der wichtige Teil ist, dass alle Bits im Vektor auf das gesetzt werden, was Sie angeben, egal wie lang er ist.

Signal Slv3 wurde unter Verwendung einer aggregierten Zuweisung deklariert, um allen Bits den Anfangswert 1 zu geben. Wir können FF sehen, das auf diesem Signal in der Wellenform angezeigt wird, was hex für acht Einsen ist.

Signal Slv4 wurde mit einem in Hex, AA angegebenen Anfangswert deklariert. Jede Hex-Ziffer ist 4 Bit lang, daher müssen wir zwei Ziffern (AA) für unseren 8 Bit langen Vektor angeben.

Signal Slv5 deklariert genau denselben Anfangswert wie Slv4 , aber jetzt haben wir es als den Binärwert 10101010 angegeben. Wir können an der Wellenform sehen, dass beide Signale den Hex-Wert AA haben.

Signal Slv6 wurde mit einem Anfangswert aus lauter Nullen deklariert, mit Ausnahme des Bits ganz rechts, das '1' war . Wir haben einen Prozess verwendet, um ein Schieberegister zu erstellen von diesem Signal. Das Schieberegister verschiebt, wie der Name schon sagt, den Inhalt des Vektors alle 10 Nanosekunden um eine Stelle nach links.

Unser Prozess wacht alle 10 ns auf und die For-Schleife verschiebt alle Bits im Vektor um eine Stelle nach links. Das letzte Bit wird durch die Slv6(Slv6'right) <= Slv6(Slv6'left); zurück in den ersten Index geschoben Aussage. In der Wellenform sehen wir den '1' Welligkeit durch den Vektor.

Dies ist eine Visualisierung, wie der '1' propagiert durch unser Schieberegister:

Durch die Verwendung des 'left' und 'right Attribute haben wir unseren Code allgemeiner gemacht. Wenn wir die Breite von Sig6 ändern , funktioniert der Prozess trotzdem. Es ist eine gute Designpraxis, Attribute zu verwenden, wo immer Sie können, anstatt Werte fest zu codieren.

Sie fragen sich vielleicht, ob es noch mehr Attribute gibt, die Sie verwenden können, und das gibt es. Ich werde in dieser Tutorial-Reihe nicht weiter darauf eingehen, da ich sie für fortgeschrittene VHDL-Features halte.

Imbiss

Nehmen Sie am Basic VHDL Quiz – Teil 2 teil »
oder
gehen Sie zum nächsten Tutorial »


VHDL

  1. Beispiele für VHDL-Konvertierungen
  2. Signiert vs. Unsigniert in VHDL
  3. So erstellen Sie eine Liste von Zeichenfolgen in VHDL
  4. So erstellen Sie eine Tcl-gesteuerte Testbench für ein VHDL-Code-Sperrmodul
  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 erstellen Sie einen Ringpuffer-FIFO in VHDL
  9. So erstellen Sie eine selbstüberprüfende Testbench
  10. So erstellen Sie eine verknüpfte Liste in VHDL