Structure VHDL
Structure VHDL
Exemple
constant Pi : real := 3.14159;
signal a : bit := '0';
Variable count : integer;
Il y a trois sortes de types
Les types
1. Scalaires
Données numériques, énumérée ou physiques
Integer (entier de -2147483648 à 2147483647)
Real (réel -1.0E38 à 1.0E38)
Time (temps -2147483647 à 2147483647))
Character (caractère)
String (chaine de caractères)
Bit (0 ou 1)
Boolean (true, false)
Std_logic (Bit à 9 états adapté à la synthèse)
…etc
2. structurés
Données groupées
Bit_vector (tableau de bits)
Std_logic_vector
Array (tableau d’objets quelconques)
Record (enregistrement)
…etc.
Les types
Définir ses propres types
Exemples
Définir un type pour manipuler les jours de semaine
TYPE jour IS integer range 1 TO 7
Constant week_end : jour := 7;
Variable jourOuvrable : jour;
Signal fete : jour;
Définir un type pour manipuler les entiers positifs
TYPE positif is integer range 1 to integer’high
Définir un type pour manipuler les couleurs
TYPE couleur IS (vert, bleu, rouge); -- type énuméré
Définir une structure de données pour manipuler les couleurs RVB sur 8 bits
TYPE couleur8bits IS integer range 0 to 255; -- type entier
TYPE pointRVB IS record
rouge : couleur8bits;
vert : couleur8bits;
bleu: : couleur8bits;
End record;
Le type tableau
Déclaration d’un tableau
On déclare un tableau de la manière suivante :
TYPE NomDuTableau IS ARRAY (etendue) of AutreType;
Exemples
Définir un type pour un bus de données à 8 bits
TYPE Bus is array(0 to 7) of bit;
Ou bien TYPE Bus is array(7 downto 0) of bit;
Ou bien TYPE Bus is array(7 downto 0) of std_logic;
Signal BusDeDonnees : bus;
Remarque
Pour ce qui est des bits, on utilise souvent les prédéfinis std_logic_vector au lieu
de créer de nouveaux types comme suit:
v <= "1010110"; -- ou bien x <=(‘1’, ‘0’, ‘1’, ‘0’, ‘1’, ‘1’, ‘0’)
x <= v(0);
x <= m1(0)(1);
x <= m2(0,1);
Le type tableau
Attributs d’un tableau
LOW: retourne l’index minimal
HIGH: retourne l’index maximal
LEFT: retourne l’index de gauche
RIGHT: retourne l’index de droite
LENGTH : retourne la taille du tableau
RANGE : retourne l’étendue du tableau
REVERSE_RANGE: retourne l’étendus du tableau dans le sens inverse
Exemple
signal d : std_logic_vector(7 downto 0)
d’LOW = ?0
d'HIGH = ?7
d'LEFT = ?7
d'RIGHT= ?0
d'LENGTH = 8?
d'RANGE = (7
? downto 0)
? to 7)
d'REVERSE_RANGE = (0
Les operateurs
** exponentiation, numeric ** numeric, result numeric
abs absolute value, abs numeric, result numeric
not complement, not logic or boolean, result same
b
a <= b after 10ns;
a
0 ns
Exercices
Exercice 1
Un dispositif est commandable par 4 signaux (q1, q2, q3, q4) définissant une
séquence comme indiqué dans le chronogramme suivant
q1
q2
q3
q4
10 ns
Le déclencheur d’un processus peut être le changement de valeurs d’un ensemble de
signaux, la vérification d’une condition ou l’épuisement d’un délais
Les processus
Anatomie d’un processus
Liste de sensibilité optionnelle, le processus
est activé dés qu’un événement arrive sur
l’un des signaux de la liste
[Nom :] process (A, B, …)
On peut déclarer des constantes et des
Déclarations variables . Elles ne sont valables qu’à
l’intérieur du processus
begin
--- Exécution en boucle
Instructions
séquentielles
-----
Wait on c, d Mise en attente du processus jusqu’au
changement de valeur de c ou d
end
Les processus
Mise en attente d’un processus
if condition then
case identificateur is
instructions1
when valeur1 => Instruction 1;
{ elsif condition then
when valeur2 => Instruction 2;
instruction2}
when others => Instruction 3;
[ else
end case;
Instructions 3]
end if;
Instructions séquentielles
Instruction For loop Instruction While loop
On peut utiliser les instructions suivantes pour mieux manipuler les boucles
Exit [Etiquette] when condition : sortir de la boucle si une condition est vérifiée
Next[Etiquette] when condition : sortir de l’iteration si une condition est vérifiée
Exercices
Exercice 3
Ecrire un programme VHDL modélisant une bascule D active sur front montant avec
un reset Asynchrone
Exercice 4
Exercice 5
Ecrire un programme VHDL modélisant une horloge avec une fréquence de 10MHZ
Les variables
Une variable représente une information locale manipulable dans un traitement
séquentiel
Elle est définie uniquement à l’intérieur d’un processus, une procédure ou une
fonction
Une variable ne peut être partagée par plusieurs processus. Sa visibilité est limitée au
processus dans lequel elle est déclarée
Une variable peut être de n’importe quel type et peut être initialisée à sa déclaration
Exemple de déclaration
Variable control : bit := ‘0’;
Variable compteur : integer;
Variable buffer: std_logic_vector(7downto 0);
Exercice
Exercice 6
Le contrôle de parité est un mécanisme simple permettant de détecter
d’éventuelles erreurs de transmission d’une information. Ce mécanisme se base sur un
accord entre l’émetteur et le récepteur sur le mode de parité à adopter (pair ou
impair).
Pour la parité pair par exemple, l’émetteur génère un bit, dit de parité, et
l’ajoute à l’information. Ce bit est généré de façon à ce que le nombre total de bits
(information + bit de parité) soit pair. Le récepteur compte le nombre de bits à 1. s’il
est impair, il conclue que l’information est erronée.
Ecrire un programme VHDL permettant la génération d’un bit de parité pair
pour une information à 8 bits.
i0
i1
i2
i3
i4 P
i5
i
i7
Portée
Différence variables-signaux
Une variable a une portée locale, elle sert de moyen de retenir des informations à
l’intérieur d’un processus
Un signal a une portée globale, il sert de moyen de communication (interconnexion)
entre les éléments internes et externes d’une description
Mise à jour
Une variable est mise à jour immédiatement après son affectation
Un signal n’est mis à jour qu’après l’arrêt du processus le manipulant
Sens de l’affectation
Affecter une variable à une autre revient à remplacer le contenu de la variable par le
contenu de l’autre
Affecter un signal à un autre (par des process différents) revient à les interconnecter
Synthèse
Une variable est synthétisée (le plus souvent) en un élément mémoire (bascule,
registre, …etc)
Un signal est synthétisé (le plus souvent) en une interconnexion (un fil conducteur)
Symbole d’affectation
Variable « := »
Signal « <= »
Différence variables-signaux
architecture var of test is architecture sig of test is
signal trigger, sum : integer := 0; signal trigger, sum : integer := 0;
begin signal sig1 : integer := 1;
process signal sig2 : integer := 2;
variable var1 : integer := 1; signal sig3 : integer := 3;
variable var2 : integer := 2; begin
variable var3 : integer := 3; process
begin begin
wait on trigger; wait on trigger;
var1 := var2 + var3; sig1 <= sig2 + sig3;
var2 := var1; sig2 <= sig1;
var3 := var2; sig3 <= sig2;
Sum <= var1 + var2 + var3; sum <= sig1 + sig2 + sig3;
end process; end process;
end var; end sig;
Var1 = ?5 sig1 = ?5
Var2 = ?5 Sig2 = ?1
Var3 = ?5 sig3 = ?2
Sum = ?15 Sum = ?6
Différence variables-signaux
Si un signal et une variable sont de même type, il est possible d’affecter l’un à l’autre
4 8
ADR DATA
RAM
RD
WR
Exercice 9
Ecrire un programme VHDL modélisant le détecteur de séquence vu dans le chapitre
1. (Section I-3-1 )