VHDL Variables erklärt: Praxisbeispiele & Regeln für zuverlässiges Design
In VHDL verhalten sich Variablen ähnlich wie C-Variablen: Ihr Wert ist sofort nach einer Zuweisung verfügbar und bleibt unverändert bis zur nächsten Zuweisung. Das macht sie ideal für temporäre Speicherung und prozedurale Berechnungen innerhalb eines Prozesses.
Wichtige Regeln für Variablen in VHDL
- Variablen sind auf den Prozess beschränkt, in dem sie deklariert werden.
- Jeder Prozess hat seinen eigenen Variablensatz; sie können nicht prozessübergreifend geteilt werden.
- Deklarieren Sie Variablen zwischen
processKeyword undbeginKeyword. - Zuweisungen nutzen den
:=Operator. - Nach Zuweisung hält die Variable den neuen Wert sofort für nachfolgende Statements im selben Prozess.
Der letzte Punkt – sofortige Zuweisung – ist oft Verwirrungsquelle. Unten ein prägnantes Beispiel, das demonstriert, wie eine Variable zwei Signale konkatenieren und ein Case-Statement treiben kann.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- Konkatenation case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- weitere Cases der Kürze halber weggelassen end case; end process VAR_CASE;
In diesem Snippet ist v_Choices sofort nach der Konkatenation für das case Statement verfügbar, was die instantane Aktualisierung der Variable illustriert.
Für eine tiefere Illustration betrachten Sie folgende Architektur, die einen Zähler mit zwei Signal-Kopien trackt. Obwohl die zwei Signale identisch erscheinen, erreicht nur r_Var_Copy1 den Wert 5 vor Reset, weil r_Var_Copy2 zugewiesen wird, nachdem der Zähler im selben Clock-Zyklus bereits zurückgesetzt wurde.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity variable_ex is port ( i_clk : in std_logic; o_done : out std_logic ); end variable_ex; architecture rtl of variable_ex is signal r_Done : std_logic := '0'; signal r_Var_Copy1 : natural range 0 to 5 := 0; signal r_Var_Copy2 : natural range 0 to 5 := 0; begin EX_VAR : process (i_clk) variable v_Count : natural range 0 to 5 := 0; begin if rising_edge(i_clk) then v_Count := v_Count + 1; r_Var_Copy1 <= v_Count; if v_Count = 5 then r_Done <= '1'; v_Count := 0; else r_Done <= '0'; end if; r_Var_Copy2 <= v_Count; end if; end process EX_VAR; o_done <= r_Done; end rtl;
Um dieses Verhalten in Simulation zu beobachten, wird ein einfacher Testbench bereitgestellt. Er toggelt den Clock und monitored den o_done Output. In ModelSim erscheinen Variablen im Waveform-Fenster nur, wenn die Variable-Display-Option des Simulators aktiviert ist.
library ieee; use ieee.std_logic_1164.all; entity variable_ex_tb is end variable_ex_tb; architecture behave of variable_ex_tb is component variable_ex port ( i_clk : in std_logic; o_done : out std_logic ); end component variable_ex; constant c_CLK_PERIOD : time := 10 ns; signal r_CLK : std_logic := '0'; signal w_DONE : std_logic; begin UUT : variable_ex port map ( i_clk => r_CLK, o_done => w_DONE ); r_CLK <= not r_CLK after c_CLK_PERIOD/2; end behave;
Dieses Beispiel hebt die unterschiedlichen Verhaltensweisen von Variablen vs. Signalen hervor: Während r_Var_Copy1 5 erreicht, tut r_Var_Copy2 dies nie, weil die Variable vor der Signalzuweisung zurückgesetzt wird.
VHDL
- VHDL Procedure Beispiel: Inkrementieren eines Standard Logic Vectors
- VHDL Records für saubere, wiederverwendbare FIFO-Interfaces nutzen
- SPICE AC/DC/Transient-Analyse: Kurven, Punkte, Frequenz-Sweep & Optionen
- C# Variablen & Primitive Datentypen meistern: Der komplette Guide
- C++-Variablen, Literale und Konstanten meistern: Ein umfassender Leitfaden
- C Variablen, Konstanten und Literale: Ein vollständiger Leitfaden
- C Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer und Performance
- C Strings einfach gemacht: Deklaration, Ein- & Ausgabe, Bibliotheksfunktionen
- Java Variablentypen verstehen: Ein umfassender Leitfaden
- Variablen in C verstehen: Typen, Benennungsregeln & Speicherverwaltung