VHDL Variabelen Uitgelegd: Praktische Voorbeelden & Regels voor Betrouwbaar Ontwerp
In VHDL gedragen variabelen zich vergelijkbaar met C-variabelen: hun waarde is direct beschikbaar na een toewijzing en blijft ongewijzigd tot de volgende toewijzing. Dit maakt ze ideaal voor tijdelijke opslag en procedurale berekeningen binnen een proces.
Belangrijkste Regels voor Variabelen in VHDL
- Variabelen zijn beperkt tot het proces waarin ze gedeclareerd zijn.
- Elk proces heeft zijn eigen set variabelen; ze kunnen niet gedeeld worden tussen processen.
- Declareer variabelen tussen het
processtrefwoord en hetbegintrefwoord. - Toewijzingen gebruiken de
:=operator. - Eenmaal toegewezen, houdt een variabele direct de nieuwe waarde voor volgende statements in hetzelfde proces.
Het laatste punt – instantane toewijzing – is vaak de bron van verwarring. Hieronder is een beknopt voorbeeld dat demonstreert hoe een variabele gebruikt kan worden om twee signalen te concateneren en een case-statement aan te sturen.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- concatenatie case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- extra cases weggelaten voor kortheid end case; end process VAR_CASE;
In deze snippet is v_Choices beschikbaar voor het case statement direct na de concatenatie, wat de instantane update van de variabele illustreert.
Voor een diepere illustratie, overweeg de volgende architectuur die een teller volgt met twee signaalcopies. Hoewel de twee signalen identiek lijken, bereikt alleen r_Var_Copy1 de waarde 5 voor reset omdat r_Var_Copy2 toegewezen wordt na het teller al gereset is binnen dezelfde klokcyclus.
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;
Om dit gedrag in simulatie te observeren, wordt een eenvoudige testbench geleverd. Het toggelt de klok en monitort de o_done output. Wanneer u ModelSim gebruikt, onthoud dat variabelen in het golfvenster alleen zichtbaar zijn als de simulator's variable display optie ingeschakeld is.
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;
Dit voorbeeld benadrukt het verschil tussen variabelen en signalen: terwijl r_Var_Copy1 5 bereikt, doet r_Var_Copy2 dat nooit omdat de variabele gereset wordt voordat de signaaltoewijzing.
VHDL
- AC-Analyse Configuratie: Kurven, Punten en Frequentie-sweep Instellingen
- C# Variabelen & Primitive Datatypes onder de knie krijgen: Complete gids
- C++ variabelen, literalen en constanten: een uitgebreide gids
- C Variabelen, Constanten en Literals: Een Complete Gids
- C-opslagklassen begrijpen: Bereik, levensduur en prestaties
- C Strings Makkelijk Gemaakt: Declaratie, Invoer, Uitvoer en Bibliotheekfuncties
- Variabelen in C: Types, naamgevingsregels en geheugenbeheer
- Variabelenscope in C++ Begrijpen: Lokale vs Globale Variabelen
- VHDL Procedure Voorbeeld: Een Standard Logic Vector Incrementeren
- VHDL Records Gebruiken voor Schone, Herbruikbare FIFO-interfaces
- Java Variabele Typen: Uitgebreide Gids