Post on 25-Jan-2021
Eduardo SanchezLaboratoire de Systèmes Logiques
Ecole Polytechnique Fédérale de Lausanne
Le langage VHDL
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 2
u Langage formel pour la spécification des systèmes digitaux, aussi bien au niveau comportemental que structural
u Utilisation:X description des systèmesX simulationX aide à la conceptionX documentation
u Caractéristiques principales:X description à plusieurs niveauxX simulation activée par événements (event-driven)X modularitéX extensibilitéX langage général, fortement typé, similaire à Ada
VHDLVHSIC
Very High-Speed Integrated Circuits Hardware Description Language
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 3
Histoireu 1980:
Début du projet, financé par le DoD (400M $US)u 1982:
Contrat pour Intermetrics, IBM et Texasu 1985:
Version 7.2 dans le domaine publicu 1987:
Standard IEEE 1076 (VHDL 87)u 1993:
Nouvelle version du standard (VHDL 93)u Etude d’une version analogique: VHDL-A
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 4
Objets traités par VHDL
u Constantes:constant pi : real := 3.1416;constant index_max : integer is 10*N;
u Variables:valeur modifiable immédiatement par une affectation (:=)
variable stop : boolean;variable etat : CodeDEtat := ST0;
u Signaux:modélisation de l’entrée/sortie d’un dispositif. C’est une formed’onde qui change avec le temps: la modification a lieu à la prochaine itération de la simulation (retard delta)
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 5
Types de données
u VHDL est un langage fortement typé: tout objet doit être déclaréavant utilisation
u Les types predéfinis sont:X scalaire: integer
realenumeratedphysical
X composé: arrayrecord
X pointeur: accesX I/O: file
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 6
u Exemples:type HuitBits is range 0 to 255;
type CodeDEtat is (init, ST1, ST2, exit);
type word is array (0 to 31) of bit;
type EtatsLogiques is recordvaleur : integer range -127 to 128;force : integer;end record;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 7
Opérateursu Opérations logiques:
X and or nand nor xor xnoru Opérations de comparaison:
X = /= < >=u Opérations de décalage
X sll srl sla sra rol roru Opérations d’addition:
X + - &u Opérations de signe:
X + -u Opérations de multiplication:
X * / mod remu Opérations diverses:
X not abs **
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 8
Signaux
u Modélisation d’une interconnexion (ou d’un groupe d’interconnexions)u Moyen d’interconnexion entre les ports des composantsu Chaque signal possède une histoire: les valeurs passées, présentes et
futures (prévues) sont stockées de façon permanente
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 9
u Exemple:signal s : bit := '0';
•••s
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 10
u Les signaux possèdent deux types de retard:X inertiel (par défaut)X de transport
A1
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 11
u On peut associer certains attributs aux signaux, qui produisent une valeur. Des exemples d’attributs sont:X s'event:
vrai si un événement arrive pendant le delta présent (c’est-à-dire, si le signal s change de valeur)
X s'active:vrai si une transaction arrive pendant le delta présent (c’est-à-dire, si le signal s est évalué, qu’il change ou pas de valeur)
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 12
Processus (process)
u Un processus est un ensemble de phrases séquentiellesu Sémantiquement, c’est une boucle infinie, à moins qu’il n’y ait une
phrase wait ou une liste de sensibilitéu Un modèle VHDL peut être vu comme un ensemble de processus
exécutés en parallèleu Les signaux sont utilisés pour contrôler l’activation des processus
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 13
u Phrases wait:wait on A, B; -- changement de A ou Bwait for délai; -- une certaine duréewait until condition;wait on ListeDeSignaux until condition
for délai; -- cas général
ident: processdéclarations
begin
phrases séquentielles
end process ident;
(A, B)
wait on A, B;
liste de sensibilité
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 14
u Un programme principal en VHDL est un ensemble de processus, chacun s’exécutant indéfiniment dans une boucle infinie (à moinsd’avoir un wait explicite ou une liste de sensibilité). La liste de sensibilité est incompatible avec les waits: c’est l’une ou l’autre.L’ordre d’écriture des processus est bien entendu indifférent
u Une affectation de signal, à l’intérieur d’un programme principal, est donc un processus. Par exemple:
CLK
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 15
Phrases séquentielles
uif condition then
phrases{ elsif condition then
phrases }[ else
phrases ]end if;
ucase opcode of
when X"00" => add;when X"01" => subtract;when others => illegal_opcode;
end case;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 16
uloop
faire;end loop;
uwhile toto < tata loop
toto := toto + 1;end loop;
ufor item in 1 to last_item loop
table(item) := 0;end loop;
unext [ label ] [ when condition ];
uexit [ label ] [ when condition ];
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 17
Entité (entity)
déclaration d’entité
architecturecomportementale
architecturestructurale
architecturedataflow
architecturetoto
déclarationd’entité
corps del’architecture entité de conception
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 18
Déclaration d’entitéu C’est la vue externe du système, avec une déclaration de ses ports
(canaux de communication entrée/sortie, pour le transport des signaux)
u Exemple:
comparateurA
BC
entity comparateur isport (A, B : in bit;
C : out bit);end comparateur;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 19
Corps de l’architecture
u C’est la vue interne du système.Plusieurs vues sont possibles pour la même conception
u Exemple:
XOR2I1
I2
SINVO OI C
A
Bcomparateur
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 20
architecture comportementale of comparateur isbegin
processbeginif (A = B) then
C
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 21
architecture dataflow of comparateur isbegin
C
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 22
architecture structurale of comparateur is
component XOR2port (O : out bit; I1, I2 : in bit);
end component;component INV
port (O : out bit; I : in bit);end component;signal S : bit;
beginC1 : XOR2 port map (O => S, I1 => A, I2 => B);C2 : INV port map (C, S);
end structurale;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 23
Différences entre variables et signaux
u Les variables sont toujours locales à un processus: il n’y a pas de variables globales
u Les signaux peuvent être déclarés n’importe où dans le programme, sauf à l’intérieur d’un processus. S’ils sont déclarés au début de l’architecture, ils sont communs à toute l’architecture
u Contrairement aux signaux, les variables sont mises à jour de façon instantanée, au moment de l’affectation, sans retard possible
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 24
u Les phrases à l’intérieur d’un processus sont toujours exécutées en séquence, y compris les affectations de signaux. Toutefois, les signaux sont mis à jour en même temps, au moment d’un wait. En absence d’un wait, le processus est exécuté sans arrêt, sans que les signaux soient mis à jour.C’est-à-dire: lorsqu’on exécute les phrases à l’intérieur d’un processus, on utilise les valeurs initiales des signaux pour tous les calculs et, à la fin, on met à jour les nouvelles valeurs.Si, par exemple a=4 et b=1 et on a dans un processus:
b
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 25
u Exemple avec des variables:
Si trigger change à t=10, alors var1=5, var2=5, var3=5 et à t=10+∆, sum=15
entity toto isend toto;
architecture var of toto issignal trigger, sum : integer := 0;
beginprocess
variable var1 : integer := 1;variable var2 : integer := 2;variable var3 : integer := 3;begin
wait on trigger;var1 := var2 + var3;var2 := var1;var3 := var2;sum
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 26
u Exemple avec des signaux:
Si trigger change à t=10, tous les signaux sont mis à jour à t=10+∆ : sig1=5, sig2=1, sig3=2 et sum=6
entity toto isend toto;
architecture sig of toto issignal trigger, sum : integer := 0;signal sig1 : integer := 1;signal sig2 : integer := 2;signal sig3 : integer := 3;begin
processbeginwait on trigger;sig1
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 27
u Exemple à l’intérieur d’un programme principal:
a
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 28
u Un port de sortie ne peut être utilisé que comme destination d’une expression. Exemple:
entity nonet isport (a, b : in bit;
z, zbarre : out bit);end nonet;
architecture fausse of nonet isbegin
z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 29
Packages et libraries
u On peut mettre dans un package des composants et des fonctions qui pourront être utilisés par la suite, dans d’autres programmes
u Des packages peuvent être mis à l’intérieur d’une libraryu Pour utiliser un package, il faut le déclarer, ainsi que sa library:
library bitlib;use bitlib.bit_pack.all;
library package composant ou fonction
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 30
u Une library tres utilisée est celle définissant le standard IEEE 1164:library IEEE;use IEEE.std_logic_1164.all;
Cette library contient notamment la définition des types std_logic etstd_logic_vector, qui remplacent couramment les types bit et bit_vector, respectivement. L’avantage principal de ces types est de permettre l’utilisation de 9 valeurs différentes pour tout signal logique:X 'U' uninitializedX 'X' forcing unknownX 'W'weak unknownX '0' forcing 0X 'L'weak 0X '1' forcing 1X 'H'weak 1X 'Z' high impedanceX '-' don’t care
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 31
Exemple de système combinatoireu Additionneur de deux nombres à deux bits:
library ieee;use ieee.std_logic_1164.all;
entity AddLog isport (x1, x0, y1, y0 : in std_logic;
s2, s1, s0 : out std_logic);end AddLog;
AddLogAddLog
x1x0y1y0
s2s1s0
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 32
architecture table of AddLog issignal entree: std_logic_vector(3 downto 0);
beginentree s2
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 33
when "0100" => s2
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 34
when "1100" => s2
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 35
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 36
architecture equations of AddLog isbegin
s2
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 37
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 38
u Description fonctionnelle:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;
entity AddFonc isport (x, y : in std_logic_vector(1 downto 0);
s : out std_logic_vector(2 downto 0));end AddFonc;
architecture comportement of AddFonc isbegin
s
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 39
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 40
Synthèse: exemple de machine séquentielle
S0S0
S1S1
S3S3
S5S5
S2S2
S4S4
S6S6
0/1
0/1
0/01/1
0/0
1/1
0/1
0/1
1/0
0/01/1
1/0
1/0
X/Z
1/0
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 41
MSMSCLK
XZ
entity MS isport (X, CLK : in std_logic;
Z : out std_logic);end MS;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 42
SLCX Nextstate
registreState
Z
CLK
3
3
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 43
architecture graphe of MS is
signal State, Nextstate: integer := 0;
begin
process (State, X)begin
case State iswhen 0 =>
if X='0' then Z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 44
when 4 =>if X='0' then Z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 45
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 46
architecture synt1 of MS is
type s_type is (S0, S1, S2, S3, S4, S5, S6);signal State, Nextstate: s_type;
begin
process (State, X)begin
case State iswhen S0 =>
if X='0' then Z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 47
when S3 =>if X='0' then Z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 48
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 49
MSMSCLK
XZ
entity MS isport (X, reset, CLK : in std_logic;
Z : out std_logic);end MS;
reset
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 50
architecture synt2 of MS is
type s_type is (S0, S1, S2, S3, S4, S5, S6);signal State, Nextstate: s_type;
begin
process (State, X)begin
Z
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 51
when S3 =>Nextstate
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 52
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 53
Procédures
u Il existe trois modes pour les paramètres des procédures:X in: le paramètre est passé en valeur et ne peut donc pas être modifié par la
procédureX out: le paramètre est modifié par la procédure mais aucune valeur n’est
transmise à la procédureX inout: le paramètre est passé par référence et il peut donc être lu et modifié
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 54
u Exemple:
type byte is array (7 downto 0) of std_logic;•••
procedure ByteToInteger (ib: in byte; oi: out integer) isvariable result : integer := 0;begin
for i in 0 to 7 loopif ib(i) = '1' then
result := result + 2**i;end if;
end loop;oi := result;
end ByteToInteger;
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 55
Fonctions
function f (a, b, c : std_logic) return std_logic isvariable x : std_logic;begin
x := ((not a) and (not b) and c);return x;
end f;
u Tous les paramètres d’une fonction sont de mode in: en dehors de ses variables locales, une fonction ne peut modifier que la valeur retournée. En plus, les paramètres ne peuvent pas être de type variable: ils ne peuvent être que des constantes ou des signaux
u Exemple:
Eduardo SanchezEcole Polytechnique Fédérale de LausannePage 56
Genericsu C’est une façon de spécifier des paramètres pour un composant: à
chaque fois que le composant est utilisé, on peut donner des valeurs différentes pour ces paramètres
u Exemple:entity nand2 is
generic (trise, tfall : time;load: natural);
port (a, b : in std_logic;c : out std_logic);
end nand2;•••
component nand2 isgeneric (trise : time := 3 ns;
tfall : time := 2 ns;load : natural := 1);
port (a, b : in std_logic;c : out std_logic);
end component;