Structure d'une Description VHDL
Entité / Architecture
Cliquer sur la figure ci-dessous:
REMARQUE : Les signaux d’E/S peuvent être :
- in
- out
- inout dans le cas d’un bus de données.
L’affectation de base est :
signal <= valeur when condition else autre_valeur
Un Langage Parallèle
L’ordre des instructions n’a aucune importance en VHDL.
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
Pour décrire un composant synchrone, il faut réagir sur un moment précis qui est un front.
En VHDL un process permet d’exécuter un bout de code sur un changement d’un signal.
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 (interdit en dehors d’un process)
- L’affectation d’un signal ne se fait qu’une seule fois. Si un signal subit plusieurs affectations, celle-ci n’est effective que sur end process et seule la dernière affectation sera prise en compte.
Par conséquent il ne faut pas oublier qu’un signal correspondra physiquement à un fil. On ne peut pas utiliser un signal comme une variable dont l’affectation serait immédiate.
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.
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
Pour faire un calcul, on utilise des types définis dans le packetage 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 peut écrire (si a est signed ou unsigned de 4 bits) :
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);
Affectation :
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)