Académique Documents
Professionnel Documents
Culture Documents
Version 2022-2023
St Jérôme Douala
A. Nketsa
Langage complet
Même langage pour toutes les étapes de la conception à la mise en œuvre des systèmes numériques.
Spécification :
Etape de description du système avec ses objectifs et ses contraintes du système
Modélisation
Etape de représentation du fonctionnement présumé du système.
Simulation
Etude des cas réels du système modélisé
Synthèse
Etape de traduction du modèle en équations logiques et de transfert dans un circuit logique programmable
Comportementale aussi appelée algorithmique car les instructions utilisées sont semblables à celles des langages évolués en
Informatique.
Structurelle connexion de composants
Hiérarchisation – modularité
Langage ouvert
Définition de nouvelles fonctions
Constructeur
Utilisateur
FPGA
ASIC
Notation
a) Pas de distinction majuscule-minuscule
Sauf pour les constantes entre apostrophes (‘’) et les chaînes entre guillemets (" ")
b) Littéraux
Les littéraux sont des valeurs attribuables à différents objets (éléments du langage).
* entiers décimaux relatifs (integer):
Notation habituelle, mais on peut y inclure '_' (souligné) comme séparateur
Exemples : 1254
* caractères (constant):
Un seul caractère se met entre apostrophes : 'A' , 'f ' , '1'
Dans ce cas les majuscules et minuscules sont différenciées.
Les mots en gras sont ceux que nous allons utiliser très souvent.
abs access after alias
all and architecture array
asset attributs begin block
body buffer bus case
component configuration constant disconnect
downto else elsif end
entity exit file for
function generate generic group
guarded if impurs in
inertial inout is label
library linkage literal loop
map mod nand new
next nor not null
of on open or
others out package port
postponed procedure process purs
range record register reject
rem report return rol
ror select severity signal
shared sla sll sra
srl subtype then to
transport type unaffected units
until use variable wait
when while with xnor
xor
Types utilisés en TP
Std_logic : rappel des valeurs possibles :
‘U' valeur non initialisée
'X' niveau inconnu forçage fort
'0' niveau 0 forçage fort
'1' niveau 1 forçage fort
‘Z’ haute impédance
‘W’ niveau inconnu forçage faible
‘L’ niveau 0 forçage faible
’H’ niveau 1 forçage faible
’-‘ quelconque (non défini)
Std_logic_vector tableau de std_logic
(fin downto debut)
Std_logic_vector (fin downto debut)
Nous reviendrons sur le type utilisateur pour donner des noms aux états d’une machine à états.
Exemple :
signal Nom_tableau : std_logic_vector(7 downto 0)
Exemple
entree in
out sortie
inout entree_sortie
a) Les Opérateurs
Opérateurs relationnels =
Opérateurs de comparaison
=
/=
Std_logic
< tout type
Natural ou std_logic_vector par booléen
<= scalaire
extension
>
>=
Remarques
b-1) Définition
Une expression est une combinaison cohérente d’opérateurs et d’opérandes
- expression logique
- expression arithmétique
Définition
C'est une expression dont l'évaluation donne un résultat vrai ou faux.
Formes générales
2 formes :
a) expression simple = résultat d'une comparaison
b) composée = résultat d'une fonction logique de booléens
Exemples :
signal busd : std_logic_vector(7 downto 0);
Exemples
A and B a3 a2 a1 a0
and and and and
b3 b2 b1 b0
Formes générales
a) Std_logic : std_logic opérateur_logique std_logic
Définition
C'est une expression qui se calcule en utilisant les opérateurs arithmétiques et qui produit un résultat du type de sortie.
Les opérateurs arithmétiques couramment utilisés sont l'addition et la soustraction.
Formes générales
Exemple
Habituel
Vue externe
Définition
C'est la description des entrées-sorties du système en indiquant la direction de chaque élélent
a) Système à construire
Nom_systeme
Dans ce cas :
- le système est considéré comme un composant avec
des broches externes.
- les noms de ces broches sont associés à ce composant
entree
On dit aussi que le système est encapsulé. sortie
Donc
- on a accès à ces broches Nom_systeme
- la fonction est implicite
Entity nom_entité is
Port ( nom_signal1 : direction type;
In pour entrée
Out pour sortie
Inout pour entrée-sortie
Entity nom_entité is
Generic(nom_paramètre : type_paramètre := valeur_défaut ;
Nom_paramètre1 : type := valeur1_defaut);
Port ( nom_signal1 : direction type;
In pour entrée std_logic
Out pour sortie std_logic_vector(fin downto deb)
Inout pour entrée-sortie natural ou integer ou positive
Définition
La vue interne correspond à la description du comportement du système en fonction de la vie externe associée.
Ecriture en VHDL
Architecture
Begin
-- Description du comportement
Définition Package
Un package est un fichier où on regroupe :
- les déclarations des nouveaux types
- les déclarations de composants pour les rendre utilisables en tant que tel.
- les définitions des fonctions et des procédures que nous ne traiterons pas
Schéma de principe
Librairie
Package p1
Package pn
Std_logic_unsigned pour les calculs arithmétiques sur les std_logic_vector considérés comme des nombres entiers non-signés
Std_logic_arith pour les calculs sur les entiers
Std_logic_signed pour les calculs arithmétiques sur les std_logic_vector considérés comme signés
Invocation de la librairie
Library nom_librairie ;
Use nom_librarie.nom_package.nom_composant;
Ou
);
Port (
); );
end nom_entité; end nom_entité;
Entity nom_entité is
Port (
);
End nom_entité;
Begin
-- Description du comportement
End nom_architecture;
Package nom_package is
Component nom_composant1 is
End component;
-- autres composants
Component nom_composantn is
End component;
End nom_package;
Nous n'utiliserons pas cette année le corps du package donc nous ne le présentons pas.
c) Notion de parallélisme
Nous allons voir sur un exemple que les blocs étant autonomes, l'écriture en séquence n'empêche pas le fonctionnement en
parallèle de ces blocs.
Exemple
On veut traduire le schéma suivant en VHDL selon 3 versions :
A
X
Y
B
Y = (A ET B) OU C
Version1 Version 2 Version 3
Y <= (A and B ) or C; X <= A and B; Y <= X or C;
Y <= X or C; X <= A and B;
expression_defaut;
b) Conditioni
Les conditioni sont des expressions booléennes
c) Notion de priorité
Il y a une priorité entre les conditions.
L'ordre de priorité est celui d'écriture des conditions.
La première (ici condition1) est plus prioritaire que les autres zt ainsi de suite.
Les conditioni doivent être exclusives deux par deux
C'est-à-dire conditioni ET conditionj est faux avec i j
ou plus simplement conditioni ET conditionj = 0
Exemple
Instruction Equation générée
S <= A when B='1' else Priorité de B=1
C when D='0' else Priorité de B=1 et D=0
E; S= A B
+ C . /B . /D
+ E . /B . D
C
Mémoire implicite
Non fatale
Remarque :
La mémoire implicite de strycture est valable uniquement lorsque B = 0.
C'est pour cela que la mémoire est non fatale.
f) Exemples
f=A.B devient
f <= A when B = '1' else
'0';
VHDL SYNTHETISABLE A. Nketsa 47 14/11/2022
e-3) Assignation sélective (with select)
Syntaxe
with choix select
nom_signal <= expression1 when choix1,
expression2 when choix2,
b) Choixi
Les choixi sont les valeurs possibles de choix
c) Notion de priorité
Puisque les choixi sont les valeurs possibles de choix alors il n'y a pas de priorité entre les choixi
C
Solution avec on mux2v1
Mémoire implicite
Mux2V1
fatale
A I1
S
Y
C I0
S
B
Fonction combinatoire Fonction séquentielle asynchrone
Remarque :
La mémoire implicite de structure est valable dès que S =1. Er S reste à 1
C'est pour cela que la mémoire est fatale.
VHDL SYNTHETISABLE A. Nketsa 49 14/11/2022
e-4 Notion de composant (Instanciation = utilisation particulière)
Généralités
Un composant est constitué de deux parties:
- la vue externe (décrite par l'entité)
- le comportement (décrit dans l'architecture) (encapsulé)
Un composant :
- doit être construit. Pour cela, il est décrit comme tout système en VHDL.avec le couple entité-architecture
- peut être utilisé. Pour cela, on a besoin uniquement de la vue externe, le comportement étant sous_entendu (on dit aussi encapsulé)
Représentation graphique
Règles
Nom_composant
broche_in broche_out
signal_out
signal_in
broche_inout
Nom_composant Signal_inout
broche_in broche_out
gen(n:=x) broche_inout
Nom_composant
Nom_utilisation Nom_utilisation
signal_out signal_out
signal_in signal_in
broche_in broche_out broche_in broche_out
Signal_inout Signal_inout
y
broche_inout gen(n:=x) broche_inout
Nom_composant Nom_composant
COMPONENT nom_du_composant IS
PORT ( signal : direction type ;
signal : direction type ;
…
signal : direction type
);
END COMPONENT ;
Description du composant
-- librairie et utilisation
ENTITY nom_du_composant IS
PORT ( signal, [signal], … : direction type ;
signal, [signal], … : direction type ;
…
signal, [signal], … : direction type
);
END nom_du_composant ;
END nom_architecture_du_composant ;
VHDL SYNTHETISABLE A. Nketsa 54 14/11/2022
PACKAGES ET LIBRAIRIE
PACKAGE nom_du_package IS
"Déclarations de composants"
"Déclarations de fonctions"
"Descriptions de types"
END nom_du_package ;
Un "package" est toujours associé à une librairie. La visibilité de cette librairie se fait par l'instruction LIBRARY. La visibilité d'un
"package" par l'instruction USE.
LIBRARY nom_de_la_librairie ;
USE nom_de_la_librairie.nom_du_package.ALL ;
platine
en
u0_deco
ptd
segment(7..0) Inter(5) en
Inter(4) ptd seg(7 ..0)
E(3..0)
segment(7..0)
deco_7seg
Inter(3 ..0) E(3..0)
deco_7seg
u0_deco : deco7seg
port map ( en => inter(5), ptd => unter(4),
e => inter(3 downto 0), segment => seg
);
u0_cptgn : cptgn
generic map ( n => 4)
port map ( ck => ck, arazb =>> aeazb,
sraz => inter(7), sload => inter(6),
en => inter(5), ud => inter(4),
E => inter(3 downto 0),
Q => Q, find => open, finc => open
);
Par conséquent,
- la mise à jour des signaux se fait uniquement à la fin du process
- seule la dernière modification est vue à l’extérieur du process.
- les modifications intermédiaires sont ignorées.
begin
-- instructions du mode séquentiel
end process nom_process ;
b) Compréhension
Cette instruction décrit un genre de multiplexeur avec priorité
Si condition1 est vraie alors exécution de suite_instructions1
c) Conditioni
Les conditioni sont des expressions booléennes
Exemple
Instruction Equation générée
If B='1' then S <= A; Priorité de B=1
elsif D='0' then S <= C; Priorité de B=1 et D=0
else S <= E; S= A B
end if; + C . /B . /D
+ E . /B . D
C
Mémoire implicite
Non fatale
Remarque :
La mémoire implicite de structure est valable uniquement lorsque B = 0.
C'est pour cela que la mémoire est non fatale.
b) Compréhension
Cette instruction décrit un vrai multiplexeur, c'est-à-dire une fonction d'aiguillage
Si cboix vaut choix1 alors exécution de suite_instructions1
c) Choixi
Les choixi sont les valeurs possibles de choix
d) Notion de priorité
Puisque les choixi sont les valeurs possibles de choix alors il n'y a pas de priorité entre les choixi
Logigramme produit A A
B S B S
C
Solution avec on mux2v1
Mux2V1 Mémoire implicite
A I1 fatale
S
Y
C I0
S
Exemple
If cond1 then
Case choix is
When choix1 => if cond2 then
End if;
When choix2 =>
suite de case
End case;
Else
autres instructions
End if;
Définition
La mémoire implicite de construction apparaît sur un signal qui n'a pas été décrit dans toutes les branches des instructions if
then et cas is
S1 et S2 sont décrites dans toutes les branches de S1 est décrite dans toutes les branches de l'instruction if
l'instruction if then then
Donc S1 est combinatoires
Donc S1 et S2 sont combinatoires, c'est-à-dire sans
mémoire S2 n'est pas décrite dans toutes les branches de
l'instruction if then
Donc S2 présente une mémoire omplicite de
construction
Deux solutions
a) Décrire tout signal dans chaque branche de if then et/ou Case is
b) Exploiter le fait que dans le mode séquentiel, c'est la dernière assignation du signal qui est prise en compte à la sortie du
process. Pour cela, il suffit de définir une valeur initiale avant l'utilisation des instructions concernées
Solution a) Soluyion b)
S2 <= '0'; -- valeur initiale de S3
Déclaration des signaux (les signaux assurent le lien entre les blocs)
instanciation de composant
Begin
Bloc Instructions séquentielles (style algorithme)
Assignation inconditionnelle
if then else end if;
case end case;
End process ;
End nom_architecture;
Remarque :
Il existe des cas de tables où chacune de ces instructions peut être utilisée pour la programmer en VHDL,
architecture ar if avec_priorite is
begin
id <= (others => '0' when sraz='1' else
E when sload='1' else
iq+1 when en='1' else
iq;
end ar;
Exemple
Exemple
f(A, B, C, D) = A.B.C.D A.B.D B.C C.D
- Classer kes termes produits par ordre de priorité. le plus prioriyaire = celui ayant plus de variavles
Donc A.B.C.D est le plus prioritaire suivi de A.B.D puis de B.C C.D
Généralités
Définition
Un système séquentiel est un système présentant u,e mémoire rel que la même combinaison des entrées ne produit pas le même
résultat.
Système asynchrone
Rappel définition d’un système asynchrone
C(est un système séquentiel sans horloge.
Remarques préliminaires :
Bascule RS
Entity Bascule_rs is Architecture ar of bascule_rs is
Port ( R, S : in std_logic;
Q : out std_logic Begin
);
end bascule_rs;
End ar;
C'est un système séquentiel avec une entrée privilégiée, appelée horloge, qui valide toute mise à jour de la sortie.
Description de l’horloge
Il est conseillé et de bonnes pratiques que tout système synchrone soit initialisé explicitement de manière asynchrone (par exemple
avec une entrée arazb).
combinatoire
CK arazb entity seq_simples is
Entrees generic (n : natural := 3);
Bloc
End arch;
VHDL SYNTHETISABLE A. Nketsa 83 14/11/2022
Applications aux systèmes séquentiels simples
2) Registre Tampon (reg_tampon_en)
autorisation(en), mise à zéro asynchrone (arazb), et mise à un asynchrone (asetb)
Schéma Description
Reg_tampon_en
Library ieee;
asetb use ieee.std_logic_1164.all
arazb entity reg_tampon_en is
CK generic (n : natural := 3);
E[] port ( ck, arazb, asetb : in std_logic;
asetb
arazb
CK
combinatoire
en en : in std_logic
E : in std_logic_vector(n-1 downto 0);
Bloc
gen(n:=2) Q[]
ID[]
D[] Q[]
IQ[] Q : out std_logic_vector(n-1 downto 0)
bascules );
end reg_tampon_en;
Conclusion :
Pour toutes les fonctions séquentielles simples,
si on adopte la description de la partie combinatoire en dehors de if ck’event
alors il suffit de décrire uniquement la table de vérité du bloc combinatoire,
le reste du fichier est inchangé.
Schéma Description
reggn Library ieee;
arazb
CK use ieee.std_logic_1164.all
sraz entity reggn is
arazb
combinatoire
en
E[]
CK generic (n : natural := 2);
Bloc
Q <= iq ;
End ar;
.
Table de vérité Table de vérité finc et find
Table de vérité de la partie combinatoire
Entrées synchrones Ud finc find
sraz sload en ud id Remarque 0 Iq = tous_un 0
1 * * * 0 Mise à 0 1 1 Iq = 0
0 1 * * E chargement
0 0 1 0 IQ + 1 Comptage
0 0 1 1 IQ - 1 Décomptage
0 0 0 * IQ mémoire
Begin
--Description du bloc mémoire
Process(ck, arazb)
Begin
If arazb=’0’ then iq <= (others => ‘0’)
elsif ck’event and ck=’1’ then
Iq <= id;
End if;
end process
Description
finc indique la détection de Emax quand ud =0
si cpt = Emax et ud=0 alors finc = 1
sinon finc = 0
find indique la détection de 0 quand ud =1
si cpt = 0 et ud = 1 alors find = 1
sinon find = 0
Cas particulier : l'état initial est représenté par un double rond avec un numéro
ou un nom initial
Vocabulaire
Etat_amont condition
amont aval
Etat_aval
nom
C2 nom
C2.C1
Valable si C1 . C2 = 0
Donc C1 et c1 sont exclusives
Règles d'évolution
1- Chaque actif est actif ou pas et on ne peut avoir qu'un seul actif à la fois.
2- La Mae démarre toujours par l'état initial actif.
3- On part de l'état actif
a) évaluer la condition associée à chaque transition sortant de l'état actif
b) Si aucune condition n'est vraie alors il n'y a pas d'évolution
c) Si une condition est vraie alors il y a une évolution :
désactiver l'état actif et activer l'état aval de la transition dont la condition est vraie.
4- recommencer en 3
- Action AMZI
Définition
C'est une action dont on indique sur le graphe uniquement les activations.
L'action est désactivée partout ailleurs.
C'est une action combinatoire (pas de mémoire)
Représentation
nom_amzi = expression
Représentation
Activation
Nom_amzi = expression
condition
x y
R Nom_amze_mz = expression1
L'action est décrite à côté de l'état concerné
- l'action nom_amzi sera active dans l'état x, si expression est active (souvent 1)
- l'action nom_amze_mz sera active dans l'état x, si expression1 est active (souvent 1)
S Nom_amze_mu = expression1
condition
x y
L'action est décrite sur la transition concernée
- l'action nom_amze_mu sera active quand l'état amont x sera actif et que la condition est vraie.
C'est-à-dire au moment du passage de l'état amont x à l'état aval r.
Remarque importante :
Une même action peut être décrite plusieurs fois sur un même graphe..
La commande correspondante sera un ou de chaque description.
actions
entrées
MAZI
entrées sorties
MAZE
ck
ck
arazb
arazb
La mise en oeuvre en VHDL peut se faire de façon modulaire en partant du schéma de base des systèmes séquentiels.
Ce schéma comporte 3 blocs :
- le bloc évolution :
Ce bloc purement combinatoire calcule l'état suivant du système en fonction de l'état présent et des entrées.
- le bloc mémoire :
Ce bloc mémorise état suivant dans état présent.
- le bloc de sortie :
Ce bloc calcule chaque sortie à générer.
c) Décrire la mae
Cette description comporte 3 parties :
- Evolution pour le calcul de l'état suivant (on utilise un process)
- Mémorisation (process) pour produire l'état présent
- Sorties = actions généralisées
Action à mise à zéro implicite (AMZI) =
comportement combinatoire (When else, with select, if then ou case is)
Action à mise à zéro explicite (AMZE) =
comportement séquentiel (Process avec horloge et raz)
Représentation
nom_amzi = expression
Représentation
activation
S nom_amze_mu= expr_mu
desactivation
R nom_amze_mz= expr_mz
La mémoire est une bascule D mise à 1 par l'activation et la mise à 0 par la désactivation au rythme de l'horloge.
R S1_mz=e5
e0
e1
0 1 2 S0=e4
e2.e3
library ieee;
use ieee.std_logic_1164.all;
Entity mac_etat is
port ( ck, arazb : in std_logic;
e : in std_logic-vector(5 downto 0); ;
S0, S1 : out std_logic;
visu_etat : out std_logic_vector(1 downto 0)
);
end mac_etat;
Structure de l'architecture
Architecture a_mac_etat of mac_etat is
-- definition d'un type utilisateur pour les états de la machine
type etat_mae is (etat0, etat1, etat2);
-- declaration de éléments gestion de la machine
signal pres, suiv : etat_mae;
-- evolution
process(pres, ) process(pres, )
begin begin
case pres is
when etat0 => case pres is
when etat0 =>
S0 <=
S1_mu <=
S1_mz <=
-- Bascule S0
Process( )
end a_mac_etat;
Structure de l'architecture
Architecture a_mac_etat of mac_etat is
-- definition d'un type utilisateur pour les états de la machine
type etat_mae is (etat0, etat1, etat2);
-- declaration de éléments gestion de la machine
signal pres, suiv : etat_mae;
-- déclaration des signaux de gestion de AMZE
signal s1_mu, s1_mz : std_logic;
begin
-- ici la mémorisation de l'état_present
process(ck,arazb)
begin
if arazb = '0' then pres <= etat0; -- etat initial
elsif ck'event and ck='1' then pres <= suiv;
end if;
end process;
Version 1 Version 2
process(pres, e) process(pres, e)
begin begin
suiv <= pres;
case pres is case pres is
when etat0 => if e(0)='1' then suiv <= etat1; when etat0 => if e(0)='1' then suiv <= etat1;
else suiv <= etat0; else suiv <= etat0;
end if; end if;
when etat1 => if e(1)='1' then suiv <= etat2; when etat1 => if e(1)='1' then suiv <= etat2;
else suiv <= etat1; else suiv <= etat1;
end if; end if;
when etat2 => if e(2)='1' then suiv <= etat1; when etat2 => if e(2)='1' then suiv <= etat1;
elsif e(2)='0' and e(3)='1 elsif e(2)='0' and e(3)='1
then suiv <= etat0; then suiv <= etat0;
else suiv <= etat2; else suiv <= etat2;
end if; end if;
when others => suiv <= etat0; when others => suiv <= etat0;
end case; end case;
end process; end process;
end process;
End architecture;
Exemples
Comptage complexe
On veut réaliser un dispositif de comptage sur 4bits ayant 4 modes de fonctionnement
mode 0 : comptage modulo 14
mode 1 : Décomptage de 12 à 6
mode 2 : comptage et arrêt du comptage si q=9
mode 3 : figer le compteur à 5
sraz
Q[3..0]
sload
en
ud
E[3..0]
Cptg_4bits
Nous avons construit la table de vérité du bloc de commande qui accepte les phases transitoires lors des changements de mode
0 1 0 Iq 6 Ou Iq >12 1 1 12 Décomptage de 12 à 6
1 0 0 0 Iq 9 0 0 Comptage et arrêt à 9
1 1 0 1 x x 5 Figeage à 5
Exemple1
On veut réaliser un système de comptage en BCD modulo 60.
Ce système dispose par ailleurs d'une entrée de mis à 0 asynchrone, arazb (active à 0), d'une entrée de mise à zéro synchrone,
sraz_bcd_60 (active à 1) et d'une entrée d'autorisation de comptage, en_bcd_60 (active à 1)
Donner la vue externe et interne de ce système en faisant apparaître le bloc de commande et la partie opérative.
arazb arazb
Bcmd_bcd_60 arazb
ck
ck ck
Cptg_4bits
csrazd
sraz
iqd[3..0] qd[3..0]
cend
en Q[3..0]
0 sload
Sraz_bcd_60 0 ud
0000 E[3..0]
En_bcd_60
arazb
arazb
ck
ck Cptg_4bits
csrazu
sraz
cenu iqu[3..0] qu[3..0]
en Q[3..0]
iqd[3..0]
0 sload
iqu[3..0] 0 ud
0000 E[3..0]