WT
WT
WT
entity …
architecture
…
architecture …
configuration
…
package
…
package
… library X Y
X
library work
out
in inout
buffer
Type
On distingue les types prédéfinis, les types complémentaires définis par le langage VHDL et
les types définis par l’utilisateur.
o Types prédéfinis par le langage
o Types complémentaires
Exemple :
L’utilisateur peut aussi définir des sous-types à partir des types existants.
Syntaxe
subtype nom du sous-type is définition du sous-type ;
Exemple
Définition d’un sous-type OCTET
Subtype OCTET is bit_vector (7 downto 0) ;
Variables
Une variable n’est pas une liaison concrète. Elle disparaît après la synthèse. Elle est déclarée
dans les processus.
Syntaxe
variable noms des variables : type des variables ;
L’affectation d’une valeur à une variable se fait avec l’opérateur ‘ := ‘.
Exemple
X := 4 ;
Composants
Les composants sont des modules qui sont utilisables dans d’autres descriptions.
Syntaxe
component nom de l’entité du composant port
(noms de signaux : mode type ;
…
noms de signaux : mode type ) ;
end component ;
A I
=1 C
B
INV
XOR2
On suppose que les composants XOR2 et INV se trouvent déjà dans un paquetage appelé
portes dans la bibliothèque work.
Remarque :
Une fois décrit, compilé et stocké dans une bibliothèque, un paquetage peut être utilisé à
l’aide de la directive:
use nom de bibliothèque . nom du package . all ;
Un package peut contenir un nombre quelconque d’éléments.
Exemples de packages de la bibliothèque standard ieee
std_logic_1164
Il permet l’utilisation des signaux de type std_logic.
numeric_bit ou numeric_std
Il permet la manipulation du type signed (signé) et unsigned (non signé).
Remarques
- Les fichiers VHDL commencent généralement par les déclarations suivantes:
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ; (ou _bit.all ;)
reset
D q
clk BD
nq
set
Entité de la bascule:
entity BD is port (clk, D, reset, set : in std_logic ; q, nq : out std_logic) ;
end BD ;
Supposons qu’on veut utiliser une bascule D sans set et sans nq dans un circuit appelé CR.
Cette bascule s’appelle BASC_1 (bascule effective).
Dans ce cas, on instanciera le composant BD de la manière suivante:
RAZ
D_IN OUT
CLOCK BASC_1
…
architecture A_CR of CR is
constant ZERO : std_logic := '0' ;
begin
BASC_1 : BD port map (CLOCK, D_IN, RAZ, ZERO, OUT, open) ; …
La différence principale entre VHDL et les langages de programmation réside dans le fait que
dans VHDL les instructions sont évaluées en permanence et toutes simultanément.
Exemple
architecture A_EX of EX is
begin
A<= B or C ;
B<= D and E ;
end A_EX ;
L’ordre des instructions n’est pas important.
Les 2 instructions :
1.6.1 Processus
Si on veut avoir un mode de fonctionnement séquentiel, on crée un processus (process). Un
processus est un groupe d’instructions ayant les propriétés suivantes:
- Il s’exécute chaque fois qu’un signal appartenant à une liste appelée liste de sensibilité
change de valeur.
- Les instructions d’un processus s’exécutent séquentiellement.
- Les nouvelles valeurs des signaux ne prennent effet qu’à la fin du processus.
Syntaxe
nom du processus : (optionnel) process (liste de signaux)
déclaration de types
déclaration de variables
déclaration de constantes …
begin
instructions séquentielles
end process nom du processus (optionnel) ;
Exemple 1 : Bascule D
D Q
CLK
architecture A_BD of BD is
begin
process (CLK)
begin
if (CLK= '1') then Q <= D ;
end if ;
end process ;
end A_BD ;
Remarques
Concernant l’horloge CLK, il faut faire un test sur son front montant. C’est le rôle de l’attribut
event. Cet attribut associé à un signal exprime le changement de valeur (front) de ce signal.
– Test sur un front montant d’un signal S:
S’event and S= '1'
– Test sur un front descendant d’un signal S:
S’event and S= '0'
1.7 Opérateurs:
Remarques :
1.8 Instructions
1.8.1 Quelques instructions en mode concurrent
a- Affectation inconditionnelle
Syntaxe
signal <= expression ;
Exemple
Multiplexeur 4:1
A
B MUX Y
C 4:1
D
ADRESSE
e- Instruction generate
Cette instruction permet de générer plusieurs copies d’un même composant ou d’une même
instruction.
Syntaxe
étiquette: for variable de boucle in valeur initiale to valeur finale generate
instructions concurrentes
end generate étiquette ;
Remarques
- On peut imbriquer plusieurs instructions generate.
- Il n’est pas nécessaire de déclarer la variable de boucle.
A(1)
& Y(1)
A(2)
& Y(2)
A(3)
& Y(3)
EN
boucle : for J in 0 to 3 generate
Y(J) <= A(J) and EN ;
end generate ;
c- Affectation conditionnelle
Elle peut s’appliquer aux signaux et aux variables.
Syntaxe
case sélecteur is
when valeur du sélecteur => instructions ;
when valeur du sélecteur => instructions ;
…
when others => instructions ;
end case ;
d- Instruction loop
Syntaxe
étiquette: for variable de boucle in valeur initiale to valeur finale loop
instructions séquentielles
end loop étiquette ;
Mémorisation implicite
Si lors d’une instruction conditionnelle (combinatoire) un signal reçoit une affectation dans
une branche, il doit recevoir une affectation dans toutes les autres branches. Chaque absence
d’affectation signifie que le signal garde sa valeur. Dans ce cas le synthétiseur génère une
logique de mémorisation de ce signal (bascule).
Exemple
L’instruction suivante:
C <= B when A = ‘1’ ;
est interprété comme:
C <= B when A = ‘1’ else C when A=‘0’ ;
Si on veut que C prenne n’importe quelle valeur, lorsque A=0, alors il faut écrire l’instruction
suivante:
C <= B when A = ‘1’ else ‘-’;
(Voir TD et TP)