Cours Fpga PDF
Cours Fpga PDF
Cours Fpga PDF
TAYARI LASSAAD
MAITRE TECHNOLOGUE A ISET GABES
E-mail :[email protected]
FPGA ISET GABES
SOMMAIRE
Chapitre I
Classification des systèmes logiques
I. Introduction :
Un système logique utilise les fonctions combinatoires et séquentielles. Actuellement de
multiples types de circuits coexistent dans ces systèmes. Le domaine de complexité de ces circuits
s’étend de quelques opérateurs élémentaires (SSI) « Simple Scale Integration », à quelques dizaines
(MSI) « Medium Scale Integration ». Pour atteindre des milliers (LSI) « Large Scale
Integration » et même des centaines de milliers (VLSI).
Fonctions Fonctions
combinatoires séquentielles
Sytème
Logique
Fonctions câblées Fonctions programmables
Fonctions
câblées - programmées
Circuits Circuits
personnalisables à la demande
On peut classer ces circuits en plusieurs familles compte tenu de leurs fonctionnalité :
II. Les circuits standard :
Ils donnent les fonctions fixes d’usage courant.
Il existe trois types de circuits standard :
a) Les circuits à faible degré d’intégration (SSI) (ET, OU, Bascules,… ,etc)
b) Les circuits à densité moyenne d’intégration (multiplexeurs, décodeurs, encodeurs,
registres a décalage, compteurs, …,etc
c) Les circuits à grande densité d’intégration (LSI) (mémoires a semi-conducteurs (Ram,
ROM, PROM, EPROM, …,etc)).
Ces circuits sont caractérisés par le fait qu’ils ne réalisent qu’une seule fonction.
III. Les circuits spécifiques : (ASIC : Application Specific Integrated Circuits)
Ce sont des circuits adaptés à des applications particulières. On distingue quatre familles :
a) Les réseaux logiques programmables :
Elles permettent à l’utilisateur de programmer ses propres fonctions (combinatoires ou
séquentielles).
La programmation se fait par fusibles avec des circuits tels que les PAL, PLD, FPLA…etc
ou sans fusibles avec des circuits comme les GAL, EPLD…etc. Ces circuits se présentent
comme des réseaux d’opérateurs ET-OU ou des bascules associées à des opérateurs ET-
OU. Un circuit programmable peut donc substituer quelques boîtiers SSI ou MSI.
A l’état vierge, un tel circuit comprend un grand nombre de cellules. Chaque cellule contient
soit des portes logiques, soit des transistors et des résistances. Ces protes ou ces éléments ne
sont pas interconnectés. La programmation de ce type de circuits revient à assurer la
connexion entre ses différents composants.
Dans ce type de circuits il n’y a pas de diffusion préalable d’éléments actifs sur le silicium.
La programmation de ces circuits se fait à l’aide d’un outil de CAO qui doit être très
puissant.
Ces circuits sont analogues aux cellules pré caractérisées mais qui sont beaucoup
plus compliqués et qui représentent des circuits semi-fini au niveau physique. C’est à dire
que leurs programmation se fait par gravure directe. Cette opération est faite par le
constructeur.
IV. Les microprocesseurs et circuits associés
Ces sont des circuits multifonctions qui offrent une grande souplesse d’utilisation. Ils
fonctionnent selon le principe de la logique programmée enregistrée. Le fonctionnement de ces
circuits se fait en fonction d’une suite d’instructions enregistrée dans une mémoire. Le
microprocesseur appelle ces instructions (actions) d’une façon séquentielle.
Chapitre II
I/ INTRODUCTION
La réalisation pratique d’un système logique consiste à utiliser les composants disponibles sur
le marché. Le concepteur doit décomposer le système en blocs fonctionnels. Le problème consiste à
optimiser le choix des fonctions utilisées par rapport à des critères de coût, performance, nombre de
composants, complexité de connexion, … etc.
L’utilisation de circuits dont la fonction est adaptable (programmable) par l’utilisateur représente une
solution élégante à ce problème.
On distingue trois principaux types de fonctions à circuits programmables :
1. Les fonctions combinatoires ou séquentielles programmables par fusible (Réseaux
Logiques Programmables).
2. Les réseaux de cellules pré diffusées (Gate Array).
3. Les circuits à la demande (Cell Array et Full Custum)
REMARQUE :
D’après le cours de systèmes logiques :
Toute fonction logique se représente sous forme d’une expression de somme de produits ou de
produit sommes.
MATRICE
ET
m termes
Fonction= somme de produits
Pm P2 P1
f 1
MATRICE f 2
OU f p
1/ Réalisation de la matrice ET
On utilise le principe de ports ET à diodes. La programmation s’effectue graçe à des fusibles
placés en série avec des diodes.
+ V c c
E1
E2
E3
E1
E2 S=E1.E2
E3
SCHEMA
S = E 1 . E 2
REPRESENTATION
+Vcc
E1
P1 E1. E 2
P2 E1
E2
P3 E1. E 2E 3
E3
SCHEMA P3 P2 P1
E1
E2
E3
P 1 P 2 P 3
REPRESENTATION
2/ Réalisation de la matrice OU
On utilise le principe d’une porte OU à diode. La programmation se fait de la même manière
que pour le ET
E1
E1
E2 S=E1+ E2 E2
E3
E3
SCHEMA
S=E1+E2
REPRESENTATION
3/ Les circuits de sortie
On adjoint un circuit de sortie à la matrice OU. Il peut s’agir d’un circuit d’inversion. dans ce
cas , on utilise l’opérateur OU exclusif dont une entrée est utilisée comme commande d’inversion.
F F F F
C = L C = H
MATRICE Fi
OU
Fusible
intact
Fusible
remplacé par
une liaison
Matrice ET fixe
O3 O2 O1 O0
Sorties
Une fonction F est donc réalisée en programmant sa table de vérité. Donc en mémorisant la valeur de
F pour toutes les combinaisons des entrées.
Décodeur
n
matrice ET Matrice des cellules
FIXEE mémoires
adresses [A] [B]
Commande
[D] Circuit de sortie
[C]
p
données
Les n fils d’adresse permettent de choisir une des 2n lignes continues dans la matrice [B]. La
sélection est réalisé par un décodeur [A] sous le contrôle d’un circuit logique [D]. Lorsqu’une adresse
« a » est placée à l’entrée, la ligne « a » est sélectionnée. Les « p » informations de cette ligne sont
transmises au circuit de sortie [C].
2/ Les PAL (Programmable Array Logic)
a- Structure de principe
La structure de base d’un PAL est l’opposée de celle d’une PROM. Il dispose d’une matrice
ET programmable et d’une matrice OU figée.
n
entrées
Matrice OU Fixe
PAL 4 entrées
4 sorties
16 Produits
16=24
O 3 O 2 O 1 O 0
Matrice ET
Programmable Sorties
Exemple : PAL 12 H 6
Le PAL 12H6 comprend 12 entrées, 6 sorties dont 4 possèdent deux termes produits et deux
possèdent quatre termes produits.
La formule complète de ce PAL s’écrit 12H6 (4x2+2x4).
Les circuits à polarité complémentaires : Ces circuits donnent une sortie directe et
complémentaire. Il en existe deux : PAL 16C1 et 20C1.
Les circuits à polarité inverse : Le circuit de sortie est un NOR qui donne une polarité inverse
noté L. Ces circuits sont : PAL 10L8, 12L6, 14L4, 16L2, 12L10, 14L8, 16L6, 18L4 et 20L2.
Les circuits avec rétroaction :Lorsqu’une fonction est trop complexe pour le nombre de termes
produits associés à ne sortie, on calcule séparément des groupes de produits que l’on réunit en
suite.
Rebouclage
F1 F1
Rebouclage
F2 F2
ET E T Rebouclage
Entrées Externes F=F1+F2 Entrées Externes F=F1+F2
Fonction complexe avec rebouclage externe Fonction complexe avec rebouclage interne
Matrice OU programmable
Matrice ET Programmable O3 O2 O1 O0
Sorties
Les matrices ET et OU sont programmables indépendamment, ce qui offre une très grande souplesse.
Ces circuits disposent également d’un circuit de sortie programmable (circuit d’inversion).
4/ Les circuits logiques Séquentiels programmables
Les constructeurs de PAL combinatoires ont développé des réseaux logiques programmables
adaptés aux systèmes séquentiels. On en trouve deux types :
1. Les FPLS (Field Programmable Logic Sequenser)
2. Les PAL séquentiels.
D Q
Q
OE
CLOCK
Q
Entrée
OE
CLOCK
L’inconvénient majeur des PALs est qu’ils ne sont programmables qu’une seule fois. Ceci impose un
gaspillage important de ces circuits lorsqu’on veut développer un nouveau produit. La firme
LATTICE a donc pensé, il y a un peu plus de 10 ans, à remplacer les fusibles irréversibles des PALs
par des transistors MOS FET pouvant être régénérés. Ceci a donc donné naissance aux GALs que l’on
pourrait traduire par « Réseau logique Générique ». Ces circuits peuvent donc être reprogrammés à
volonté sans pour autant avoir une durée de vie restreinte. On peut aussi noter que dans leur structure
interne les GALs sont constitués de transistor CMOS alors que les PALs classiques sont constitués de
transistors bipolaires. La consommation des GALs est donc beaucoup plus faible. Depuis d’autres
constructeurs fabriquent ce type de produit en les appelant « PAL CMOS ».
Par soucis de remplacer les PALs, LATTICE a équipé la plupart de ses GALs de macro cellules
programmables permettant d’émuler n’importe quel PAL. Ces structures de sortie sont donc du type «
Versatile » (V).
Il est aussi constitué d’un ensemble de huit octets, appelé signature électronique, pouvant contenir des
informations diverses sur le produit.
Comme cela a été spécifié auparavant, ces structures de sortie sont programmables et permettent
d’émuler n’importe quelle autre structure de sortie. Elles possèdent en tout 2 bits de programmation
communs à toutes les cellules (CG1 et CG0) et 2 bits spécifiques à chaque cellule (CL0x et CL1x).
Remarque : En configuration « Registre » et en n’utilisant pas l’état haute impédance des portes 3
états, il faut relier la broche OE (n°11) à VCC.
E/S Combinatoire -
Entrée combinatoire -
Remarques : La programmation des cellules de sortie est transparente pour l’opérateur. C’est le
logiciel de développement qui, en fonction de certaines indications (sortie / entrée registre ou
combinatoire), effectue la configuration des structures de sortie.
Pour le GAL 16V8, Les broches 15 et 16 ne peuvent pas être configurées en entrées combinatoires
brochage du 16V8 -
brochage du 22V10 –
L'utilisation optimale des potentialités d'intégration d'un FPGA conduira à un routage délicat et
pénalisant en terme de vitesse. Il convient de noter que ces retards sont dus à l'interaction de la
Chapitre III
I/ Architecture générale
Les FPGA se sont imposés sur le marché des circuits logiques depuis la fin des années 1980. Alors
qu’au début ils permettaient de remplacer quelques composantes discrètes de façon plus efficace
que les PALs et PLAs, ils concurrencent de nos jours certains microprocesseurs et microcontrôleurs
en complexité et en performance.
Un FPGA est composé à la base de :
un réseau de blocs de logique programmable (Configurable Logic Block CLB), chaque
bloc pouvant réaliser des fonctions complexes de plusieurs variables, et comportant des
éléments à mémoire;
un réseau d’interconnexions programmables entre les blocs;
des blocs spéciaux d’entrée et de sortie avec le monde extérieur (Input/Output Block – IOB).
# x y z F entrée Di valeur
z’ 0
0 0 0 0 1
D0 z’ 0 1
1 0 0 1 0 F
2 0 1 0 0 z 2
D1 0 1 3
3 0 1 1 0
4 1 0 0 0 S0
D2 z S1
5 1 0 1 1
6 1 1 0 1 x
D3 1
7 1 1 1 1 y
Figure 0-1 – implémentation d’une fonction logique par multiplexeur
Les CLBs basés sur les tables de conversion utilisent de petites mémoires programmables au
lieu de multiplexeurs. Cette approche est similaire à l’approche par multiplexeurs, mais en
supposant que 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. De plus, le circuit peut être plus rapide parce que
les entrées du multiplexeur sont constantes.
Les FPGAs de la compagnie Altera étaient à l’origine basés sur une approche par multiplexeurs,
alors que ceux de Xilinx utilisaient des tables de conversion. La plupart des FPGAs récents utilisent
H1 S1
F4
XQ
F3 D Q
Table de
conversion
F2 F CLK
16 X 1 S2
F1
S3
CLK
Arrays of
programmable
logic blocks
Multipliers
Logic blocks
multiplicateurs intégrés
Les paramètres d’opération des multiplicateurs varient selon les familles de FPGA. Un format
populaire est un multiplicateur signé de 18 × 18 bits, ce qui est suffisant pour beaucoup
d’applications de traitement du signal (le son est encodé avec 8 bits sur une ligne de téléphone et
avec 16 bits par canal pour un CD audio). Pour les applications devant traiter des opérandes plus
larges, il est possible de regrouper plusieurs multiplicateurs. Le nombre de multiplicateurs varie,
mais on en retrouve facilement des dizaines même sur les FPGAs les plus modestes.
Une autre fonction populaire est la multiplication-accumulation (Multiply-Accumulate – MAC), qui
consiste à accumuler le produit de plusieurs nombres. Cette opération est utilisée entre autres pour
le calcul du produit scalaire. Afin d’accélérer cette opération, plusieurs fabricants intègrent des
blocs MAC à leurs FPGAs.
Multiplier
Adder
Accumulator
A[n:0]
xx
B[n:0] + Y[(2n - 1):0]
MAC
multiplication-accumulation
uP uP
uP
uP uP
Special clock
pin and pad
0 o Phase shifted
90 o Phase shifted
Pour distribuer l’horloge à travers la puce tout en minimisant le déphasage d’horloge, on utilise un
réseau en arbre dédié. Ce réseau est alimenté soit par une patte spéciale du FPGA à laquelle est
associé un amplificateur dédié, ou bien par l’entremise de signaux internes pouvant être routés au
même amplificateur. La Erreur ! Source du renvoi introuvable. illustre un tel arrangement.
Clock
Flip-flops
tree
Special clock
pin and pad
Chapitre IIX
Le langage VHDL
I) Introduction.
2) L’affectation manuelle.
On définit les numéros de broches dans la description VHDL ou sur un schéma bloc
définissant les liaisons entre les différents blocs VHDL ou dans un fichier texte propre au
fondeur. Les numéros de broches seront affectés suivant les consignes données.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
-- cette dernière bibliothèque est souvent utilisée pour l’écriture de compteurs
Elle permet de définir le NOM de la description VHDL ainsi que les entrées et sorties
utilisées, l’instruction qui les définit c’est port :
Syntaxe:
entity NOM_DE_L_ENTITE is
end NOM_DE_L_ENTITE;
Exemple :
entity SEQUENCEMENT is port (
CLOCK : in std_logic;
RESET : in std_logic;
Q : out std_logic_vector(1 downto 0)
);
end SEQUENCEMENT;
L’instruction port .
Syntaxe: NOM_DU_SIGNAL : sens type; Exemple: CLOCK: in std_logic;
BUS : out std_logic_vector (7 downto 0);
III.2.1) Le NOM_DU_SIGNAL.
Il est composé de caractères, le premier caractère doit être une lettre, sa longueur est
quelconque, mais elle ne doit pas dépasser une ligne de code. VHDL n’est pas sensible à la « casse
», c’est à dire qu’il ne fait pas la distinction entre les majuscules et les minuscules.
III.2.3) Le TYPE.
Le TYPE utilisé pour les signaux d’entrées / sorties est :
- le std_logic pour un signal.
- le std_logic_vector pour un bus composé de plusieurs signaux.
entity MAGNITUDE is
port( A, B: in std_logic_vector(7 downto 0); AGRB: buffer std_logic));
end MAGNITUDE;
entity IMAGE3 is
port (CLK : in std_logic;
S,I : out std_logic);
end IMAGE3;
entity COMP4BIT is
port (A,B :in std_logic_vector(3 downto 0); PLUS,MOINS,EGAL :out std_logic);
end COMP4BIT;
entity COMPT_4 is
entity DECAL_D is
port (H,R,IN_SERIE :in std_logic;
OUT_SERIE :out std_logic);
end DECAL_D;
Exemples :
-- Opérateurs logiques de base entity PORTES is
port (A,B :in std_logic;
Y1,Y2,Y3,Y4,Y5,Y6,Y7:out std_logic);
end PORTES;
-- Décodage d’adresses
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
begin
ADRESSE <= A15 & A14 & A13 & A12 & A11 & A10 & "----------";
-- definition du bus d’adresses
ROM <= '0' when (ADRESSE >= x"E000") and (ADRESSE <= x"FFFF") else '1'; RAM0 <=
'0' when (ADRESSE >= x"0000") and (ADRESSE <= x"03FF") else '1'; RAM1 <= '0' when
(ADRESSE >= x"0400") and (ADRESSE <= x"07FF") else '1'; RAM2 <= '0' when (ADRESSE
>= x"0800") and (ADRESSE <= x"0BFF") else '1'; RAM3 <= '0' when (ADRESSE >=
x"0C00") and (ADRESSE <= x"0FFF") else '1';
INTER1 <= '0' when (ADRESSE >= x"8000") and (ADRESSE <= x"8001") else '1'; INTER2
<= '0' when (ADRESSE >= x"A000") and (ADRESSE <= x"A001") else '1'; INTER3 <= '0'
when (ADRESSE >= x"C000") and (ADRESSE <= x"C00F") else '1';
end DESCRIPTION;
IV) Les instructions de base (mode « concurrent »), logique combina- toire.
Pour une description VHDL toutes les instructions sont évaluées et affectent les signaux de
sortie en même temps. L’ordre dans lequel elles sont écrites n’a aucune importance. En effet la
description génère des structures électroniques, c’est la grande différence entre une description
VHDL et un langage informatique classique.
Dans un système à microprocesseur, les instructions sont exécutées les unes à la suite des
autres.
Avec VHDL il faut essayer de penser à la structure qui va être générée par le synthétiseur
pour écrire une bonne description.
Exemple : Pour le décodeur 1 parmi 4, l’ordre dans lequel seront écrites les instructions n’a
aucune importance.
Dans une description VHDL, c’est l’opérateur le plus utilisé. En effet il permet de modifier
l’état d’un signal en fonction d’autres signaux et/ou d’autres opérateurs.
Les valeurs numériques que l’on peut affecter à un signal sont les suivantes :
- ‘1’ ou ‘H’ pour un niveau haut avec un signal de 1 bit.
- ‘0’ ou ‘L’ pour un niveau bas avec un signal de 1 bit.
- ‘Z’ pour un état haute impédance avec un signal de 1 bit.
end DESCRIPTION;
Valeur de A Valeur de B
"001" "110"
Opérateur VHDL
ET and
NON ET nand
OU or
NON OU nor
OU EXCLUSIF xor
NON OU EXCLUSIF xnor
NON not
DECALAGE A sll
GAUCHE
DECALAGE A srl
DROITE
ROTATION A rol
GAUCHE
ROTATION A ror
DROITE
Exemples :
S1 <= A sll 2 ; -- S1 = A décalé de 2 bits à gauche.
S2 <= A rol 3 ; -- S2 = A avec une rotation de 3 bits à gauche
S3 <= not (R); -- S3 = R
Remarque : Pour réaliser des décalages logiques en synthèse logique, il est préférable
d’utiliser les instructions suivantes :
Décalage à droite :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= ‘0’ & A(7 downto 1); -- décalage d’un bit à droite
S1 <= "000" & A(7 downto 3); -- décalage de trois bits à droite
Décalage à gauche :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= A(6 downto 0) & ‘0’; -- décalage d’un bit à gauche
S1 <= A(4 downto 0) & "000"; -- décalage de trois bits à gauche
Opérateur VHDL
ADDITION +
SOUSTRACTION -
MULTIPLICATION *
DIVISION /
Remarque N°1 : Pour pouvoir utiliser les opérateurs ci-dessus il faut rajouter les
bibliothèques suivantes au début du fichier VHDL:
Use ieee.numeric_std.all ;
Use ieee.std_logic_arith.all ;
Ils permettent de modifier l’état d’un signal ou de signaux suivant le résultat d’un test ou
d’une condition. En logique combinatoire ils sont souvent utilisés avec les instructions :
- when … else …
- with …. Select ….
Voir ci-dessous.
Opérateur VHDL
Egal =
Non égal /=
Inférieur <
Inférieur ou égal <=
Supérieur >
Supérieur ou égal >=
Remarque : l’instruction [else expression] n’est pas obligatoire mais elle for- tement
conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la condition n’est pas remplie.
On peut mettre en cascade cette instruction voir l’exemple N°2 ci-dessous
Schéma correspondant :
Exemple N°2 :
-- Structure évoluée d’un multiplexeur 4 vers 1
S2 <= E1 when (SEL="00" ) else
E2 when (SEL="01" ) else
E3 when (SEL="10" ) else
E4 when (SEL="11" )
else ‘0’;
Remarque: l’instruction [expression when others] n’est pas obligatoire mais fortement
conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la condition n’est pas remplie.
Remarque: when others est nécessaire car il faut toujours définir les autres cas du signal de
sélection pour prendre en compte toutes les valeurs possibles de celui-ci.
Schéma correspondant après synthèse:
S2 <= (E1 and not(SEL(1)) and not(SEL(0))) or (E2 and not SEL(1) and
(SEL(0)) or (E3 and SEL(1) and not(SEL(0))) or (E4 and SEL(1) and SEL(0));
L’équation logique ci-dessus donne aussi le même schéma, mais elle est peu
compréhensible, c’est pourquoi on préfère des descriptions de plus haut niveau en utilisant les
instructions VHDL évoluées.
Exemple N°3 : Affectation sélective avec les autres cas forcés à un ‘1’.
Library ieee;
Use
ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity TABLE2 is
port (
E1,E2 : in std_logic;
SEL : in std_logic_vector(1 downto 0);
S2 : out std_logic);
end TABLE2;
architecture DESCRIPTION of TABLE2 is
begin
with SEL select
S2 <= E1 when
"00", E2
when
"01",
'1' when others; -- Pour les autres cas de SEL S2
-- prendra la valeur 1 logique
end DESCRIPTION;
Exemple N°4 :Affectation sélective avec les autres cas forcés à une valeur
quelconque ‘-’.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity TABLE3
is port (
E1,E2 : in std_logic;
SEL : in std_logic_vector(1 downto
0); S2 : out std_logic);
end TABLE3;
architecture DESCRIPTION of TABLE3 is
begin
with SEL select
S2 <= E1 when "00",
E2 when "01",
'-' when others; -- Pour les autres cas de SEL S2
-- prendra la valeur quelconque
end DESCRIPTION;
Exemple:
Exemple: case SEL is
if (RESET=’1’) then SORTIE <= ”0000”; when “000” => S1 <= E1;
end if ; when “001” => S1 <= ‘0’;
when “010” | “011” => S1 <=’1’;
-- La barre | permet de réaliser
-- un ou logique entre les deux
-- valeurs “010” et “011”
when others => S1 <= ‘0’;
end case;
Commentaires
- Seul le signal CLK fait partie de la liste de sensibilité. D’après les règles de fonctionnement
énoncées précédemment, seul un changement d’état du signal CLK va déclencher le process
et par conséquent évaluer les instructions de celui-ci.
- L’instruction if (CLK'event and CLK='1') then permet de détecter un front montant du
signal CLK. La détection de front est réalisée par l’attribut event appliqué à l’horloge CLK.
Si on veut un déclenchement sur un front descendant, il faut écrire l’instruction
suivante : if (CLK'event and CLK=
LK).
- Si la condition est remplie alors le signal de sortie S sera affecté avec la valeur du signal
d’entrée D.
Exemple N°2 : Même exemple que précédemment mais avec des entrées de présélections
de mise à zéro RESET prioritaire sur l’entrée de mise à un SET, toutes les deux
sont synchrones de l’horloge CLK.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity BASCULEDSRS
is port (
D,CLK,SET,RESET : in std_logic;
S : out std_logic);
end BASCULEDSRS;
Commentaires :La description ci-dessus fait appel à un signal interne appelé S_INTERNE,
pourquoi faire appel à celui-ci ? La réponse est que le signal S est déclaré comme une sortie
dans l’entité, et par conséquent on ne peut pas utiliser une sortie en entrée.
Pour contourner cette difficulté on utilise un signal interne qui peut être à la fois une entrée
ou une sortie. Avec cette façon d’écrire, les signaux de sortie d’une description ne sont ja-
mais utilisés comme des entrées. Cela permet une plus grande portabilité du code.
Si on ne déclare pas de signal interne, le synthétiseur renverra certainement une erreur du
type : Error, cannot read output: s; [use mode buffer or inout].
Le synthétiseur signale qu’il ne peut pas lire la sortie S et par conséquent, celle-ci doit être
du type buffer ou inout.
Remarque : Si on souhaite ne pas utiliser de variable interne on peut déclarer le signal S
de type buffer ou inout.
Commentaires : Commentaires :
On peut constater que S est bien du type On peut constater que S est bien du type
inout. buffer
Library ieee;
Use
ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity CMP4BITS is
PORT (
CLOCK : in std_logic;
Q : out std_logic_vector (3 downto 0));
M.TAYARI Lassaad Page 55/62 Chapitre 4
FPGA ISET GABES
end CMP4BITS;
Quelle différence entre les deux descriptions ? Dans la deuxième le signal RESET n’est plus
dans la liste de sensibilité, par conséquence le process ne sera déclenché que par le signal
CLOCK. La remise à zéro ne se fera que si un front montant sur CLOCK a lieu.
Library
ieee;
Use
ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use eee.std_logic_unsigned.all;
entity CMP4BITSLUD
is
PORT
(
RESET, CLOCK, LOAD, UP: in std_logic;
DATA : in std_logic_vector (3 downto 0);
Q : out std_logic_vector (3 downto 0));
end
CMP4BITSLUD;
Remarque : Dans ce cas la validation de la retenue s’effectue de façon synchrone car elle
est dans le process, mais la description est peu lisible.
entity CMP_BCD8 is
PORT (
RESET, CLK : in std_logic;
Q : out std_logic_vector (7 downto 0));
end CMP_BCD8;