Variables VHDL expliquées : exemples pratiques et règles pour un design fiable
En VHDL, les variables se comportent de manière similaire aux variables C : leur valeur est disponible immédiatement après une affectation et reste inchangée jusqu'à la prochaine affectation. Cela les rend idéales pour le stockage temporaire et les calculs procéduraux au sein d'un processus.
Règles clés pour l'utilisation des variables en VHDL
- Les variables sont confinées au processus dans lequel elles sont déclarées.
- Chaque processus a son propre ensemble de variables ; elles ne peuvent pas être partagées entre processus.
- Déclarez les variables entre le mot-clé
processet le mot-clébegin. - Les affectations utilisent l'opérateur
:=. - Une fois affectée, une variable tient immédiatement la nouvelle valeur pour les instructions subséquentes dans le même processus.
Ce dernier point — l'affectation instantanée — est souvent source de confusion. Voici un exemple concis démontrant comment une variable peut concaténer deux signaux et piloter une instruction case.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- concaténation case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- cas additionnels omis pour la brièveté end case; end process VAR_CASE;
Dans cet extrait, v_Choices est disponible pour l'instruction case immédiatement après la concaténation, illustrant la mise à jour instantanée de la variable.
Pour une illustration plus approfondie, considérez l'architecture suivante qui suit un compteur avec deux copies de signal. Bien que les deux signaux semblent identiques, seul r_Var_Copy1 atteint la valeur 5 avant reset car r_Var_Copy2 est affecté après que le compteur a déjà été remis à zéro dans le même cycle d'horloge.
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;
Pour observer ce comportement en simulation, un testbench simple est fourni. Il bascule l'horloge et surveille la sortie o_done. Avec ModelSim, rappelez-vous que les variables apparaissent dans la fenêtre d'ondes seulement si l'option d'affichage des variables du simulateur est activée.
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;
Cet exemple met en évidence les comportements distincts des variables versus signaux : tandis que r_Var_Copy1 atteint 5, r_Var_Copy2 ne l'atteint jamais car la variable est remise à zéro avant l'affectation du signal.
VHDL
- Exemple de procédure VHDL : incrémenter un std_logic_vector
- Exploiter les records VHDL pour des interfaces FIFO propres et réutilisables
- Configuration analyse AC, DC, transitoire, Fourier et options SPICE
- Maîtriser les variables C# et types de données primitifs : guide complet
- Maîtriser les variables, littéraux et constantes en C++ : Guide complet
- Variables, constantes et littéraux en C : Guide complet
- Comprendre les classes de stockage en C : Portée, durée de vie et performance
- Chaînes de caractères en C simplifiées : Déclaration, entrée, sortie et fonctions de bibliothèque
- Comprendre les Types de Variables en Java : Guide Complet