Maîtriser les types signed et unsigned en VHDL : Guide pratique
En VHDL, signed et unsigned sont des vecteurs de bits spécialisés qui vous permettent d'effectuer de l'arithmétique sur des bus de données. Contrairement à std_logic_vector, qui est idéal pour router des signaux mais pas pour les calculs, ces types sont interprétés comme des valeurs numériques par le compilateur.
Tenter d'additionner un std_logic_vector déclenchera l'erreur de compilation : No feasible entries for infix operator "+", car l'outil ne peut pas déterminer comment traiter le motif de bits brut comme un nombre.
Partie de la série Tutoriels VHDL de Base.
Pour activer l'arithmétique, déclarez un vecteur comme signed ou unsigned :
signal <name> : signed(<N-1> downto 0) := <initial_value>;
signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
La plage peut utiliser to ou downto, mais downto 0 est le plus courant. La valeur initiale est optionnelle ; si omise, tous les bits defaultent à 'U'.
Pourquoi préférer signed/unsigned au integer traditionnel ? Les concepteurs numériques ont souvent besoin d'un contrôle précis sur la largeur de bits. Ces types vectoriels font un retour à zéro (wrap) sur débordement, tandis que integer lèvera une erreur d'exécution si la valeur dépasse ses limites. De plus, les vecteurs peuvent contenir des méta-valeurs comme 'U' et 'X', qui aident à faire remonter les bogues de conception tôt.
Démonstration vidéo
Dans la vidéo accompagnante, nous explorons comment les signaux signed et unsigned se comportent de manière similaire et où ils divergent.
Code d'exemple
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T12_SignedUnsignedTb is
end entity;
architecture sim of T12_SignedUnsignedTb is
signal UnsCnt : unsigned(7 downto 0) := (others => '0');
signal SigCnt : signed(7 downto 0) := (others => '0');
signal Uns4 : unsigned(3 downto 0) := "1000";
signal Sig4 : signed(3 downto 0) := "1000";
signal Uns8 : unsigned(7 downto 0) := (others => '0');
signal Sig8 : signed(7 downto 0) := (others => '0');
begin
process is
begin
wait for 10 ns;
-- Compteur avec wrap-around
UnsCnt <= UnsCnt + 1;
SigCnt <= SigCnt + 1;
-- Addition de signaux
Uns8 <= Uns8 + Uns4;
Sig8 <= Sig8 + Sig4;
end process;
end architecture;
Analyse de la forme d'onde
La forme d'onde ModelSim, zoomée sur les événements clés, affiche toutes les valeurs en hexadécimal pour la clarté :

Dans l'exemple de compteur, tanto UnsCnt que SigCnt commencent à 0, s'incrémentent jusqu'à FF (décimal 255), puis reviennent à 0 - démontrant un comportement de wrap identique.
Les signaux 4 bits Uns4 et Sig4 contiennent tous deux la valeur binaire 1000, qui est décimal 8 pour unsigned et -8 pour signed (complément à deux).
Lors de l'addition de ces nombres 4 bits aux accumulateurs 8 bits, l'extension de signe entre en jeu. Les nombres non signés sont complétés par des zéros, tandis que les nombres signés sont complétés par le bit de signe. Le résultat est que Uns8 augmente de 8, alors que Sig8 diminue de 8.
La visualisation du processus d'extension de signe clarifie la différence :

Points clés à retenir
- Les types
signedetunsignedsont des types vectoriels qui supportent les opérations arithmétiques. - Le débordement est silencieux ; les valeurs font un wrap-around selon la largeur de bits.
- L'extension de signe peut produire des résultats différents lors de l'addition d'opérandes de longueurs inégales.
Passez au tutoriel suivant pour des insights plus profonds.
VHDL
- Maîtriser les types Signé vs Non-signé en VHDL : insights pratiques
- Exploiter les procédures in-process pour un design FSM VHDL plus propre
- Utilisation des fonctions impures en VHDL : Améliorer la lisibilité et la maintenabilité des FSM
- Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
- Utilisation des procédures en VHDL : Simplifiez votre design avec du code réutilisable
- Maîtriser l'instanciation par port map en VHDL : Guide pratique
- Installation gratuite d'un simulateur et éditeur VHDL : guide étudiant
- Microcontrôleurs PIC18 : Caractéristiques, Performances et Utilisation
- Comprendre les Désignateurs de Référence : Comment Étiqueter les Connexions d'Assemblage PCB