Professional Documents
Culture Documents
I - VHDL....................................................................................................................................................................... 3
II - Outils...................................................................................................................................................................... 3
III - Premiers lments de syntaxe............................................................................................................................. 4
III-A - Types disponibles dans ieee.std_logic_1164...............................................................................................4
III-B - Paire entit/architecture............................................................................................................................... 4
III-B-1 - Premier exemple : un demi-additionneur............................................................................................ 4
III-C - Entit............................................................................................................................................................ 5
III-C-1 - Attribution des pins..............................................................................................................................5
III-D - Architecture.................................................................................................................................................. 5
IV - Logique combinatoire........................................................................................................................................... 6
IV-A - Flot de donnes...........................................................................................................................................6
IV-A-1 - Deuxime exemple : un multiplexeur 4-1 en portes logiques.............................................................6
IV-A-2 - Troisime exemple : un multiplexeur 4-1 avec un WHEN.................................................................. 6
IV-A-3 - Quatrime exemple : un multiplexeur 4-1 avec un SELECT.............................................................. 7
IV-B - Structurel......................................................................................................................................................7
IV-B-1 - Cinquime exemple : additionneur complet........................................................................................8
IV-C - Comportemental.......................................................................................................................................... 9
IV-C-1 - Sixime exemple : un multiplexeur comportemental avec IF............................................................. 9
IV-C-2 - Septime exemple : un multiplexeur comportemental avec CASE.................................................. 10
IV-C-3 - Huitime exemple : un dcodeur avec FOR.................................................................................... 10
V - Logique squentielle............................................................................................................................................10
V-A - chauffement : le flip-flop D....................................................................................................................... 11
V-A-1 - Neuvime exemple : un flip-flop D synchrone................................................................................... 11
V-A-2 - Dixime exemple : un flip-flop D asynchrone.................................................................................... 11
V-B - Machine tats.......................................................................................................................................... 12
VI - Simuler un circuit................................................................................................................................................13
VII - Remerciements.................................................................................................................................................. 19
-2Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
I - VHDL
VHDL est le sigle de VHSIC hardware description language ; VHSIC vient quant lui de very-high-speed integrated
circuits, une initiative de la Dfense amricaine dans les annes 1980 visant la construction de circuits intgrs
trs rapides. Le VHDL est un langage de description du matriel utilis en lectronique. En tant que standard, il est
indpendant du logiciel utilis pour la compilation, la programmation des composants, la simulation, etc.
Il autorise plusieurs mthodologies de conception (comportemental, flot de donnes, structurel) tout en tant d'un
trs haut niveau d'abstraction en lectronique (il est indpendant de la technologie utilise : FPGA, CPLD, ASIC,
etc.). Cette abstraction permet d'ailleurs de le simuler sur ordinateur avant de programmer la moindre puce.
Lors de sa conception, l'objectif n'tait pas de produire un nouveau langage ex nihilo : la Dfense avait rcemment
mis au point le langage Ada, il tait prfrable de partir sur ces bases et en exploiter autant que possible la syntaxe,
en l'adaptant au contexte de l'lectronique numrique.
Utiliser ce langage vite de driver des tables de vrit des spcifications, que l'on simplifie alors en quations
boolennes implmenter. Il permet d'expliciter la fonction implmenter sans se soucier de ces dtails, bien que
l'implmentation en pratique se fera l'aide de portes logiques (le compilateur se chargera de passer du code aux
portes).
Il n'est pas le seul sur le march : Verilog, par exemple, est galement un langage trs utilis, possdant une syntaxe
fort diffrente mais des fonctionnalits quivalentes, si ce n'est gales. VHDL semble plus utilis en Europe. Une
belle proportion des outils disponibles supportent indiffremment les deux.
VHDL et Verilog sont des concurrents de la premire heure, bien que Verilog fut le premier sur le march (vers
1983-1984, par Gateway Design Automation, socit qui fut rachete par Cadence) - il s'agissait d'un standard ferm,
certains allant jusqu' dire que cette fermeture tait la seule raison de la cration de VHDL. Ds 1983, IBM, Texas
Instruments et Intermetrics ont commenc dvelopper le VHDL ; sa version 7.2 est sortie en 1985 et, deux ans
aprs, fut standardise par l'IEEE en tant que 1076-1987 (un an aprs en avoir reu les droits). En tant que standard
IEEE, il doit tre revu priodiquement, tous les cinq ans au plus (actuellement, les rvisions 1993, 2000, 2002 et
2008 sont sorties).
Ce langage n'est pas dnu d'extensions, il ne se limite pas la description de circuits numriques. Notamment,
VHDL-AMS inclut des extensions pour grer les signaux analogiques et mixtes (analog and mixed-signal, AMS),
en offrant les mmes avantages (description de haut niveau, vrification, simulation). galement, VHPI (VHDL
Procedural Interface) est une interface pour du code C ou C++. Plus tonnant peut-tre, OO-VHDL, qui, comme son
nom l'indique, ajoute des fonctionnalits orientes objet au VHDL, pour une abstraction d'encore plus haut niveau,
tout en restant utilisable par du code VHDL (ce qui n'est pas sans rappeler les dbuts de C++).
II - Outils
Les fabricants des puces programmables fournissent gnralement, sur leur site ou avec les puces, tous les logiciels
ncessaires pour les utiliser : compilateur ou synthtiseur VHDL, qui se chargera de convertir le code VHDL en sa
version logique, prte pour la puce ; simulateur, pour tester le code.
Notamment, Lattice Semiconductors fournit la suite ispLEVER, qui comprend notamment un diteur basique, mais
la licence est galement valable pour ActiveHDL, un bien meilleur diteur et simulateur ; de mme, Xilinx fournit
gratuitement sa suite d'outils. chaque fois, il faut s'inscrire sur le site pour tlcharger les outils.
Pour l'dition simple du code, tout diteur convient galement : Notepad++ et jEdit, de base, disposent d'une
coloration syntaxique (quoique pas toujours jour ou la hauteur d'un outil ddi ce langage).
Il est possible de s'armer de manire totalement open source : GHDL est un compilateur VHDL bas sur GCC et un
simulateur, tandis que GTKWave permet d'en visualiser les rsultats.
-3Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
-4Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
Le compilateur optimisera autant que possible ces fonctions, possiblement en crant des fonctions intermdiaires
et en les connectant. Il dcide galement de la manire d'attribuer les pins du composant programm, moins que
cela ne soit explicit.
S = (Sxor);
R = (R_c);
A_c = (A);
B_c = (B);
Sxor.X1 = (A_c);
Sxor.X2 = (B_c);
R_c = (A_c & B_c);
III-C - Entit
L'entit sert principalement dfinir les entres et les sorties du composant :
entity NAME is
port(IO);
end NAME;
Un vecteur de bit dclar comme ci-dessus aura le bit de poids fort en l'indice le plus lev et
le bit de poids faible en zro.
On peut galement dfinir des valeurs par dfaut l'aide d'une expression et de l'oprateur := :
entity NAME is port(
S: std_logic_vector(1 downto 0) := "10"
);
attribute pin_numbers of NAME: entity is
"S(1):24 S(0):12"
end NAME;
III-D - Architecture
Une architecture dcrit le fonctionnement du systme, l'implmentation de la fonctionnalit voulue. Son
fonctionnement peut tre combinatoire ou squentiel. Pour modliser un systme complet, on utilisera une srie de
paires entit-architecture.
On y dfinit des signaux, l'quivalent le plus proche des variables en programmation informatique : ils servent
passer les rsultats intermdiaires d'un bloc fonctionnel un autre. On les utilisera en pratique lors de la prsentation
des architectures comportementales.
-5Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
flot de donnes : on crit explicitement les fonctions boolennes que l'on veut voir implmentes ( rserver
aux plus petits circuits pour des raisons de lisibilit) ; c'est lui qu'on a utilis pour implmenter le demiadditionneur ;
structurel : on dcrit le circuit comme une srie de botes noires interconnectes au moyen de signaux
(utilis pour des circuits moyens ou grands) ; on procdera de cette manire pour synthtiser un additionneur
complet l'aide de deux demi-additionneurs ;
comportemental : de manire trs semblable un langage de programmation informatique, on prcise le
fonctionnement voulu l'aide d'une suite d'instructions de contrles plus ou moins volues (conditions,
boucles, etc.), dans un process.
IV - Logique combinatoire
La logique combinatoire est relativement simple tudier : en fonction d'une srie d'entres, on fournit une suite
de sorties, sans que ces sorties dpendent des entres prcdentes. Notamment, on traitera tous les problmes
d'arithmtique, comme l'addition ou soustraction de nombres.
) et d'une sortie.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity MUX is port(
E0, E1, E2, E3, SEL0, SEL1: in std_logic;
S: out std_logic);
end;
architecture FLOT_MUX of MUX is
begin
S <= ((not SEL0) and (not SEL1) and E0) or
(SEL0 and (not SEL1) and E1) or
((not SEL0) and SEL1 and E2) or
(SEL0 and SEL1 and E3);
end FLOT_MUX;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity MUX is port(
E0, E1, E2, E3, SEL0, SEL1: in std_logic;
S: out std_logic);
end;
architecture FLOT_MUX of MUX is
begin
S <= E0 when (SEL0='0' and SEL1='0') else
E1 when (SEL0='1' and SEL1='0') else
E2 when (SEL0='0' and SEL1='1') else
E3;
end FLOT_MUX;
On peut alors employer un don't care pour grer tous les cas restants, ce qui permet de n'avoir une sortie contrle
que si les entres de slection forment une adresse correcte.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity MUX is port(
E0, E1, E2, E3, SEL0, SEL1: in std_logic;
S: out std_logic);
end;
architecture FLOT_MUX of MUX is
begin
S <= E0 when (SEL0='0' and SEL1='0')
E1 when (SEL0='1' and SEL1='0')
E2 when (SEL0='0' and SEL1='1')
E3 when (SEL0='1' and SEL1='1')
'-';
end FLOT_MUX;
else
else
else
else
IV-B - Structurel
On assemble ici une srie de botes noires dj crites pour former un circuit plus complexe.
-7Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
C'est le principe utilis pour des additionneurs plusieurs bits : on branche en srie une srie d'additionneurs
complets, chacun pouvant additionner trois bits. Leur sortie est compose du bit de somme et du bit de report, comme
les demi-additionneurs. Alors que le bit de somme est directement transmis la sortie du circuit, le bit de report est
transmis comme troisime bit additionner l'additionneur complet suivant.
Cependant, ce principe n'est pas forcment gnralisable grande chelle, puisque chaque additionneur a besoin du
bit de report de l'additionneur prcdent pour effectuer son travail. Pour additionner bits, on devra donc attendre
temps de propagation du signal travers les portes logiques. On peut pallier ce problme, par exemple, en prvoyant
le bit de report ou en calculant deux valeurs (quand le bit de report est
ou
).
i1: HA
port map(A, B, S1, S2);
i2: HA
port map(S2, Ri, S3, S);
i3: P_OR port map(S3, S1, R);
end FA_ARCH;
Il importe de bien mettre les mmes noms de variables lors de l'utilisation des composants que lors de leur cration.
Lors d'une dclaration d'architecture par structure, les seuls symboles utiliss sont les entres, signaux et sorties du
composant cr, pas les variables dclares dans l'entit concernant l'utilisation de composants externes.
IV-C - Comportemental
On dcrit alors l'architecture comme une suite d'instructions, comme en programmation informatique traditionnelle.
On dfinit des process ainsi que leur liste de sensibilit : ds qu'un symbole change de valeur dans cette liste, le
code est rexcut. C'est utile notamment en logique squentielle, pour lancer le code chaque coup de l'horloge.
Les instructions sont excutes de manire squentielle ; cependant, les signaux ne changent de valeur qu' la fin
du process.
On peut utiliser diverses constructions bien connues (fort semblables l'Ada) : le if-then-else, le case-is when, etc. On
dispose de plusieurs boucles, mais leur utilisation ne correspond pas l'habitude informatique (elles correspondent
plus une simplification de l'criture qu' une excution de code rptitive pour s'approcher du rsultat final ou toute
utilisation plus traditionnelle des boucles), de mme pour les fonctions et procdures.
Les signaux sont dfinis dans l'en-tte de l'architecture ; les variables ne sont valables que dans un process. En
dehors d'un process, tout se produit de manire concurrente : deux process peuvent tre excuts simultanment.
Par contre, dans un process, toutes les instructions sont excutes de manire squentielle et les affectations sont
ralises la fin.
-9Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
end;
for I in 0 to 3 loop
if I = N then
S(I) <= '1';
end if;
end loop;
end process;
V - Logique squentielle
Simplement, on passe en logique squentielle quand on ajoute une horloge en entre et qu'un bout de code
est excut chaque flanc montant/descendant. On se basera donc sur une expression comportementale de
- 10 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
l'architecture, il n'est pas possible de procder autrement. Les sorties du circuit dpendront des entres actuelles
ainsi que de leurs valeurs prcdentes.
Par exemple, la logique squentielle sera utilise pour une lampe clignotante ( chaque coup d'horloge, on inverse
la sortie, afin que la lampe passe de l'tat allum, puis teint, puis allum car on retourne l'tat initial) ou pour tout
circuit un tant soit peu plus compliqu (comme un processeur : chaque coup d'horloge, il faut raliser une srie
d'oprations dictes par l'instruction en cours d'excution ; quand on a fini de traiter une instruction, on passe la
suivante ; chaque fois, il faut mmoriser quel endroit on est arriv dans le traitement d'une instruction et dans
le code excuter).
, on recopie l'entre
la sortie
, on mmorise la valeur
. Le reset permet de mettre le flip-flop dans un tat stable et connu, ce qui n'est pas forcment le cas la mise
sous tension.
- 11 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
begin
if RAZ = '1' then
Q <= '0';
elsif rising_edge(CLK) then
Q <= D;
end if;
end process;
end ARCH_FFD;
Ainsi, si on veut implmenter une machine tats, il suffit de dfinir une srie de bits dfinissant l'tat courant ; ainsi,
chaque coup d'horloge, on excute un process qui va varier en fonction de l'tat courant. On prfrera utiliser un
signal, tant donn qu'il n'est pas utile de transmettre cette valeur l'extrieur ou de laisser la possibilit de l'altrer
directement.
On peut donc implmenter cette lampe en VHDL. La machine tats ne contiendra que deux tats et un bit suffira
pour le retenir (
). La sortie O varie en mme temps que le flanc montant d'horloge et servira actionner
la lampe (ce qui est fait du signal en sortie est grer manuellement l'aide de DEL et rsistances, en se basant sur
les spcifications du composant utilis notamment en ce qui concerne le courant de sortie).
entity NAME is port(
CLK: in std_logic;
O:
out std_logic;
end;
architecture arch_NAME of NAME is
signal state: std_logic;
begin
process(CLK)
begin
if rising_edge(CLK) then
if state = '0' then
O <= '1';
state <= '1';
else
O <= '0';
state <= '0';
end if;
end if;
end process;
end arch_NAME;
Si on veut utiliser la valeur d'une sortie comme base dans un bout de programme, ce n'est pas possible : il faut dfinir
un signal qui sera recopi dans la sortie, de manire asynchrone. Pour ce faire, on met l'instruction de recopie dans
la sortie en dbut d'architecture, avant de dfinir le moindre process.
architecture Arch of Sth is
- 12 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
VI - Simuler un circuit
On utilise dans cette section Active-HDL 8.2, bien que la manipulation puisse tre totalement diffrente dans un autre
logiciel.
Aprs avoir lanc le logiciel, crer un nouveau design et ajouter un fichier prcdent (ici, on utilise le code d'un
additionneur complet). Au lancement du logiciel, choisir la cration d'un nouvel espace de travail et profiter de l'option
de cration d'un nouveau design (accessible depuis le menu File > New). L'option Add existing resource files permet
d'insrer de nouveaux fichiers dans ce design ; aprs avoir slectionn le fichier, la page suivante demande de
spcifier le langage de description (VHDL).
cran d'accueil.
- 13 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
- 14 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
Fichiers ajouter.
- 15 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
Choix du langage.
- 16 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
Initialisation de la simulation.
- 17 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
- 18 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/
Choix du stimulateur.
On obtient ainsi un signal en sortie qui additionne les trois bits plus haut. On a fix le bit de report zro tout le temps.
Rsultat de la simulation.
VII - Remerciements
Merci Nicolas Valle pour son aide la rdaction, vermine pour ses encouragements et Claude Leloup pour
sa relecture orthographique !
- 19 Copyright 2012 Thibaut Cuvelier. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://tcuvelier.developpez.com/tutoriels/vhdl/introduction-langage/