Haroun
CIRCUIT LOGIQUE
Entrées Sorties
PROGRAMMABLE
Les fonctions réalisées peuvent être des fonctions logiques combinatoires ou logiques séquentielles. Ce
type de circuit est de plus en plus répandu et tend à remplacer la logique câblée classique.
En effet, les avantages sont nombreux :
- Possibilités d’évolution et de modification des fonctions sans modification du câblage.
- Simplification du câblage car des fonctions logiques complexes peuvent être rassemblées dans le
même boîtier. Ce qui entraîne une diminution de la surface des circuits imprimés. Amélioration des
performances C.E.M.
P a g e 1 | 37
Circuits Programmables FPGA S. Haroun
- Gain de temps en étude : on peut faire fabriquer le circuit imprimé pendant que l’on termine le
développement du circuit (à condition d’avoir bien choisi le circuit logique programmable).
- Possibilités (sur certains circuits) d’interfacer le circuit avec un micro-ordinateur pour réaliser des
fonctions de test (Bus JTAG).
Il existe plusieurs familles de circuits logiques programmables. Nous allons rapidement les passer en
revue.
P a g e 2 | 37
Circuits Programmables FPGA S. Haroun
Une matrice programmable est un ensemble de portes logiques dont les entrées sont connectées aux
variables du systèmes, vraies et inversées, au moyen d'un réseau de fusibles.
Lorsqu'un fusible est brûlé, la connexion respective entre la variable et la porte logique disparaît.
La programmation du système se fait en choisissant les fusibles que l'on laisse et que l'on brûle.
P a g e 3 | 37
Circuits Programmables FPGA S. Haroun
Selon le caractère programmable des matrices ET et OU, il existe deux types de circuits logiques
programmables :
o PAL (Programmable Array Logic) : matrice ET programmable suivie d'une matrice OU fixe.
o PLA (Programmable Logic Array) : les deux matrices ET et OU sont programmables.
Les circuits PALs sont les PLDs les plus courants : les PLAs sont très peu utilisés à cause de leur
nombre élevé de fusibles, ce qui amène une grande consommation de puissance et de long délai.
A partir de cette structure de base il va être possible de réaliser de nombreuses fonctions logiques. La
programmation va constituer à détruire les fusibles pour obtenir les fonctions désirées, en sachant que lors
de l’achat d’un P.A.L tous les fusibles ne sont pas détruits.
Cette représentation schématique demande beaucoup d'espace pour représenter un PAL en entier. Les
industriels ont adopté la représentation symbolique suivante :
P a g e 4 | 37
Circuits Programmables FPGA S. Haroun
Exemple
D’un point de vue fonctionnel un P.A.L est constitué d’une zone d’entrée de fusibles ou matrice de
programmation et une structure de sortie non programmable déterminant le type de circuit.
P a g e 5 | 37
Circuits Programmables FPGA S. Haroun
- H (High) porte ET suivit d’une porte OU, sortie active à l’état haut
- L (Low) porte ET suivit d’une porte NON OU sortie active à l’état bas
- C (Combinée) programmable en type Hou L.
Les deux premiers types de circuits correspondent à des circuits combinatoires classiques. Sur le
troisième type de circuits, il y a :
- possibilité de mettre la sortie dans l’état haute impédance.
- possibilité de transformer une sortie en entrée.
- possibilité de relire une sortie pour modifier l’entrée.
P a g e 6 | 37
Circuits Programmables FPGA S. Haroun
Ces circuits sont composés de bascule D, les sorties des bascules sont de type trois états contrôlé par un
signal de validation Enable ou OE, et une horloge (Clock) est commune à toutes les bascules.
X : Ou exclusif et registre
RA : Registre Asynchrone
Ce qui donne :
P a g e 7 | 37
Circuits Programmables FPGA S. Haroun
P a g e 8 | 37
Circuits Programmables FPGA S. Haroun
figure. Ceci est effectué sur les sorties afin que les signaux synchronisés puissent être émis directement vers
les broches sans subir de retard significatif. De plus, une certaine quantité de logique est incluse dans le bloc
d'E / S pour ajouter des ressources et fonctionnalités supplémentaires au périphérique.
2.2.3. Matrice d’interconnexion
L'interconnexion dans le CPLD se fait par une grande matrice de commutateurs programmables qui
permet aux signaux provenant de toutes les parties du périphérique de parvenir à toutes les autres parties.
Bien qu'aucun commutateur ne puisse connecter tous les blocs de fonction internes à tous les autres blocs
de fonction, la flexibilité est suffisante pour permettre de nombreuses combinaisons de connexions.
2.2.4. Les Eléments Programmables
Chaque fabricant utilise une différente technologie pour implémenter les éléments programmables d'un
CPLD. Les technologies courantes sont les mémoires EPROM (EPROM), les mémoires PROM effaçables
électriquement (EEPROM) et les EPROM Flash. Ces technologies sont similaires aux technologies utilisées
pour les dispositifs programmables les plus simples, à savoir les PROM, ou à des versions de nouvelle
génération de celles-ci.
P a g e 9 | 37
Circuits Programmables FPGA S. Haroun
P a g e 10 | 37
Circuits Programmables FPGA S. Haroun
les entrées du multiplexeur ne peuvent être que des constantes. Effectivement, il faut un multiplexeur deux
fois plus gros pour réaliser la même fonction, mais le routage du circuit est plus simple.
Look Up Table (LUT) : la LUT permet de stoker la table de vérité de la fonction combinatoire à
implémenter dans la cellule RAM.
P a g e 11 | 37
Circuits Programmables FPGA S. Haroun
P a g e 12 | 37
Circuits Programmables FPGA S. Haroun
P a g e 13 | 37
Circuits Programmables FPGA S. Haroun
Processeur intégré
Les microprocesseurs intégrés ne sont pas réalisés à l’aide de blocs de logique ou de mémoire du FPGA.
Ce sont plutôt des régions du puce optimisé comme si le microprocesseur était réalisé par lui-même dans un
circuit intégré. En général, les constructeurs des FPGAs utilisent des processeurs populaires dans l’industrie.
P a g e 14 | 37
Circuits Programmables FPGA S. Haroun
4. Le langage VHDL
4.1. Introduction
VHDL est l’acronyme de VHSIC HDL (Very High Speed Integrated Circuit Hardware Description
Language), c’est un langage de description matérielle qui a été créé dans les années 1980 à la demande du
département de la défense américaine (DOD).
La première version du VHDL accessible au public a été publiée en 1985, et a fait l’objet d’une norme
internationale en 1986 (IEEE 1076) par l’institut des ingénieurs électriciens et électroniciens (IEEE).
Révisée en 1993 (IEEE 1164) pour supprimer quelques ambiguïtés et améliorer la portabilité du langage,
cette norme est vite devenue un standard en matière d'outils de description de fonctions logiques.
De nos jours, le langage VHDL devient un outil indispensable pour la conception des systèmes
électroniques intégrés (ASIC), il est proposé par la grande majorité des sociétés de développement et la
programmation des composants programmables du type PLD, CPLD et FPGA. Le VHDL es utilisé aussi
pour concevoir des modèles de simulations numériques ou des bancs de tests.
Avec un langage de description matérielle et un FPGA (Field Programmable Gate Array), un concepteur
peut développer rapidement et simuler un circuit numérique sophistiqué, de l’implémenter sur une carte de
prototypage, et de vérifier son fonctionnement.
entity Nom_de_l’entité is
La déclaration
end Nom_de_l’entité ;
begin
description de la structure logique
end Nom_de_l’architecture ;
P a g e 15 | 37
Circuits Programmables FPGA S. Haroun
L'entité donne les informations concernant les signaux d'entrées et de sorties de la structure (schéma
fonctionnel) ainsi que leurs noms et leurs types.
L'architecture décrit le comportement de l'entité (Schéma structurel).
Il est possible de créer plusieurs architectures pour une même entité, mais pas le contraire. Chacune de
ces architectures décrira l'entité de façon différente.
Exemple 1
Donner la discription VHDL de circuit intégré 7400. Ce dernier est constitué de quatre portes logiques
NAND à deux entrées.
Réponse
La description du circuit intégré 7400 en langage VHDL est donnée par le listing suivant :
Les deux premières lignes définissent les bibliothèques et les paquetages dont nous avons besoin pour la
conception de notre circuit. Dans notre code, on fait appel au paquetage std_logic_1164 qui se trouve dans
la bibliothèque IEEE.
P a g e 16 | 37
Circuits Programmables FPGA S. Haroun
a) La déclaration de l’entité
Pour le TYPE du port, il faut savoir que le langage VHDL est un langage typé, c’est-à-dire que chaque
objet manipulé doit avoir un type de données.
Dans l’exemple précédent, le type du port utilisé est STD_LOGIC. Il est défini dans le paquetage
STD_LOGIC_1164.
Si le type du signal utilisé est un bus de données, on utilise alors le type STD_LOGIC_VECTOR qui est
défini comme étant un tableau unidimensionnel d’éléments de type STD_LOGIC.
Exemple :
Soit le signal d’entré A de 8 bits, on le déclarera en VHDL comme suit :
A : in std_logic_vector ( 7 downto 0 ) ;
Ou bien :
A : in std_logic_vector (0 to 7);
La différence entre les deux expressions est l’indice du MSB et du LSB. Dans la première expression,
l’indice du MSB est A(7), celui du LSB est A(0). Dans la deuxième expression, l’indice du MSB est A(0),
celui du LSB est A(7).
P a g e 17 | 37
Circuits Programmables FPGA S. Haroun
b) La déclaration de l’architecture
Réponse
P a g e 18 | 37
Circuits Programmables FPGA S. Haroun
P a g e 19 | 37
Circuits Programmables FPGA S. Haroun
P a g e 20 | 37
Circuits Programmables FPGA S. Haroun
Le code VHDL d’un additionneur complet 1 bit en utilisant les signaux intermédiaires devient :
Elles sont généralement initialisées au moment de leur déclaration. Cette déclaration se situe dans la partie
déclarative d’une entité, d’une architecture, d’un processus, d’un bloc, d’un paquetage ou d’un sous-
programme.
b) Les Signaux
En VHDL, Les signaux sont spécifiques à la description matérielle, c.-à-d. le signal est une information
qui existe physiquement dans le circuit, ou ils représentent les fils d’interconnexion entre les différents
composants sur la carte.
P a g e 21 | 37
Circuits Programmables FPGA S. Haroun
Exemple :
Un signal se déclare dans l’univers concurrent : zones déclaratives d’une architecture (le cas le plus
fréquent), d’une entité, d’un bloc ou d’un paquetage.
c) Les variables
Une variable est un objet capable de retenir une valeur pendant une durée limitée. Les variables apportent
une aide précieuse dans les processus de description et permettent de décrire la nature d'évolution des signaux
dans des structures de programmation séquentielles, conditionnelles ou répétitives (elles ne peuvent être
employées qu’à l’intérieur d’un process).
Par opposition à un signal, une variable n’est pas une liaison physique, et n’est pas une information
synthétisable (elle ne laisse aucune trace après synthèse).
Exemple :
Les variables doivent toujours être déclarées, dans la zone déclarative des modules séquentiels d’un
programme i.e. les processus ou les sous-programmes (fonctions ou procédures).
Ci-dessous deux exemples de déclarations de variables faite dans une fonction et dans un processus :
P a g e 22 | 37
Circuits Programmables FPGA S. Haroun
de variation d’un Time dépend de la machine sur laquelle est compilée la description VHDL. Quelle
que soit la machine, elle inclue la plage –2147483647 à +2147483647.
La déclaration du type time se trouve dans le package standard.
Les types énumérés : les variables et signaux de types énumérés prennent un nombre fini et restreint
de valeurs parfaitement connues c.-à-d. les valeurs qu’il peut prendre sont énumérées.
Les types prédéfinis dans le package standard sont les types Boolean, Bit, Character et Severity_level.
- Type BOOLEAN : Défini comme (False, True).
- Type BIT : Une grandeur de type BIT peut prendre deux valeurs : ( '0' , '1' ).
- Type STD_LOGIC : possède neuf états (‘0’, ‘1’, ‘Z’, ‘U’, ‘X’, ‘W’, ‘L’, ‘H’, ‘-‘).
- Type CHARACTER : Les types de données « caractère » en VHDL sont similaires à ceux d’un
langage de programmation de haut niveau, ils peuvent être utilisés pour représenter une chaine de
caractères (…,’A’, ‘B’, ‘C’,…’0’, ‘1’, ‘2’,…).
- Type SEVERITY_LEVEL : Ce type de données est particulier, il possède quatre valeurs possibles :
(‘NOTE’, ‘WARNING’, ‘ERROR’, ‘FAILURE’)
Il est très utile d’utiliser ce type de données lors des simulations, par exemple, pour demander au
simulateur d’arrêter la simulation lorsqu’il détecte une erreur.
P a g e 23 | 37
Circuits Programmables FPGA S. Haroun
La déclaration du tableau ci-dessus indique que le tableau dont le nom est « Mon_Tableau » est constitué
de 16 éléments, où chaque élément est du type std_logic. On peut associer un objet de type «
Mon_Tableau » comme suit :
Remarque : Généralement les tableaux à deux dimensions (matrices) ne sont pas supportés par les outils
de synthèse, mais ils sont utiles pour décrire les tests de stimuli, les éléments de mémoires, ou autre donnée
qui requièrent une forme de tableaux à deux dimensions.
Quelques exemples de déclarations des tableaux unidimensionnels et bidimensionnels :
Les types « composés » articles (RECORD) : Un objet de type article (RECORD) est un ensemble
d’éléments appelé champs, qui peuvent être de même type ou de types différents.
Exemple d’une déclaration d’un article :
L’article ci-dessus dont le nom est « Mon_Article » est constitué de trois champs (clock, data et x).
c) Les types « accès » (Access) : Ces types fournissent des références vers des objets de la même
manière que les pointeurs qui fournissent des références vers des données dans un langage de programmation
de haut niveau.
d) Les types « fichiers » (File) : Ce sont des objets de référence qui contiennent une séquence de
valeurs.
Les sous-types
Les valeurs de chaque type de données se trouvent dans un intervalle défini, par exemple l’intervalle de
type de données entier (INTEGER) est [-2147483647, +2147483647].
Le langage VHDL nous permet de spécifier un sous-ensemble de valeurs d’un type, par exemple la
déclaration suivante crée un objet de type entier qui ne peut avoir que des valeurs positives allant de 0 à 255:
Remarquez la déclaration « range », cette dernière permet de vérifier lors de la synthèse et de la simulation
que la valeur d’un objet n’est pas en dehors de son intervalle de variation.
On peut déclarer un sous-type d’un type de données, par exemple la déclaration ci-dessous crée un sous-
type (Short) du type scalaire entier (Integer) avec un intervalle limité :
P a g e 24 | 37
Circuits Programmables FPGA S. Haroun
4.4.2. Les opérations relationnelles : Les opérations relationnelles testent les valeurs relatives de types
scalaires. Le résultat d’une opération relationnelle est toujours une valeur booléenne TRUE ou FALSE.
4.4.3. Les opérations d’addition : Les opérations d’addition peuvent être utilisées pour décrire des
fonctions arithmétiques ou des opérations de concaténations.
4.4.4. Les opérations de multiplication : Les opérations de multiplication peuvent être utilisées pour
décrire des fonctions arithmétiques ou de types numériques.
4.4.5. Les opérations de signe : Les opérations de signes sont utilisées pour spécifier le signe (positif ou
négatif).
4.4.6. Les opérations de décalage : Les opérations de décalage permettent de faire des opérations de
décalage ou de rotations au niveau des bits ou d’objet de type booléens.
P a g e 25 | 37
Circuits Programmables FPGA S. Haroun
4.4.7. Autre opérations : Les opérations d’exponentiation, ou de valeur absolue peuvent être appliquées à
des objets de type numérique.
Remarque : on définit la position d'une valeur valide pour un type par la valeur 0 pour la grandeur définie
à gauche. La seconde valeur possède la position 1 . . .
Cas des types et sous-types énumérés
Il existe des attributs supplémentaires permettant de retrouver les caractéristiques d'un type vectoriel (ou
d'un tableau de dimension x d'une façon générale). Pour les tableaux, les attributs left, right, high et low
existent aussi mais renvoie un indice (position dans le tableau).
P a g e 26 | 37
Circuits Programmables FPGA S. Haroun
Note : ce dernier tableau utilise pour les exemples le tableau TAB_ENTIER de dimension 1 seulement ce
qui explique que la valeur donnée à x est toujours 1.
b) Attributs associés à un signal
Les attributs associés à un signal permettent de mieux connaître la façon dont évolue ce signal (exemple :
détection de front montant ou descendant, changement d'état . . . ). Afin de comprendre le fonctionnement
de ces attributs, il est nécessaire de préciser ce qu'est une Transaction.
Définition : une transaction sur un signal est une opération modifiant ou affirmant la valeur de ce signal
pendant le cycle de simulation en cours.
P a g e 27 | 37
Circuits Programmables FPGA S. Haroun
Avec l’assignation conditionnelle des signaux, la description en VHDL de ce multiplexeur est la suivante :
P a g e 28 | 37
Circuits Programmables FPGA S. Haroun
Remarque :
Dans l’assignation conditionnelle des signaux, il n’y a pas de point-virgule après le ELSE.
Dans l’assignation de sélectionnée des signaux, il faut faire attention à ne pas oublier la virgule à la fin de
chaque expression de choix, et ne pas oublier de spécifier l’expression à exécuter si aucun choix n’a été
trouvé (WHEN OTHERS).
P a g e 29 | 37
Circuits Programmables FPGA S. Haroun
Un PROCESS comprend une liste appelée, liste de sensibilité. Cette liste contient les noms des signaux
qui activent ce PROCESS.
Exemple :
La liste de sensibilité de ce PROCESS est (A, B). L’instruction dans le PROCESS ne s’exécute que
lorsqu’il y’a un changement d’état dans le signal A ou B. Ainsi, à chaque changement d’état du signal A ou
B, l’instruction S <= A and B est exécutée.
P a g e 30 | 37
Circuits Programmables FPGA S. Haroun
Une constante permet de paramétrer une valeur non modifiable lors de l’exécution de la description, elle
peut être déclarée dans un PROCESS (constante locale), ou en dehors de celui-ci (constante globale).
Exemple de déclaration des constantes :
Dans le code ci-dessus, la constante de la ligne 11 est une constante globale, déclarée en dehors du
PROCESS, contrairement à la ligne 15, où elle est locale au PROCESS.
Comparaison entre variable et signal :
P a g e 31 | 37
Circuits Programmables FPGA S. Haroun
Exemple 1 : Exemple 2 :
Dans ce 2me exemple, il y’a un signal nommé « s » qui dépend de la valeur du signal nommé « a ». Les
tests se font séquentiellement. Le signal « s » recevra le niveau logique ‘1’ si la valeur du signal « a » sera
supérieure à 5, si cette dernière sera inférieure à 3, alors le signal « s » recevra le niveau logique‘0’. Si par
contre, aucune des conditions précédentes ne seront satisfaites alors le signal « s » recevra l’état de la haute
impédance.
Exemple pratique : On étudie les mêmes circuits vus précédemment, pour qu’on puisse faire la différence
entre les différents styles de descriptions d’une architecture en VHDL.
Soit un multiplexeur 4 vers 1 vue précédemment. Sa description en VHDL est donnée par le listing suivant :
P a g e 32 | 37
Circuits Programmables FPGA S. Haroun
Important : La description avec l’instruction CASE doit obligatoirement avoir le choix OTHERS à la fin si
toutes les valeurs de l’expression ne sont pas énumérées.
Exemple : On donne dans le listing 3.3 une autre architecture de l’entité mux_4v1, décrit avec la
description CASE.
La boucle FOR est basée sur un indice, et répète les instructions séquentielles pour un nombre fixe
d’itérations (intervalle_boucle).
Exemple : L’utilisation de la boucle for est montré par un exemple simple : description d’un circuit XOR
de 4 bits.
P a g e 33 | 37
Circuits Programmables FPGA S. Haroun
L’indice prends toujours la valeur qui est à gauche dans l’intervalle d’itération, dans notre exemple,
l’indice I vaudra 3 dans la première itération, 2 dans la deuxième itération, 1 dans la troisième itération, et
enfin 0 dans la quatrième itération.
d) Description avec les boucles (loop) --- Répétitions conditionnelle (while) :
La syntaxe simplifiée d’une boucle WHILE est :
La boucle WHILE est une variante de la boucle for, mis à part que l’incrémentation de l’indice de la
boucle WHILE se fait tant que la condition booléenne associée est vraie.
Exemple : L’utilisation de la boucle WHILE est démontré par le même exemple vu avec la boucle FOR
(description d’un circuit XOR de 4 bits).
Commentaire : L’indice de la boucle est la variable locale I qu’on a initialisé au pare avant à 0 :
P a g e 34 | 37
Circuits Programmables FPGA S. Haroun
Chaque bloc est appelé « component » (composant), et est une instance du modèle.
Pour différencier ses derniers, chaque instance à un nom distinct.
Chaque bloc doit être décrit séparément (c’est-à-dire avoir son entité et l’architecture associée).
Description VHDL d’une porte logique OR. Description VHDL d’un demi-additionneur 1 bit.
Dans l’architecture de l’additionneur complet 1 bit, il faut déclarer les composants (component) utilisés,
ainsi que leurs broches d’entrée-sortie pour faire les interconnexions nécessaires.
Nous avons besoin des signaux intermédiaires pour décrire l’assemblage des instances utilisées.
Instanciation :
Il s’agit de mettre en correspondance chaque broche de chacune des instances des composants avec les
ports auquel il est connecté. Il y’a trois types d’instanciation :
- Instanciation par position
- Instanciation par nom
- Instanciation mixte
P a g e 35 | 37
Circuits Programmables FPGA S. Haroun
Description structurelle d’un additionneur complet 1 bit avec instanciation par position.
P a g e 36 | 37
Circuits Programmables FPGA S. Haroun
Description structurelle d’un additionneur complet 1 bit avec instanciation par nom.
P a g e 37 | 37