Guide complet des conversions de types VHDL avec Numeric_Std et Std_Logic_Arith
Utiliser les packages Numeric_Std et Std_Logic_Arith
Vous trouverez ci-dessous les conversions de types VHDL les plus fréquemment utilisées. L'article est divisé en deux sections : la première présente les conversions basées sur le package moderne numeric_std, tandis que la seconde montre les conversions équivalentes avec le package legacy std_logic_arith. Bien que de nombreux concepteurs utilisent encore std_logic_arith, la meilleure pratique industrielle recommande numeric_std pour sa clarté et sa portabilité.
Remarquez que de nombreux exemples emploient l'attribut VHDL 'length, qui assure l'adaptation automatique du code aux changements de largeur de vecteur — une stratégie clé pour des designs réutilisables et maintenables.
Exemples de conversions avec Numeric_Std
- Entier vers Signé
- Entier vers Std_Logic_Vector
- Entier vers Non-signé
- Std_Logic_Vector vers Entier
- Std_Logic_Vector vers Signé
- Std_Logic_Vector vers Non-signé
- Signé vers Entier
- Signé vers Std_Logic_Vector
- Signé vers Non-signé
- Non-signé vers Entier
- Non-signé vers Signé
- Non-signé vers Std_Logic_Vector
Exemples de conversions avec Std_Logic_Arith
- Entier vers Signé
- Entier vers Std_Logic_Vector
- Entier vers Non-signé
- Std_Logic_Vector vers Entier
- Std_Logic_Vector vers Signé
- Std_Logic_Vector vers Non-signé
- Signé vers Entier
- Signé vers Std_Logic_Vector
- Signé vers Non-signé
- Non-signé vers Entier
- Non-signé vers Signé
- Non-signé vers Std_Logic_Vector
Convertir d'Entier vers Signé avec Numeric_Std
La fonction to_signed requiert deux arguments : l'entier à convertir et la largeur de vecteur désirée. L'utilisation de l'attribut 'length garde le code flexible.
signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= to_signed(input_3, output_3'length);
Convertir d'Entier vers Std_Logic_Vector avec Numeric_Std
Déterminez si la plage de l'entier est signée ou non-signée. Pour valeurs positives seulement utilisez to_unsigned ; pour valeurs signées utilisez to_signed. Les deux fonctions acceptent la valeur et la largeur cible.
signal input_1 : integer; signal output_1a : std_logic_vector(3 downto 0); signal output_1b : std_logic_vector(3 downto 0); -- Entiers positifs seulement output_1a <= std_logic_vector(to_unsigned(input_1, output_1a'length)); -- Entiers signés ou non-signés output_1b <= std_logic_vector(to_signed(input_1, output_1b'length));
Convertir d'Entier vers Non-signé avec Numeric_Std
signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= to_unsigned(input_2, output_2'length);
Convertir de Std_Logic_Vector vers Entier avec Numeric_Std
D'abord caster le vecteur vers unsigned ou signed selon la sémantique des données, puis appliquer to_integer.
signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- Cas non-signé output_4a <= to_integer(unsigned(input_4)); -- Cas signé output_4b <= to_integer(signed(input_4));
Convertir de Std_Logic_Vector vers Signé avec Numeric_Std
signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);
Convertir de Std_Logic_Vector vers Non-signé avec Numeric_Std
signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);
Convertir de Signé vers Entier avec Numeric_Std
signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= to_integer(input_10);
Convertir de Signé vers Std_Logic_Vector avec Numeric_Std
signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);
Convertir de Signé vers Non-signé avec Numeric_Std
signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);
Convertir de Non-signé vers Entier avec Numeric_Std
signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= to_integer(input_7);
Convertir de Non-signé vers Signé avec Numeric_Std
signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);
Convertir de Non-signé vers Std_Logic_Vector avec Numeric_Std
signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);
Convertir d'Entier vers Signé avec Std_Logic_Arith
signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= conv_signed(input_3, output_3'length);
Convertir d'Entier vers Std_Logic_Vector avec Std_Logic_Arith
signal input_1 : integer; signal output_1 : std_logic_vector(3 downto 0); output_1 <= conv_std_logic_vector(input_1, output_1'length);
Convertir d'Entier vers Non-signé avec Std_Logic_Arith
signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= conv_unsigned(input_2, output_2'length);
Convertir de Std_Logic_Vector vers Entier avec Std_Logic_Arith
signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- Cas non-signé output_4a <= conv_integer(unsigned(input_4)); -- Cas signé output_4b <= conv_integer(signed(input_4));
Convertir de Std_Logic_Vector vers Signé avec Std_Logic_Arith
signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);
Convertir de Std_Logic_Vector vers Non-signé avec Std_Logic_Arith
signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);
Convertir de Signé vers Entier avec Std_Logic_Arith
signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= conv_integer(input_10);
Convertir de Signé vers Std_Logic_Vector avec Std_Logic_Arith
signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);
Convertir de Signé vers Non-signé avec Std_Logic_Arith
signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);
Convertir de Non-signé vers Entier avec Std_Logic_Arith
signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= conv_integer(input_7);
Convertir de Non-signé vers Signé avec Std_Logic_Arith
signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);
Convertir de Non-signé vers Std_Logic_Vector avec Std_Logic_Arith
signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);
VHDL
- Introduction à VHDL : construire votre première porte ET
- Exemple de procédure VHDL : incrémenter un std_logic_vector
- Exploiter les records VHDL pour des interfaces FIFO propres et réutilisables
- Maîtriser les types Signé vs Non-signé en VHDL : insights pratiques
- Variables VHDL expliquées : exemples pratiques et règles pour un design fiable
- Maîtriser la vérification formelle de modules VHDL avec PSL
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
- Terminer proprement une simulation de banc de test VHDL
- Implémenter un contrôleur PWM en VHDL : Conception, simulation et démo FPGA