Cours
Cours
Cours
2 Identicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.5 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5 Opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4 Section Architecture 23
1 Rôle de la section Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 Signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.1 Dénition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.2 Déclaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3 Description comportementale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.4.1 Instruction if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
(version 5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.6 Cas d'un système rythmé par un signal d'horloge : compteur BCD . . . . . . . . . . . 33
3.6.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6.3 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4 Architecture de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1 Introduction
Lors de sa dénition, les concepteurs du VHDL se sont appuyés partiellement sur un langage connu
pour ses qualités dans le domaine des applications "temps réel" : ADA. Celui-ci, présentant de nombreuses
similitudes avec le Pascal (au moins pour le vocabulaire de base), il n'est pas étonnant de retrouver un
certain nombre de termes de ce dernier langage (cf. types, dénition des tableaux, déclaration des variables,
2 Identicateurs
Les noms (variables, signaux, constantes et autres) choisis par le programmeur, appelés aussi identica-
Deux signes - (moins) placés successivement déclarent le début d'une zone de commentaires valable
Même s'il n'y a pas de généralités, le manuel Xilinx préconise d'utiliser les règles de notations suivantes lors
les identicateurs dénis par l'utilisateur s'écrivent en majuscules avec des caractères _ pour séparer
les mots.
comparaison.
8 Eléments de base du langage VHDL
ports font la liaison avec l'extérieur et les signaux sont internes à la fonction décrite. Leur utilisation est
identique à celle des ports ; par contre, leur déclaration a lieu au moment de la description comportementale
de la fonction.
Note : les signaux internes qui ne disparaissent pas lors de la synthèse (à cause de simplications es-
sentiellement) peuvent être observés lors du fonctionnement du FPGA à l'aide d'outils de debug en circuit
aide précieuse dans les processus de description et permettent de décrire la nature d'évolution des signaux
Note : L'utilisation des ports, signaux et variables sera envisagée par la suite.
4 Types de données
Comme la plupart des langages structurés, le VHDL impose de typer les données à manipuler. Ce caractère
incontournable justie la présence de fonctions spéciques permettant de réaliser des conversions de type
(transtypage).
complet, ces opérations (déclaration et aectation) ne peuvent être eectuées à la suite l'une de l'autre : les
déclarations doivent être faites à une endroit particulier du programme ; les aectations sont quant à elles
connues.
'0'
'1'
Ces deux valeurs ne sont pourtant pas susantes pour satisfaire les besoins de la synthèse logique : par
exemple, l'état haute impédance n'est pas envisagé ! Pour cette raison, ce type sera d'une piètre utilité en
matière de synthèse.
Note : une constante de type BIT (plus généralement un scalaire) doit être spécié entre deux apos-
trophes.
Remarque : ces premiers exemples montrent que l'opérateur d'aectation pour une variable (opérateur :=)
est diérent de celui utilisé pour un signal (opérateur <=) .
Notes :
Une constante de type BIT_VECTOR (plus généralement vectorielle) s'écrit entre deux doubles apos-
trophes (guillemets informatiques).
La variable VECTEUR1 utilise le mot clé to dans sa dénition et par conséquent son BIT de poids fort
(le 3) se trouve à droite. Ainsi, la première aectation met à 1 le BIT de poids fort (VECTEUR1 :=
"0001" ;).
La variable VECTEUR2 utilise le mot clé downto dans sa dénition et par conséquent son BIT de
les substitue à deux autres types énumérés (STD_ULOGIC et STD_ULOGIC_VECTOR ), énumérés eux
'1' : un forcé
'H' : un faible
La spécication d'une valeur STD_ULOGIC s'eectue toujours entre deux ' (Exemple : A<='1'). Le type
De la même façon, les types STD_LOGIC et STD_LOGIC_VECTOR ont été dénis. Ils correspondent
en fait à deux sous-types dont la dénition complète dépend du logiciel de simulation et de synthèse utilisé.
Comme ce sont des sous-types, ils ne prennent en compte qu'une partie de l'ensemble des valeurs possibles
oertes par les types STD_ULOGIC STD_ULOGIC_VECTOR (de nombreux simulateurs ne savent pas
et
gérer les valeurs 'H', 'W' ou 'L' du type STD_ULOGIC, ils utilisent plutôt le type STD_LOGIC déni sans
Remarque importante : puisqu'ils correspondent aux dernières avancées de la norme VHDL, les types
STD_LOGIC et STD_LOGIC_VECTOR sont à préférer aux types BIT et BIT_VECTOR. Cette remarque
est d'autant plus vraie que seuls ces types sont bien adaptés à la simulation et à la synthèse.
L'utilisation de ces types est par ailleurs identiques à celle de leurs homologues que sont BIT et
BIT_VECTOR.
La dénition de ces types dans le paquetage VHDL IEEE 1164 est la suivante :
type STD_ULOGIC i s ( 'U' , 'X' , ' 0 ' , ' 1 ' , ' Z ' , 'W' , 'L ' , 'H' , ' − ' ) ;
type STD_ULOGIC_VECTOR i s (NATURAL RANGE <>) o f STD_ULOGIC;
TRUE (vrai)
FALSE (faux)
Même si ce type est simplement binaire, il ne faut pas pour autant le confondre avec le type BIT vu
précédemment. D'une part, ce type est le type de référence des instructions conditionnelles (voir suite) ;
d'autre part, les mots FALSE et TRUE apportent une lisibilité au code que ne fournit pas le type BIT lors
d'opérations d'aectations ou de comparaisons (FALSE est plus clair que `0' ; idem pour TRUE vis à vis de
`1').
de caractères ASCII (tous les caractères sans les codes de contrôle ; voir documentation du compilateur
niveau de gravité programmable lors d'incidents de simulation. Les variables de ce type peuvent prendre les
type REAL : l'étendue des valeurs dépend du compilateur VHDL et la norme VHDL impose des valeurs
aux puissances de 10 au moins comprises entre -38 et +38.
Note : peu utiliser pour la synthèse, ces types ne justient pas davantage d'information dans ce manuel.
deux types permettant une manipulation aisée de données entières signées ou non.
Les types UNSIGNED et SIGNED utilisent pour base des vecteurs de bits. L'éventail des valeurs que
peut couvrir une variable ou un signal de type UNSIGNED ou SIGNED dépendra du nombre de bits qui
Le sous-type NATURAL correspond en fait à une restriction du type INTEGER dans on conserve toutes
les valeurs supérieures ou égales à 0. De la même façon, le sous-typePOSITIVE est une restriction du type
INTEGER dont seules les valeurs supérieures à 0 sont conservées.
Note : Les éléments RANGE et INTEGER'high seront explicités un peu plus loin.
source encore plus lisible. Par exemple, une machine à états pourra être l'occasion de créer un type utilisateur
permettant de spécier l'intervalle des valeurs valides pour le type créé (pour la simulation ou la synthèse).
En plus de fournir des informations de contrôle au simulateur, cette directive permet aussi au simulateur et
au synthétiseur d'aecter le nombre de bits adéquat pour le codage de l'instance du type créé.
Exemple de déclaration :
Dans cet exemple, le type créé s'appelle TYPE_BYTE. Il apparaît comme un sous-type du type INTE-
GER dont l'intervalle de valeurs, xé par la directive RANGE, est 0 à 255.
Note : de fait, ce nouveau type occupera 8 bits lors de la synthèse.
Remarque : en l'absence de directive RANGE, le nombre de bits alloués est xé à 32.
que qui autorisera la manipulation de toutes ces données sous un même identicateur, appelé enregistrement.
Exemple de déclaration :
type TYPE_TABLE_VERITE i s r e c o r d
ENTREE1 : STD_LOGIC_VECTOR( 7 downto 0 ) ;
ENTREE2 : STD_LOGIC_VECTOR( 7 downto 0 ) ;
SORTIE : STD_LOGIC_VECTOR( 7 downto 0 ) ;
CARRY_OUT : STD_LOGIC ;
end r e c o r d ;
Cet exemple crée un enregistrement dont l'instance peut stocker un vecteur de table de vérité.
Exemple d'utilisation :
v a r i a b l e VECTEUR_TABLE : TYPE_TABLE_VERITE ; −− d é c l a r e une i n s t a n c e
s i g n a l CARRY : STD_LOGIC ; −− d é c l a r e un s i g n a l
CARRY <= VECTEUR_TABLE.CARRY_OUT; −− e x t r a i t j u s t e l e champ CARRY_OUT
−− de l ' e n r e g i s t r e m e n t .
Comme le montre cet exemple, chaque champ de l'enregistrement peut être manipulé comme une simple
de vecteurs de test.
dont on xe le nombre d'éléments dans la déclaration du type ou lors de la déclaration de l'instance. Ces
Exemple :
Cet exemple crée un type de vecteur composé d'éléments BOOLEAN dont le nombre d'éléments doit
être xé lors de l'instanciation (instanciation = déclaration d'une variable répondant au type) à l'aide des
Instanciation :
VECTEUR1 est alors un tableau composé de 16 éléments BOOLEAN dont les indices couvrent l'intervalle
[0 ; 15].
Exemple :
type BYTE i s a r r a y ( 7 downto 0 ) o f BIT ; −− C r é e r un type pour s t o c k e r un o c t e t
v a r i a b l e A : BYTE ; −− D é c l a r e A de type BYTE ;
Type matriciel
Pour d'autres besoins (calcul matriciel, stockage d'une table de vérité ...), on peut dénir des tableaux
multi-dimensionnels.
Exemple :
type TYPE_MATRICE i s a r r a y ( 1 t o 2 0 , 1 t o 3 0 ) o f INTEGER ; −− D é c l a r a t i o n du type
v a r i a b l e A : TYPE_MATRICE ; −− I n s t a n c i a t i o n
A( 6 , 1 5 ) <= 12 ; −− A f f e c t a t i o n
Cet exemple crée un type pour manipuler des matrices d'entiers contenant 20 lignes et 30 colonnes ; crée
Remarque : le paragraphe montre comment utiliser un tableau de vecteurs pour réaliser la synthèse d'un
système combinatoire à partie de sa table de vérité.
Dans le paquetage standard, l'addition n'est pas dénie pour le type STD_LOGIC_VECTOR. Il existe alors
deux possibilités pour parvenir malgré tout à ses ns :
surcharger l'opérateur + pour que le compilateur sache comment additionner une variable de type
STD_LOGIC_VECTOR avec une constante de type INTEGER : solution intéressante mais faisant
trouver la bonne bibliothèque proposant l'opération (par une des méthodes suscitée dans les deux
points précédents).
UNSIGNED réalise la conversion de B en UNSIGNED et l'addition avec 3, de type UNSIGNED, est
possible. Le résultat obtenu étant de type UNSIGNED, il faut le convertir en type STD_LOGIC_VECTOR
Plus simplement, on pourra faire appel à une bibliothèque (un paquetage) rendant l'opération possible.
4.5 Attributs
Un attribut est une caractéristique associée à un type ou à un signal. L'ensemble des attributs prédénis
Utilisation : on spécie le nom du type ou du signal suivi d'une apostrophe puis du nom de l'attribut
Remarque : on dénit la position d'une valeur valide pour un type par la valeur 0 pour la grandeur dénie
à gauche. La seconde valeur possède la position 1 . . .
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
la dimension x
droite
petite
Note : ce dernier tableau utilise pour les exemples le tableau TAB_ENTIER de dimension 1 seulement
Dénition : une transaction sur un signal est une opération modiant ou armant la valeur de ce signal
cours
est actif
détecter des fronts montants (fonction rising_edge) et descendants (fonction falling_edge) de signaux (très
utilisés pour la synthèse de systèmes synchrones). Ces deux fonctions doivent leur existences à celle des
Soit CLK un signal de type STD_LOGIC reétant un signal d'entrée appelé "horloge".
Si l'équation booléenne CLK'event and CLK = '1' renvoie la valeur TRUE alors le signal CLK vient
Si CLK'event and CLK = '0' renvoie TRUE alors de signal CLK vient de présenter un front descendant.
5 Opérateurs
5.1 Opérateurs d'aectation
Le VHDL utilise deux opérateurs d'aectations.
Exemples :
s i g n a l A : STD_LOGIC_VECTOR ( 3 downto 0 ) ; −− Déclaration du s i g n a l
s i g n a l B, C : STD_LOGIC_VECTOR ( 3 downto 0 ) ; −− Déclaration m u l t i p l e de s i g n a u x
B <= " 0 1 0 0 " ; −− Affectation d ' une c o n s t a n t e
C <= " 1 0 0 0 " ; −− Idem
A <= B and C; −− Affectation à p a r t i r d ' une e x p r e s s i o n
Exemples :
16 Eléments de base du langage VHDL
v a r i a b l e A : INTEGER; −− Déclaration de v a r i a b l e
v a r i a b l e B, C : INTEGER; −− Déclaration m u l t i p l e de v a r i a b l e s
B := 1 2 ; −− Affectation d ' une c o n s t a n t e
C := 8 ; −− Idem
A := B + C ; −− Affectation à p a r t i r d ' une e x p r e s s i o n
Notes :
Dans le cas d'opérandes de types STD_LOGIC_VECTOR ou BIT_VECTOR, l'opération logique
s'eectue BIT à BIT (cela implique des opérandes de tailles identiques pour les opérateurs binaires).
Exemples d'utilisation :
v a r i a b l e V1 , V2 , V3 : STD_LOGIC; −− D é c l a r a t i o n de 3 v a r i a b l e s
V1 := ' 0 ' ; −− Mise à 0 de V1
V2 := ' 1 ' ; −− Mise à 1 de V2
V3 := (V1 o r not V2) and V2 ; −− A f f e c t a t i o n u t i l i s a n t une e x p r e s s i o n
−− à base d ' opérateurs l o g i q u e s
s i g n a l A, B, C : STD_LOGIC_VECTOR ( 3 downto 0 ) ; −− D é c l a r a t i o n de 3 v e c t e u r s de 4
−− é l é m e n t s STD_LOGIC
B <= " 0 1 0 1 " ; −− A f f e c t a t i o n d ' un mot
C <= " 1 1 0 0 " ; −− A f f e c t a t i o n d ' un mot
A <= B and C; −− Et l o g i q u e BIT à BIT e n t r e B e t C
Voici la liste de ces opérateurs : =, /= (diérent), <, <=, >, <, >=
Généralement ces diérents opérateurs doivent être employés avec des opérandes de mêmes types. Ce-
pendant, il est possible de trouver une dénition permettant de comparer des grandeurs de types diérents
entre elles : cela suppose une surcharge des opérateurs relationnels (i.e. l'écriture d'une fonction qui réalise
Le résultat d'une comparaison a un type : c'est le type BOOLEAN. Ainsi, on parle de comparaison vrai
(TRUE) ou fausse (FALSE).
Note : la diérence entre l'opérateur relationnel <= et l'opérateur d'aectation <= est eectuée par le
compilateur en fonction de son contexte d'utilisation.
Exemples :
v a r i a b l e FIN : BOOLEAN; −− D é c l a r a t i o n d ' une v a r i a b l e b o o l é e n n e
s i g n a l A, B : STD_LOGIC; −− D é c l a r a t i o n de deux s i g n a u x de
−− type b i n a i r e étendu
A <= ' 1 ' ; −− A f f e c t a t i o n d ' une c o n s t a n t e
B <= ' 0 ' ; −− Idem
FIN := ( A /= B ) ; −− Test s i A e s t d i f f é r e n t de B
−− e t a f f e c t e l e r é s u l t a t à FIN
Résultat de l'exemple :
FIN = TRUE c a r A e s t d i f f é r e n t de B
5 Opérateurs 17
Résultat :
VC = 11
C = "11000011" A = "1101"
18 Eléments de base du langage VHDL
Chapitre 2
Structure d'un programme VHDL
Un programme VHDL écrit pour caractériser un bloc hiérarchique par un système combinatoire simple
La page suivante propose un modèle de programme reétant une structure plus détaillée.
Remarques :
Dans la structure qui suit, les identicateurs en majuscules sont choisis par le programmeur.
Lors de l'écriture de code en VHDL, on utilise les mêmes règles d'indentation qu'en C.
Une ligne commençant par deux caractères successifs est une ligne de commentaires.
Une ligne présentant une séquence de points signie que des lignes analogues à la précédentes peuvent
apparaître successivement (cf. déclaration de plusieurs variables . . . ). Les indices ne, ns, v, s sont des
indices.
20 Structure d'un programme VHDL
−− D e s c r i p t i o n i n t e r n e
a r c h i t e c t u r e COMPORTEMENT o f NOM_DE_LA_FONCTION_DECRITE i s
−− D é c l a r a t i o n d e s s i g n a u x i n t e r n e s
s i g n a l SIGNAL_INTERNE_1 : TYPE_SIGNAL_INTERNE_1;
...
s i g n a l SIGNAL_INTERNE_s : TYPE_SIGNAL_INTERNE_s;
−− D é c l a r a t i o n d e s c o n s t a n t e s
c o n s t a n t CONSTANTE_1 : TYPE_CONSTANTE_1 := Valeur ;
...
c o n s t a n t CONSTANTE_c : TYPE_CONSTANTE_c := Valeur ;
...
begin
−− E c r i t u r e d e s é q u a t i o n s du domaine c o n c u r r e n t
...
−− E c r i t u r e d e s p r o c e s s u s
NOM_PROCESS_1 : p r o c e s s ( L i s t e _ d e _ s e n s i b i l i t é _ 1 )
−− D é c l a r a t i o n d e s v a r i a b l e s
v a r i a b l e NOM_VARIABLE_1 : TYPE_VARIABLE_1 := V a l e u r _ I n i t i a l e ;
...
v a r i a b l e NOM_VARIABLE_v : TYPE_VARIABLE_v := V a l e u r _ I n i t i a l e ;
−− D é c l a r a t i o n de c o n s t a n t e s ( idem début s e c t i o n A r c h i t e c t u r e )
...
begin
−− I n s t r u c t i o n s du domaine s é q u e n t i e l l e : o p é r a t i o n s d ' a f f e c t a t i o n ,
−− s t r u c t u r e s c o n d i t i o n n e l l e s , s t r u c t u r e s r é p é t i t i v e s .
end p r o c e s s ;
...
−− Idem pour d ' a u t r e s p r o c e s s u s
end COMPORTEMENT;
Chapitre 3
Interfaçage avec l'extérieur : Entité
créée : c'est la vue fonctionnelle externe et c'est celle qui sera représentée sous la forme d'un symbôle dans
un projet hiérarchique ayant un schéma pour sommet. Pour chaque signal, il est nécessaire de préciser le
type de données qu'il véhicule ainsi que le sens de circulation de ces données.
e n t i t y porte_et2 i s port (
entree_a : i n s t d _ l o g i c ;
entree_b : i n s t d _ l o g i c ;
sortie : out s t d _ l o g i c ) ;
end p o r t e _ e t 2 ;
Remarques :
Quartus impose que le chier VHDL et l'entité aient le même nom. Ici, porte_et2 sera donc stockée
document.
Entrées :
22 Interfaçage avec l'extérieur : Entité
reset : le signal de remise à 0 asynchrone (c'est à dire pris en compte dès son apparition et donc
Sortie :
bcd[3.0] : le vecteur de sortie (valeur codée en binaire comprise entre 0 et 9 dans le cas de ce
Remarque : bcd est déclaré en inout car il sera vu plus tard dans le code VHDL à la fois comme une
entrée et une sortie (en eet, quand on écrit bcd <- bcd + 1, on peut aisément voir que bcd apparaît à la
expliciter le ou les comportements de l'élément réalisé. Pour cela, on dispose de structures de programmation
permettant de traiter des ots de données (DataFlow) par des instructions dites concurrentes ou d'opérer à
une description comportementale d'un phénomène en utilisant plusieurs processus (mot clé process) dans la
section architecture.
combinatoires relatives au traitement du ot de données sont données directement par le programmeur.
Dans le domaine concurrent, toutes les lignes de codes ont une action immédiate et l'ordre d'écriture
des équations n'a pas d'incidence sur les résultats : les équations sont permanentes et appartiennent d'une
certaine façon à des travaux parallèles. Concrêtement, cela signie que ces équations sont calculées dans des
portions distinctes les unes des autres du composant cible. C'est d'ailleurs ce qui fait la puissance des FPGAs
dans le domaines du traitement du signal puisqu'il est en eet possible d'eectuer à chaque instant plusieurs
milliers de calculs en parallèles. L'aectation d'une valeur à un signal utilise l'opérateur <=
Notes :
on parle souvent de domaine concurrent pour désigner la partie d'un programme ne traitant qu'un ot
de données ;
il est possible d'ajouter aux équations des critères temporels utiles dans le cadre d'une simulation
2.1 Constantes
Pour une meilleure lisibilité du code VHDL, le programmeur peut déclarer des constantes basées sur un
type prédéni et précédemment déclaré. La déclaration d'une constante doit être faite avant le mot clé begin
d'une section process (voir suite) ou une section architecture. La déclaration d'un constante utilise le mot clé
constant.
Syntaxe :
c o n s t a n t IDENTIFICATEUR : TYPE_DE_LA_CONSTANTE := Valeur ;
Exemples :
c o n s t a n t MA_CONSTANTE_1 : STD_LOGIC_VECTOR ( 7 downto 0 ) := " 0 0 0 0 1 0 0 1 " ;
c o n s t a n t MA_CONSTANTE_2 : INTEGER := 1 2 ;
24 Section Architecture
2.2 Signaux
2.2.1 Dénition
An de clarier l'écriture de certaines équations, il peut être intéressant d'en eectuer une décomposition
basée sur l'introduction de nouveaux signaux. Ces signaux, qualiés de signaux internes, représentent alors
des équipotentielles réelles que le compilateur pourra faire disparaître ultérieurement si nécessaire.
2.2.2 Déclaration
architecture et de son begin associé (voir structure
La déclaration d'un signal s'eectue entre les mots clés
détaillée d'un programme VHDL au paragraphe 2). Elle utilise le mot clé signal.
Syntaxe :
Exemples :
Note : la valeur d'initialisation n'est utile que lors d'une simulation. La synthèse ne l'exploite pas.
a r c h i t e c t u r e comportement o f p o r t e _ e t 2 i s
begin
s o r t i e <= entree_a and entree_b ;
end comportement ;
On retrouve dans cette description les opérateurs <= et and vus dans le chapitre des éléments de base
du langage VHDL.
A noter qu'une ligne de code, ou qu'une section de code, se cloture par un point virgule avec pour corrolaire
qu'une longue équation peut donc s'écrire sur plusieurs lignes de texte ; seul le point virgule cloturant la ligne
s o r t i e <= entree_a
and entree_b ;
2.3.2 Description en langage VHDL d'un multiplexer 4 vers 1 avec 2 entrées de sélection
Le multiplexeur dont la description concurrente est donnée ici possède le fonctionnement suivant :
l i b r a r y i e e e ; u s e i e e e . s t d_ lo g ic _1 1 64 . a l l ;
u s e i e e e . numeric_std . a l l ;
e n t i t y mul_4vers1 i s p o r t (
entree_1 : i n s t d _ l o g i c ;
entree_2 : i n s t d _ l o g i c ;
entree_3 : i n s t d _ l o g i c ;
entree_4 : i n s t d _ l o g i c ;
sel_0 : in std_logic ;
sel_1 : in std_logic ;
sortie : out s t d _ l o g i c ) ;
end e n t i t y ;
a r c h i t e c t u r e comportement_mul_4vers1 o f mul_4vers1 i s
begin
s o r t i e <= ( entree_1 and not ( s e l _ 0 ) and not ( s e l _ 1 ) )
o r ( entree_2 and s e l _ 0 and not ( s e l _ 1 ) )
o r ( entree_3 and not ( s e l _ 0 ) and s e l _ 1 )
o r ( entree_4 and s e l _ 0 and s e l _ 1 ) ;
end comportement_mul_4vers1 ;
d'un bus de 8 bits. Sa table de vérité, exprimée avec des données binaires, est rappelée dans le tableau
ci-dessous :
entree sortie
000 00000001
001 00000010
010 00000100
011 00001000
100 00010000
101 00100000
110 01000000
111 10000000
La programmation de cette table de vérité assez particulière n'a pas de solution unique. Dans cette partie,
La première version, simple mais lourde consiste à élaborer l'équation des diérentes sorties
et à procéder à une programmation dans le domaine concurrent :
26 Section Architecture
library ieee ;
u s e i e e e . s t d_ lo g ic _ 11 64 . a l l ;
u s e i e e e . numeric_std . a l l ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− D e s c r i p t i o n e x t e r n e du d é m u l t i p l e x e u r demul_3vers8
−− Objet : D é m u l t i p l e x e u r 3 v e r s 8
−− Signaux d ' e n t r é e s :
−− e n t r e e ( 2 . . 0 ) : Bus de 3 STD_LOGIC
−− Signaux de s o r t i e s :
−− s o r t i e ( 7 . . 0 ) : Vecteur de 7 STD_LOGIC
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
e n t i t y demul_3vers8 i s p o r t (
e n t r e e : i n s t d _ l o g i c _ v e c t o r ( 2 downto 0 ) ;
s o r t i e : out s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) ) ;
end demul_3vers8 ;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− D e s c r i p t i o n dans l e domaine c o n c u r r e n t par d é d u c t i o n d e s
−− é q u a t i o n s d e s s o r t i e s d ' a p r è s l a t a b l e de v é r i t é ( s a n s commentaire )
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
a r c h i t e c t u r e comportement_demul_3vers8 o f demul_3vers8 i s
begin
s o r t i e ( 0 ) <= not ( e n t r e e ( 2 ) ) and not ( e n t r e e ( 1 ) ) and not ( e n t r e e ( 0 ) ) ;
s o r t i e ( 1 ) <= not ( e n t r e e ( 2 ) ) and not ( e n t r e e ( 1 ) ) and e n t r e e ( 0 ) ;
s o r t i e ( 2 ) <= not ( e n t r e e ( 2 ) ) and e n t r e e ( 1 ) and not ( e n t r e e ( 0 ) ) ;
s o r t i e ( 3 ) <= not ( e n t r e e ( 2 ) ) and e n t r e e ( 1 ) and e n t r e e ( 0 ) ;
s o r t i e ( 4 ) <= e n t r e e ( 2 ) and not ( e n t r e e ( 1 ) ) and not ( e n t r e e ( 0 ) ) ;
s o r t i e ( 5 ) <= e n t r e e ( 2 ) and not ( e n t r e e ( 1 ) ) and e n t r e e ( 0 ) ;
s o r t i e ( 6 ) <= e n t r e e ( 2 ) and e n t r e e ( 1 ) and not ( e n t r e e ( 0 ) ) ;
s o r t i e ( 7 ) <= e n t r e e ( 2 ) and e n t r e e ( 1 ) and e n t r e e ( 0 ) ;
end comportement_demul_3vers8 ;
Remarques :
L'analyse de ce programme montre que la représentation vectorielle des entrées et des sorties n'apporte
La section architecture étant la seule à changer, tout ce qui la précède ne sera plus rappelé dans les
prochaines solutions.
Note : on retrouve ce que la simulation de la porte ET à 2 entrées avait fait apparaître, à savoir que la
réponse dans un composant quelqu'il soit n'est pas instantannée. Ici, le temps de retard varie en fonction de
la sortie et peut atteindre pratiquement 10 ns dans certains cas (la sortie 4).
Seconde version.
Elle propose un codage reposant directement sur la table de vérité pour une meilleure lisibilité d'une part
et plus de facilité dans l'écriture (on saute l'étape consistant à déduire les équations de la table de vérité
−− v o i r v e r s i o n 1 du programme de d é c o d e u r pour l e s
−− d é c l a r a t i o n s de b i b l i o t h è q u e s e t d ' e n t i t é . . .
−− D e s c r i p t i o n dans l e domaine c o n c u r r e n t en u t i l i s a n t l e mode
−− d ' a f f e c t a t i o n c o n d i t i o n n e l l e : s t r u c t u r e . . . when . . . e l s e . . .
−− La t a b l e de v é r i t é e s t c l a i r e m e n t r e t r a n s c r i t e ( s a n s commentaire )
a r c h i t e c t u r e comportement_demul_3vers8 o f demul_3vers8 i s
begin
s o r t i e <= "00000001" when e n t r e e = "000" e l s e
"00000010" when e n t r e e = "001" e l s e
"00000100" when e n t r e e = "010" e l s e
"00001000" when e n t r e e = "011" e l s e
"00010000" when e n t r e e = "100" e l s e
"00100000" when e n t r e e = "101" e l s e
"01000000" when e n t r e e = "110" e l s e
"10000000" when e n t r e e = "111" e l s e
"00000000";
end comportement_demul_3vers8 ;
La troisième version propose une structure du domaine concurrent encore mieux adaptée à la
description de tables de vérité. Il s'agit de la structure with ... select ...
Le programme suivant en montre un exemple d'utilisation :
−− v o i r v e r s i o n 1 du programme de d é c o d e u r pour l e s d é c l a r a t i o n s
−− de b i b l i o t h è q u e s e t d ' e n t i t é . . .
−− D e s c r i p t i o n dans l e domaine c o n c u r r e n t en u t i l i s a n t l e mode
−− d ' a f f e c t a t i o n c o n d i t i o n n e l l e : s t r u c t u r e . . . when . . . e l s e . . .
−− La t a b l e de v é r i t é e s t c l a i r e m e n t r e t r a n s c r i t e ( s a n s commentaire )
a r c h i t e c t u r e comportement_demul_3vers8 o f demul_3vers8 i s
begin
with e n t r e e s e l e c t
s o r t i e <= "00000001" when " 0 0 0 " ,
"00000010" when " 0 0 1 " ,
"00000100" when " 0 1 0 " ,
"00001000" when " 0 1 1 " ,
"00010000" when " 1 0 0 " ,
"00100000" when " 1 0 1 " ,
"01000000" when " 1 1 0 " ,
"10000000" when " 1 1 1 " ;
end comportement_demul_3vers8 ;
Note 1 : cette forme impose de prévoir toutes les possibilités de la table (le cas échéant, le mot clé when
others permet de prévoir une solution aux cas non envisagés de façon explicite).
Note 2 : lorsque le vecteur de sortie est le même pour une succession de valeur du vecteur d'entrée exprimé
sous la forme d'une variable entière, il est possible de simplier l'opération :
Soient X la variable d'entrée de type entier d'un système et S son vecteur de sortie.
De la même façon, si S = a pour X = 10 et X=12, puis S = 0 dans les autres cas, on écrira :
3 Description comportementale
28 Section Architecture
on utilise des structures répétitives, conditionnelles ou séquentielles. La prise en compte des lignes de code
du changement d'état d'une certaine classe de signaux du modèle créé. Ces signaux susceptibles d'activer le
processus doivent être répertoriés dans une liste dite liste de sensibilité du processus.
le domaine séquentiel (à l'intérieur d'un processus) que dans le domaine concurrent. Au début de l'exécu-
tion d'un processus, les états des signaux sont mémorisés dans des variables tampons. Lors de l'exécution
séquentielle du code du processus, l'aectation d'un signal ne modie que la variable tampon qui lui est
associée. A la n du processus, le signal reçoit le contenu de la variable tampon. Les anglo-saxons appellent
ça le Scheduling.
Explications :
Dans cette exemple, trois signaux A, B, C de type STD_LOGIC sont traités par un processus. Ce
processus possède une liste de sensibilité se limitant au signal A, c'est à dire qu'un changement d'état de A
A t = 0-, on suppose que A = '1', B = '1', C = '0'. A t = 0, A change de valeur de sorte qu'il vaut '0'
les signaux A, B et C sont mémorisés dans des variables tampons notées ici : a, b et c.
Finalement les tampons a, b, c, sont transférés dans les signaux A, B, C. A t = 0+, les signaux ont les
Remarque : oublier le mécanisme des mémoires tampons conduit à trouver C = '0' à la n du processus au
lieu de C = '1'.
a r c h i t e c t u r e comportement_exemple o f exemple i s
s i g n a l A, B, C : s t d _ l o g i c ;
begin
p r o c e s s (A, B)
begin
B <= A;
C <= B ;
end p r o c e s s ;
end comportement_exemple ;
Explications :
A t = 0-, on suppose que A = '1', B = '1', C = '0'.
A t = 0, A change de valeur de sorte qu'il vaut '0' ce qui active le process dont le traitement s'opère
comme suit :
les signaux A, B et C sont mémorisés dans des variables tampons notées ici : a, b et c.
Finalement les tampons a, b, c, sont transférés dans les signaux A, B, C. A t = 0+, les signaux ont les
valeurs suivantes : A = '0', B = '0', C = '1'. Note : le cycle d'exécution du processus qui vient d'être
décrit s'appelle un cycle delta. B a donc changé d'état par rapport à ce qu'il valait en t = 0-. Comme il
appartient à la liste de sensibilité du processus celui-ci est relancé : on assiste à un second cycle delta.
les signaux A, B et C sont mémorisés dans des variables tampons notées ici : a, b et c.
Finalement les tampons a, b, c, sont transférés dans les signaux A, B, C. A t = 0++, les signaux ont
les valeurs suivantes : A = '0', B = '0', C = '0'. L'état des diérentes variables de la liste de sensibilité
Note : on découvre intuitivement qu'il faut être très vigilant dans l'écriture des processus et le choix des
éléments de la liste de sensibilité sous peine d'aboutir à quelque chose de non synthétisable car conduisant à
l'exécution d'une innité de cycle delta. On utilisera par contre cette propriété pour la création de signaux
Remarque importante : le premier exemple de processus montrait un processus utilisant le signal B comme
une entrée sans pour autant l'avoir spécié dans la liste de sensibilité.
3.3 Variables
3.3.1 Dualité signal - variable
De même qu'il était possible de dénir des signaux dans le domaine concurrent, le programmeur peut
le mot clé begin (voir structure détaillée d'un programme VHDL au paragraphe 4). Elle utilise le mot clé
variable.
Syntaxe :
Exemple :
qui utilise une variable temporaire au sein d'un processus, l'aectation à une variable revêt un caractère
...
s i g n a l COMPTEUR : u n s i g n e d ( 3 downto 0 ) := " 1 0 0 1 " ;
p r o c e s s (COMPTEUR)
v a r i a b l e ENTIER : i n t e g e r ;
begin
ENTIER := t o _ i n t e g e r (COMPTEUR) ;
ENTIER := ENTIER + 3 ;
COMPTEUR <= to_unsigned (ENTIER, 4 ) ;
end p r o c e s s ;
...
i f c o n d i t i o n then i n s t r u c t i o n _ 1 ; e l s e i n s t r u c t i o n 2 ; end i f ;
i f c o n d i t i o n then i n s t r u c t i o n _ 1 ; end i f ;
Syntaxes étendues :
i f c o n d i t i o n then
instruction ;
...
...
[
else
instruction ;
...
...
]
end i f ;
i f c o n d i t i o n _ 1 then i n s t r u c t i o n _ 1 ;
e l s i f c o n d i t i o n _ 2 then i n s t r u c t i o n _ 2 ; end i f ;
end i f ;
Pour plus de précisions, le guide de référence complétera l'étendue de la syntaxe de cette structure.
programmes ont déjà été proposés dans le domaine concurrent pour sa réalisation. Dans le domaine séquen-
Note : De même que pour la version 3, seul le code relatif à la section architecture est présenté ici. On
pourra se reporter au paragraphe 2.3.3 pour se remémorer ce qui précède cette partie.
paramètre. Elle est particulièrement intéressante pour la description de systèmes combinatoires dont les
tables de vérité sont explicitement dénies (elle est l'équivalent de la structure with ... select ... du domaine
Remarque : lorsque plusieurs cas nécessitent le même traitement, il est possible d'utiliser le mot clé when
suivi de l'ensemble des valeurs de même comportement séparées par des symbôles |.
Exemple :
Syntaxe :
Note : lorsque Valeur1 > Valeur2, le mot clé to doit être remplacé par downto.
Exemple : utilisation de la structure for ... loop pour l'implémentation du démultiplexeur 3 vers 8
...
a r c h i t e c t u r e comportement_demul_3vers8 o f demul_3vers8 i s
begin
process ( entree )
v a r i a b l e N : u n s i g n e d ( 2 downto 0 ) ;
begin
N := u n s i g n e d ( e n t r e e ) ;
s o r t i e <= " 0 0 0 0 0 0 0 0 " ;
f o r I in 0 to 7 loop
i f (N=I ) then s o r t i e ( I ) <= ' 1 ' ; end i f ;
end l o o p ;
end p r o c e s s ;
end comportement_demul_3vers8 ;
Remarques :
on introduit une variable intermédiaire de type unsigned dans cet exemple pour pouvoir eectuer la
...
a r c h i t e c t u r e comportement_demul_3vers8 o f demul_3vers8 i s
begin
process ( entree )
v a r i a b l e N : i n t e g e r range 0 to 8 ;
begin
N := t o _ i n t e g e r ( u n s i g n e d ( e n t r e e ) ) ;
s o r t i e <= " 0 0 0 0 0 0 0 0 " ;
while I < 8 loop
i f (N=I ) then s o r t i e ( I ) <= ' 1 ' ; end i f ;
end l o o p ;
end p r o c e s s ;
end comportement_demul_3vers8 ;
L'indice I utilisé dans la structure while ... loop est initialisé automatiquement à 0 au début de la structure.
Son incrémentation est elle aussi automatique et se produit en arrivant au mot clé end loop.
Remarque : l'utilisation de cette structure est déconseillée. On lui préfère la structure for ... loop dont
3.6 Cas d'un système rythmé par un signal d'horloge : compteur BCD
Un des grands champs d'application des processus concerne les systèmes rythmés par un signal d'horloge.
La suite de cette sous-section propose l'étude détaillée d'un compteur BCD (comptant de 0 à 9).
3.6.1 Objectif
Il est de décrire en VHDL le fonctionnement d'un compteur binaire 4 bits synchrone avec remise à 0
asynchrone. Vu de l'extérieur, ce compteur se présente sous la forme d'un bloc comportant deux entrées, une
entrée d' horloge de comptage et une entrée de reset, et une sortie vectorielle sur 4 bits.
Remarques :
Le comptage s'eectue sur front montant d'horloge, ici clk.
L'entrée de remise à 0, ici reset, est active à l'état haut.
De ce cahier des charges succinct, on peut trouver les bases du programme permettant de décrire le
compteur. La fonction à décrire étant séquentielle, l'emploi de un ou plusieurs processus est indispensable
compteur.
Le signal du compteur étant pris comme entrée dans le processus, il faut l'ajouter à la liste de sensibilité
du processus. De plus, il doit être déclaré sous la forme buer au niveau de l'entité plutôt que out.
3.6.3 Codage
library ieee ;
u s e i e e e . s t d_ lo g ic _1 1 64 . a l l ;
u s e i e e e . numeric_std . a l l ;
e n t i t y compteur_bcd i s p o r t (
reset : in std_logic ;
clk : in std_logic ;
bcd : i n o u t s t d _ l o g i c _ v e c t o r ( 3 downto 0 )
);
end compteur_bcd ;
a r c h i t e c t u r e comportement_compteur_bcd o f compteur_bcd i s
begin
p r o c e s s ( c l k , r e s e t , bcd )
begin
−− l e r e s e t e s t p r i o r i t a i r e ( i l e s t a s y n c h r o n e )
i f r e s e t = ' 1 ' then bcd <= " 0 0 0 0 " ;
e l s i f c l k ' e v e n t and c l k = ' 1 '
then
−− l ' a d d i t i o n n ' e s t pas s u p p o r t é e pour l e s s t d _ l o g i c _ v e c t o r , i l f a u t
−− p a s s e r par d i f f é r e n t e s é t a p e s de c o n v e r s i o n s pour i n c r é m e n t e r
− l e compteur
bcd <= bcd +1;
−− s i bcd v a l a i t 9 en e n t r a n t dans l e p r o c e s s u s , i l f a u t l e r e m e t t r e
−− à 0 ( remarque : l ' i n c r é m e n t a t i o n p r é c é d e n t e n ' a pas d ' e f f e t s u r l a
−− v a l e u r l u e de bcd . C' e s t l a v a l e u r f u t u r e de bcd q u i a é t é a f f e c t é e
−− par c e t t e i n c r é m e n t a t i o n )
i f bcd = 9 then bcd <= " 0 0 0 0 " ; end i f ;
end i f ;
end p r o c e s s ;
end comportement_compteur_bcd ;
synchrone d'horloge, c'est à dire eective seulement au prochain front montant de l'horloge (les deux modes
...
...
a r c h i t e c t u r e comportement_compteur_bcd o f compteur_bcd i s
begin
p r o c e s s ( c l k , r e s e t , bcd )
begin
i f c l k ' e v e n t and c l k = ' 1 '
then
bcd <= bcd + 1 ;
i f bcd = 9 then bcd <= " 0 0 0 0 " ; end i f ;
−− l e r e s e t e s t t r a i t é en d e r n i e r
i f r e s e t = ' 1 ' then bcd <= " 0 0 0 0 " ; end i f ;
end i f ;
end p r o c e s s ;
end comportement_compteur_bcd ;
4 Architecture de test
4.1 Objectif de l'architecture de test
Lors des étapes de test et de mise au point, Quartus permet de créer des stimuli sur la base d'une
interface interactive (Vector Weveform Editor). Ce mode de description trouve rapidement ses limites lorsque
la complexité des projets augmente et justie l'utilisation d'un langage de description pour les stimuli plus
4 Architecture de test 35
importants. Lorsque le simulateur utilisé est un simulateur VHDL (i.e. qu'il est capable d'exploiter un code
source VHDL pour la simulation), il est alors possible de créer une architecture spécique pour appliquer les
stimuli sur l'ensemble du projet ou seulement une partie du projet. On parle alors logiquement d'architecture
Note : le simulateur intégré à Quartus II n'étant pas capable de simulation au niveau source VHDL
(il se limite à une simulation RTL), il est donc impossible d'exploiter des bancs de test écrit en VHDL à
l'intérieur de Quartus. Pour réaliser de tels tests, on utilise un simulateur externe (EDA Simulator Extern
Tool) : Modelsim-Altera.
Le test bench est un programme VHDL qui vient se placer à un niveau hiérarchique supérieur au projet
ou module à tester. Il contient une instance du module à tester (mot clé component ) auquel le reste des
signaux du programme de test sont reliés (mot clé port ). La connaissance détaillée de la syntaxe des mots
clés component et port n'est pas forcément utile. En eet, un chier de test vectoriel créé avec l'éditeur de
Quartus pouvant être exporté en chier de test VHDL, il sura de se contenter de créer un chier de test
restreint avec l'éditeur de Quartus et de l'exporter pour le modier et l'agrémenter en fonction de besoins
Le code ci-dessous propose un exemple de test bench écrit en VHDL et dont le squelette de base est
fourni par la fonction d'exportation d'un chier Waveform de Quartus en chier VHDL à l'extension .vht :
36 Section Architecture
LIBRARY i e e e ;
USE i e e e . s td _ lo gi c _1 16 4 . a l l ;
u s e i e e e . numeric_std . a l l ;
−− E n t i t é du module de t e s t
ENTITY demul_3vers8_vhd_vec_tst IS
END demul_3vers8_vhd_vec_tst ;
−− A r c h i t e c t u r e de t e s t
ARCHITECTURE demul_3vers8_arch OF demul_3vers8_vhd_vec_tst IS
SIGNAL e n t r e e : STD_LOGIC_VECTOR( 2 DOWNTO 0 ) ;
SIGNAL s o r t i e : STD_LOGIC_VECTOR( 7 DOWNTO 0 ) ;
c o n s t a n t d u r e e _ e n t r e e : time := 2000 ns ;
BEGIN
i 1 : demul_3vers8
PORT MAP ( −− l i s t c o n n e c t i o n s between master p o r t s and s i g n a l s
e n t r e e => e n t r e e ,
s o r t i e => s o r t i e
);
process
begin
e n t r e e ( 1 ) <= ' 0 ' ;
w a i t f o r 200 ns ;
e n t r e e ( 1 ) <= ' 1 ' ;
w a i t f o r 200 ns ;
end p r o c e s s ;
process
begin
e n t r e e ( 2 ) <= ' 0 ' ;
w a i t f o r 400 ns ;
e n t r e e ( 2 ) <= ' 1 ' ;
i f now >= d u r e e _ e n t r e e then w a i t ; e l s e w a i t f o r 400 ns ; end i f ;
end p r o c e s s ;
END demul_3vers8_arch ;
2. Ajouter un nouveau chier de type Vector Waveform File (File -> New ...).
3. N'y ajouter aucun signal et l'exporter immédiatement avec File -> Export ... et taper le nom du chier
4. Fermer le chier Vector Waveform sans le sauver et ouvrir le chier de test bench (extension .vht).
4 Architecture de test 37
5. Ajouter vos lignes de code à partir de l'avant dernière ligne du chier fourni par Quartus pour réaliser
votre test.
An d'assurer le démarrage de la simulation, le programme doit posséder au moins un process sans
liste de sensibilité.
Ces process sont généralement spéciés sans liste de sensibilité (cela signie qu'ils seront immédiatement
Pour gérer le temps dans un process, on utilise le mot clé wait dans diverses formes :
sensibilité.
process.
* Syntaxe : wait until CONDITION ; ou wait until CONDITION for DUREE ; reprise si la condi-
Note : on peut bloquer dénitivement un processus en insérant une instruction wait ; utilisée sans
argument.
On peut aussi écrire des processus un peu plus sophistiqués en exploitant davantage les possibilités du
process
v a r i a b l e i : i n t e g e r range 0 to 9 ;
v a r i a b l e j : i n t e g e r range 0 to 4 ;
v a r i a b l e u e n t r e e : u n s i g n e d ( 2 downto 0 ) ;
begin
f o r i in 0 to 9 loop
u e n t r e e <= to_unsigned ( i , 3 ) ; −− C o n v e r s i o n d ' un e n t i e r en u n s i g n e d
−− La b o u c l e s u r j permet de r é a l i s e r l a c o n v e r s i o n d ' un
−− u n s i g n e d v e r s un s t d _ l o g i c _ v e c t o r , t o u s deux b a s é s s u r d e s
−− é l é m e n t s de type s t d _ l o g i c .
f o r j in 0 to 2 loop
e n t r e e ( j ) <= u e n t r e e ( j ) ;
end l o o p ;
D'une façon générale, dès que le projet devient un peu complexe, le test bench doit reposer sur l'utilisation
de séquences de test dont les résultats sont connus et peuvent être contrôlés au moment de la simulation
(table de vecteurs de test par exemple). Les résultats attendus étant accessibles dans le programme de test,
le concepteur du test peut inclure des lignes de code assurant que la simulation suit son cours sans erreur
de façon à bloquer l'exécution dans le cas contraire. A cet eet, le VHDL possède une structure (assert . . .
report . . . severity . . . ) dont la syntaxe est : assert CONDITION report MESSAGE severity NIVEAU ; Si la
CONDITION est vraie, le process se poursuit sans problème. Si elle ne l'est pas, le process est interrompu
et le MESSAGE est aché dans une boite de dialogue. Une information complémentaire dans cette boite
de dialogue renseigne sur le NIVEAU de gravité de l'assertion et l'exécution reprend ensuite son cours si le
Bibliothèque numeric_std.vhd
SIGNED et UNSIGNED qui sont des vecteurs de STD_LOGIC. Les
Elle dénit les types numériques
opérateurs courants sont dénis entre SIGNED et UNSIGNED ainsi qu'entre SIGNED et INTEGER puis
UNSIGNED et INTEGER.
Quatre fonctions de conversions intéressantes sont dénies pour assurer le passage vers des entiers (na-
Bibliothèque std_logic_1164.vhd
C'est la bibliothèque IEEE indispensable pour caractériser correctement les signaux réels. Elle dénit les
et STD_LOGIC_VECTOR.
42 Section Architecture
Quelques informations complémentaires sur les signaux
Stub Series Terminated Logic (SSTL) devices are a family of electronic devices for driving transmission
lines. They are specically designed for driving the DDR (double-data-rate) SDRAM modules used in com-
puter memory. However, they are also used in other applications, notably, some PCI Express PHYs and
* SSTL_3, 3.3 V, dened in EIA/JESD8-8 1996 * SSTL_2, 2.5 V, dened in EIA/JESD8-9B 2002 *
All SSTL voltage specs reference a voltage that is exactly VDDQ/2. For example, the VREF for an
Terminations can be :
* Class I (one series resistor at the source and one parallel resistor at the load) * Class II (one series resistor
at the source and two parallel resistors, one at each end). * Class III (asymmetrically parallel terminated) *
HSTL
High-speed transceiver logic or HSTL is a technology-independent standard for signalling between inte-
grated circuits. The nominal signalling range is 0 V to 1.5 V, though variations are allowed, and signals may
* Class I (unterminated, or symmetrically parallel terminated) * Class II (series terminated) * Class III
Note : Symmetric parallel termination means that the termination resistor at the load is connected to
half the output buer's supply voltage. Double parallel termination means that parallel termination resistors