std_logic_vector in VHDL meistern: Signalvektoren erstellen
Der Typ std_logic_vector ist VHDLs Standard für Signalbusse. Während std_logic den Zustand einer einzelnen Leitung modelliert, erweitert std_logic_vector dies zu einem Array von Leitungen – ermöglicht Repräsentation mehrbitiger Busse.
Im Gegensatz zum Einbit-std_logic ist std_logic_vector ein kompositer Typ – indizierte Sammlung von std_logic Elementen. Er kann beliebig viele Bits halten, ideal für Komponenten, die mehrbitige Daten austauschen.
Teil der Basic VHDL Tutorials Serie.
std_logic_vector Signal deklarieren:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial>; signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial>;
<name> = Bezeichner, <initial> optional. <lsb>, <msb> = Indizes least/most significant bit.
to oder downto legt Richtungsrichtung fest (Endianness). Beide funktionieren, aber die meisten Designer bevorzugen downto für Klarheit. Empfehlung: Konsistent downto bei Bitvektoren nutzen.
Byte-weiter Vektor:
signal MySlv : std_logic_vector(7 downto 0);
Ein-Bit-Vektor:
signal MySlv : std_logic_vector(0 downto 0);
Leerer Bereich (null Bits):
signal MySlv : std_logic_vector(-1 downto 0);
Übung
Video: std_logic_vector Signale deklarieren, Initialwerte setzen, For-Loop über Bits iterieren für Schieberegister.
Finaler Code:
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 Prozess
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;
ModelSim Wellenform nach Run, Zoom auf Timeline:
Analyse
Sechs 8-Bit std_logic_vector Busse (1 Byte) deklariert.
Slv1ohne Initialwert → Wellenform zeigtXX(Hex kann Unknown nicht darstellen); einzelne Bits sindU.Slv2Aggregate(others => '0')→ alle Bits null. Knappe Syntax, breitenunabhängig.Slv3Aggregate(others => '1')→ alle Bits eins → HexFF.Slv4Hex-InitialwertAA(2 Hex-Ziffern = 8 Bit).Slv5identischer Wert, aber binär10101010. Beide rendern alsAA.Slv6Start: alle Null bis LSB=1. Prozess implementiert Links-Schieberegister, das die 1 alle 10 ns durch den Vektor zirkuliert.
Prozess nutzt 'left/'right Attribute für generischen Code – Vektorgröße änderbar ohne Code-Änderung.
Weitere Attribute existieren, aber übersteigen Einführungsrahmen.
Merksätze
- N-Bit Vektoren mit
std_logic_vector(N-1 downto 0)deklarieren. - Vektor ganz oder bitweise zugreifbar.
- Alle Bits mit Aggregate
(others => '0')nullen. - Attribute
'left,'rightmachen Code generisch und wartbar.
Basic VHDL Quiz – Teil 2 »
oder
Nächstes Tutorial »
VHDL
- Umfassender Guide zu VHDL Typkonvertierungen mit Numeric_Std & Std_Logic_Arith
- Signed vs. Unsigned in VHDL meistern: Praktische Einblicke
- String-Listen in VHDL erstellen: Best Practices & Beispiel
- Tcl-gesteuerter Testbench für ein VHDL Code-Lock-Modul erstellen
- VHDL-Testbench-Simulation sauber beenden
- PWM-Controller in VHDL implementieren: Design, Simulation & FPGA-Demo
- Zufallszahlen in VHDL generieren: Von Uniform zu OSVVM
- Ein robuster VHDL-Ringpuffer-FIFO im Block-RAM entwerfen
- Selbstprüfenden VHDL-Testbench erstellen – Praxisleitfaden
- Dynamische verkettete Liste in VHDL mit Protected Types und Access-Pointern