Maîtriser std_logic_vector : Création de vecteurs de signaux en VHDL
Le type std_logic_vector est le standard VHDL pour définir des bus de signaux. Alors que std_logic modélise l'état d'un fil unique, std_logic_vector l'étend à un tableau de fils, permettant la représentation de bus multi-bits.
Contrairement au std_logic mono-bit, std_logic_vector est un type composite - une collection indexée d'éléments std_logic. Il peut contenir un nombre arbitraire de bits, le rendant idéal pour connecter des composants qui échangent des données multi-bits.
Cet article fait partie de la série Tutoriels VHDL de Base.
Déclarez un signal std_logic_vector avec la syntaxe suivante :signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
ousignal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
où <name> est un identifiant choisi par l'utilisateur et <initial_value> est optionnel. <lsb> et <msb> désignent respectivement les indices des bits de poids faible et fort.
Le mot-clé to ou downto spécifie la direction de la plage (c'est-à-dire l'endianness). Les deux formes fonctionnent, mais la plupart des concepteurs favorisent downto pour la clarté. Je recommande d'utiliser systématiquement downto lors de la déclaration de vecteurs de bits pour éviter la confusion.
Le code VHDL pour un vecteur de taille octet est :
signal MySlv : std_logic_vector(7 downto 0);
Le code VHDL pour un vecteur d'un bit est :
signal MySlv : std_logic_vector(0 downto 0);
Le code VHDL pour une plage vide (zéro bit) est :
signal MySlv : std_logic_vector(-1 downto 0);
Exercice
Dans ce tutoriel vidéo, nous apprendrons comment déclarer des signaux std_logic_vector et leur donner des valeurs initiales. Nous apprenons aussi comment itérer sur les bits d'un vecteur en utilisant une boucle For pour créer un registre à décalage :
Le code final que nous avons créé dans ce tutoriel :
library ieee;
use ieee.std_logic_1164.all;
entity T11_StdLogicVectorTb is
end entity;
architecture sim of T11_StdLogicVectorTb is
signal Slv1 : std_logic_vector(7 downto 0);
signal Slv2 : std_logic_vector(7 downto 0) := (others => '0');
signal Slv3 : std_logic_vector(7 downto 0) := (others => '1');
signal Slv4 : std_logic_vector(7 downto 0) := x"AA";
signal Slv5 : std_logic_vector(0 to 7) := "10101010";
signal Slv6 : std_logic_vector(7 downto 0) := "00000001";
begin
-- Registre à décalage
process is
begin
wait for 10 ns;
for i in Slv6'left downto Slv6'right + 1 loop
Slv6(i) <= Slv6(i-1);
end loop;
Slv6(Slv6'right) <= Slv6(Slv6'left);
end process;
end architecture;
La fenêtre de forme d'onde dans ModelSim après avoir appuyé sur run, et zoomé sur la timeline :
Analyse
Dans cet exercice, nous avons déclaré six bus std_logic_vector, chacun de huit bits (un octet).
Le signal Slv1 a été déclaré sans valeur initiale. Le bus apparaît comme XX dans la capture d'écran de forme d'onde car l'affichage hexadécimal ne peut pas représenter les valeurs inconnues. Un examen plus approfondi révèle que les bits individuels sont en fait U.
Le signal Slv2 utilise l'affectation agrégée (others => '0') pour mettre tous les bits à zéro. Cette syntaxe concise assure que chaque élément reçoit la valeur spécifiée indépendamment de la largeur du vecteur.
Le signal Slv3 emploie la même technique agrégée pour initialiser chaque bit à un, ce qui s'affiche comme FF (hex pour huit 1).
Le signal Slv4 démontre un initialiseur hexadécimal : AA. Puisque chaque chiffre hex correspond à quatre bits, deux chiffres couvrent le vecteur 8 bits.
Le signal Slv5 contient la valeur identique, mais exprimée en binaire (10101010). Tanto Slv4 que Slv5 s'affichent comme AA dans la forme d'onde.
Le signal Slv6 commence avec tous les zéros sauf le bit de poids faible mis à 1. Un processus implémente un registre à décalage vers la gauche qui fait circuler le 1 à travers le vecteur toutes les 10 ns.
Le processus tire parti des attributs left et right pour garder le code générique ; redimensionner le vecteur ne nécessite pas de changements de code.
Des attributs additionnels existent, mais ils sont au-delà du scope de ce tutoriel d'introduction.
À retenir
- Les vecteurs N-bits doivent être déclarés en utilisant
std_logic_vector(N-1 downto 0). - Un vecteur peut être assigné dans son ensemble ou des bits individuels peuvent être accédés.
- Tous les bits peuvent être mis à zéro avec l'affectation agrégée
(others => '0'). - L'utilisation d'attributs comme
'leftet'rightrend le code générique et maintenable.
Passez le Quiz VHDL de Base - partie 2 »
ou
Allez au tutoriel suivant »
VHDL
- Guide complet des conversions de types VHDL avec Numeric_Std et Std_Logic_Arith
- Maîtriser les types Signé vs Non-signé en VHDL : insights pratiques
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
- Créer un banc de test piloté par Tcl pour un module verrou code VHDL
- Terminer proprement une simulation de banc de test VHDL
- Implémenter un contrôleur PWM en VHDL : Conception, simulation et démo FPGA
- Générer des nombres aléatoires en VHDL : De l'uniforme à OSVVM
- Comment construire un testbench auto-vérifiant en VHDL - Guide pratique
- Implémentation d'une liste chainée dynamique en VHDL avec types protégés et pointeurs d'accès