Les fonctions VHDL pratiques à connaître dans std_logic_1164, numeric_std, std.env, textio et math_real.
Les packages standard donnent les conversions, les opérations numériques et les outils de test. Choisis-les selon le type de donnée et le contexte : calcul RTL, élaboration ou simulation.
Pour l'arithmétique vectorielle, utilise numeric_std. Les packages historiques std_logic_arith, std_logic_unsigned et std_logic_signed ne sont pas normalisés par l'IEEE.
Lire les niveaux et les fronts
std_logic_1164 définit les types logiques à neuf états et les fonctions associées :
Fonction
Usage
rising_edge(i_clk)
Détecter un front montant d'horloge
falling_edge(i_clk)
Détecter un front descendant
Is_X(w_bus)
Détecter une valeur inconnue ('U', 'X', etc.)
To_01(w_bus)
Ramener un vecteur vers des 0/1
to_hstring(w_bus)
Afficher un vecteur en hexadécimal en simulation
Pour un registre sur front montant, emploie rising_edge :
p_reg : process(i_clk)begin if rising_edge(i_clk) then if i_rst = '1' then r_count <= (others => '0'); else r_count <= r_count + 1; end if; end if;end process p_reg;
Cette fonction reconnaît les transitions entre niveaux bas et hauts valides de std_logic, y compris les niveaux faibles. Un simple i_clk'event and i_clk = '1' peut aussi accepter une transition depuis un état inconnu.
Dans un testbench, Is_X détecte les valeurs inconnues avant de valider le résultat :
assert not Is_X(o_data) report "o_data contient une valeur inconnue : " & to_hstring(o_data) severity error;
Ce contrôle concerne le modèle de simulation ; il ne décrit pas une mesure matérielle d'un état X.
Convertir et calculer avec numeric_std
Fonction
Usage
to_unsigned(i, n)
Convertir un entier naturel vers unsigned(n-1 downto 0)
to_signed(i, n)
Convertir un entier signé vers signed(n-1 downto 0)
to_integer(x)
Convertir unsigned ou signed vers integer
resize(x, n)
Adapter la largeur d'un unsigned ou signed
shift_left(x, n)
Décalage à gauche
shift_right(x, n)
Décalage à droite
rotate_left(x, n)
Rotation à gauche
rotate_right(x, n)
Rotation à droite
Les conversions vers un bus fixent explicitement sa largeur :
signal r_count : unsigned(7 downto 0);signal w_index : integer range 0 to 255;w_index <= to_integer(r_count);r_count <= to_unsigned(42, r_count'length);
resize étend un unsigned avec des zéros et un signed avec son signe. Pour conserver la retenue d'une addition, élargis les opérandes avant de calculer :
En VHDL-2008, std.env.finish donne une fin explicite au scénario :
library STD;use STD.ENV.ALL;-- fin de testbenchreport "Test terminé" severity note;finish;
textio sert à lire des stimuli, comparer des résultats ou écrire un journal. Avec les fonctions de lecture et d'écriture hexadécimales, tu peux manipuler directement les vecteurs :
library STD;use STD.TEXTIO.ALL;library IEEE;use IEEE.STD_LOGIC_1164.ALL;file f_vectors : text open read_mode is "vectors.txt";variable v_line : line;variable v_data : std_logic_vector(7 downto 0);variable v_ok : boolean;readline(f_vectors, v_line);hread(v_line, v_data, v_ok);assert v_ok report "Ligne de stimulus invalide" severity error;
Ces instructions s'utilisent dans les zones adaptées d'un testbench, avec les packages et la version VHDL nécessaires.
Préparer des calculs de simulation
math_real propose notamment sqrt, ceil, floor, sin, cos et uniform. Il sert aux testbenches et aux constantes calculées à l'élaboration ; ces appels sur des valeurs real ne décrivent généralement pas du calcul matériel à l'exécution.
uniform produit des stimuli pseudo-aléatoires à partir de deux graines :