Structure d'une Description VHDL
Entité / Architecture
Cliquer sur la figure ci-dessous:
En VHDL, un signal ( E/S d’un composant ou signal interne ), permet de ‘véhiculer’ un état logique. Physiquement, cela correpond à un fil.
Les signaux d’E/S peuvent être :
- in : un signal en entrée peut être uniquement lu.
- out : un signal en sortie peut être uniquement affecté ( modifié ).
- inout : un signal inout peut être lu et affecté ; on réservera cette configuration aux signaux des bus bidirectionnels.
Affectation de base d’un signal
Affectation directe
a <= '1'; -- Forçage à '1' du signal a
b <= c ; -- b et c sont reliés
d <= e and f ; -- d contient le résultat d'une équation logique Affectation conditionnelle
signal <= valeur when condition else autre_valeur;Ex : Multiplexeur
s <= e0 when sel='0' else e1; |
|
|
Les Types
Types de Base (définis dans le paquetage std_logic_1164) :
- std_logic –> 1 bit pouvant valoir ‘0’,‘1’,‘Z’(Haute impédance),‘U’(undifined),‘X’(conflit)
- std_logic_vector(N-1 downto 0) –> Vecteur de N std_logic
Simple (’) / Double (") quote :
signal a : std_logic;
signal b : std_logic_vector(3 downto 0);
signal c : integer range 0 to 255;
a <= '1'; -- Simple quote
b <= "0101"; -- Double quote
c <= 50; -- Aucune quote Calcul Arithmétique
On utilise des types définis dans le paquetage numeric_std :
- signed(N-1 downto 0)
- unsigned(N-1 downto 0)
Il s’agit de sous-types de std_logic_vector pour lesquels les opérations arithmétiques ont été définies (+,-,*,…)
On considère un signal a de type unsigned de 4 bits :
signal a : unsigned(3 downto 0);On peut écrire :
a <= a + "0001"
a <= a + 1 -- ici 1 est de type integer, numeric_std définit "+"(unsigned,integer)On ne peut pas écrire :
a <= a + '1' -- '1' est un std_logic, l'addition doit gérer des opérandes de même taille.La conversion est implicite (cast) :
signal a : std_logic_vector (7 downto 0);
signal b : unsigned (7 downto 0);a <= std_logic_vector(b);
b <= unsigned(a);Toutes les descriptions des labos sont réalisables avec les paquetages std_logic_1164 et numeric_std et les types évoqués ci-dessus.
Les autres bibliothèques sont à proscrire (génération de conflits et pas forcément synthétisables)
Une bonne pratique consiste à utiliser les types std_logic_vector pour les entrées-sorties des composants, et de faire un transtypage en signed/unsigned quand un calcul arithmétique est nécessaire dans l’architecture du composant.
Un Langage Parallèle
L’ordre des instructions n’a aucune importance en VHDL ( contrairement aux langages machines séquentiels ).
En effet il s’agit de DECRIRE un circuit numérique, avec des composants fonctionnant tous simultanément.
On peut abusivement dire que “tout s’exécute en même temps”.
Ainsi Les deux syntaxes suivantes produiront le même composant :
|
|
REMARQUE : Le signal interne doit être déclaré avant le begin de l’architecture et n’est visible que dans l’architecture.
Notion de Process
Process Synchrone
En VHDL un process permet d’exécuter un bout de code suite au changement d’un signal.
Pour décrire un composant synchrone, il faut réagir sur un moment précis qui est un front.
Caractéristiques d’un Process :
- Les instructions sont séquentielles (s’exécutent les unes après les autres)
- On retrouve la structure if then else (interdite en dehors d’un process)
- L’affectation d’un signal ne se fait qu’une seule fois. Si un signal subit plusieurs affectations, il faut considérer que celle-ci n’est effective que sur end process, et seule la dernière affectation sera prise en compte.
Il ne faut pas oublier qu’un signal correspond physiquement à un fil.
On ne peut pas utiliser un signal comme une variable dont l’affectation serait immédiate.
REMARQUE : if then else :
La séquence avec un elsif n’attend qu’un seul end if :
if ... ;then ... ; ( else ...; )
end if;
if ... ;then ... ; ( else ...; )
elsif ... then ... ; ( else ...; )
end if; Process Combinatoire
On peut utiliser un process pour décrire un composant combinatoire, à condition de lister toutes les entrées du composant dans la liste de sensibilité du process.
|
|
|