Вы находитесь на странице: 1из 84

Initiation à VHDL

CYPRESS

Initiation à VHDL
Application à la
Logique Programmable

Philippe Larcher
Cypress © 1994, 1996, 1998, 1999
1
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


2
Initiation à VHDL

A qui s'adresse cette présentation?

 A ceux qui ne connaissent pas VHDL


 A ceux qui pensent que VHDL est trop compliqué
 A ceux qui pensent que VHDL n'est pas assez compliqué...

Cypress © 1994, 1996, 1998, 1999


3
Initiation à VHDL

A qui s'adresse cette présentation?

"VHDL, c'est trop compliqué"

Non :
 VHDL peut décrire des architectures complexes, mais VHDL aime
aussi la simplicité
 VHDL est un langage fortement typé et contrôlé : les descriptions
sont allongées, mais particulièrement fiables et sûres.
 Etant un langage de haut niveau, VHDL est particulièrement
lisible et compréhensible

Cypress © 1994, 1996, 1998, 1999


4
Initiation à VHDL

A qui s'adresse cette présentation?

"VHDL n'est pas assez compliqué"


("VHDL n'est pas assez précis pour obtenir des résultats optimum")

Non :

 VHDL supporte aussi bien des descriptions de haut niveau


(comportemental) que des descriptions de bas niveau contrôlant
très précisément la logique générée
 A tout moment c'est le concepteur qui choisit le niveau de
description le plus adéquat

Cypress © 1994, 1996, 1998, 1999


5
Initiation à VHDL

VHDL, qu'est-ce ?

 Langage de description hardware développé au titre du programme


VHSIC (Very High Speed Integrated Circuit) du DoD (Department of
Defence). VHDL = VHSIC Hardware Description Langage
 Objectif : fournir un environnement de développement hardware
complet et unifié (des spécifications à la réalisation en passant par la
simulation)
 améliorer l'intercommunication (entre spécificateurs, entre
concepteurs, entre utilisateurs, entre outils de développement, etc.)
 rendre les réalisations indépendantes des technologies et des
systèmes-hôtes (portabilité, pérennité, etc.)

Cypress © 1994, 1996, 1998, 1999


6
Initiation à VHDL

Caractéristiques générales
 Standardisé en 1987 (IEEE1076), complété en 1993 (IEEE1076,
IEEE1164)
 Langage unique pour
 la spécification, la documentation
 la vérification (preuve formelle), la simulation
 la synthèse : le langage sert d'entrée à des outils intelligents qui
permettent la réalisation de circuits intégrés (customs, ASICs) ou
programmables (PALs, PLDs, CPLDs, FPGAs)
 Interprétable par l'homme et la machine
 Indépendent des process et des technologies, indépendent des
systèmes-hôtes

Cypress © 1994, 1996, 1998, 1999


7
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


8
Initiation à VHDL

Le cadre de travail : Entity et Architecture


 La brique de base de toute description VHDL est la paire
ENTITY + ARCHITECTURE :
 Entity : déclaration de l'interface (Entrées/Sorties)
 Architecture : description du fonctionnement
entity AZERTY is
port( I1, I2, I3, I4 : in bit;
I1 O1
O1, O2 : out bit);
I2 end AZERTY;

I3 O2 architecture XXX of AZERTY is


I4 -- description du fonctionnement
end XXX;

 La complexité du 'morceau de hardware' décrit par le couple Entity +


Architecture est quelconque (système, carte, sous-fonction, porte, etc.)
Cypress © 1994, 1996, 1998, 1999
9
Initiation à VHDL

Commentaires et identificateurs

 Les commentaires débutent par un double-tiret


signal CLK: bit;
-- horloge systeme a 50 MHz

ou :
signal CLK: bit; -- horloge systeme

 Identificateurs (noms, étiquettes, etc.) : une suite de lettres ou de chiffres (et


éventuellement le caractère '_') débutant par une lettre :
A, DATA_8, SYS_CLK_50_OUT

 VHDL ne fait pas de différence, pour les identificateurs et les mots-clés, entre
majuscules et minuscules :

signal CLK: bit; et SIGNAL Clk : Bit; sont identiques

Cypress © 1994, 1996, 1998, 1999


10
Initiation à VHDL

Littéraux
 Les littéraux sont utilisés pour la représentation de valeurs
 Les plus fréquents en synthèse logique :
• entiers : 12 , 0
• booléens : true ou false
• bits : '0' ou '1'
• chaînes de bits
• "1111_1110" (le caractère _ est sans action)
• x"FE" (notation hexadécimale), o"76" (octal)
• caractères : 'Z' or ''
• chaînes de caractères : "CY7C372i-83JC"
• caractères et chaines peuvent être concaténées :
• '1' & "01" & '0' est équivalent à "1010"
• "au " & "revoir" est équivalent à "au revoir"
• "au" & "revoir" est équivalent à "aurevoir"

Cypress © 1994, 1996, 1998, 1999


11
Initiation à VHDL

a
Entity et Architecture

 Toute description VHDL simple peut être faite sans autre connaissance
qu'Entity et Architecture

 D'autres structures existent néanmoins, d'emploi optionnel ou implicite :


 Le package et ses components permettent de simplifier l'accès à
des descriptions fréquemment utilisées
 La library est le lieu de stockage des éléments compilés

Cypress © 1994, 1996, 1998, 1999


12
Initiation à VHDL

Le cadre de travail : package

 Un PACKAGE permet de regrouper des


Entity/Architectures destinées à être partagées
 certains packages sont livrés avec les outils de
développements
 d'autres sont créés par les utilisateurs

Cypress © 1994, 1996, 1998, 1999


13
Initiation à VHDL

Le cadre de travail : library


 Les 'unités de compilation' (entity, architecture, package,...) sont
conservées dans une LIBRARY
 Pour accéder aux éléments d'une LIBRARY, il suffit de la nommer
au préalable. Par exemple :
library FNAC; --déclaration d'accès à la library FNAC
 VHDL définit une LIBRARY par défaut (la LIBRARY work),
toujours accessible, qu'il n'est pas nécessaire de nommer
 La compilation d'entity, architecture, etc. s'effectue par défaut dans
la library work ou, sur demande, dans une library spécifique

Cypress © 1994, 1996, 1998, 1999


14
Initiation à VHDL

Le cadre de travail : résumé

ENTITYs

ARCHITECTUREs

PACKAGEs
(COMPONENTs)

Library X Library Y
Library WORK

Cypress © 1994, 1996, 1998, 1999


15
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


16
Initiation à VHDL

L'Entity

 L'ENTITY décrit une fonction, vue de l'extérieur :

 Nom
rst
q[7:0
 Entrées/Sorties
d[7:0] BOITE_NOIRE
co
clk

 Les signaux d'Entrée/Sortie de l'ENTITY sont des PORTs


 Chaque PORT possède un nom, un mode (sens), un type
(associé éventuellement à un ensemble de valeurs)

Cypress © 1994, 1996, 1998, 1999


17
Initiation à VHDL

PORTS : Modes
Le MODE correspond au sens de transfert :

 IN Entrée (monodirectionnelle)

 OUT Sortie (monodirectionnelle)

 INOUT Entrée/Sortie bidirectionnelle

 BUFFER Sortie rebouclée

Cypress © 1994, 1996, 1998, 1999


18
Initiation à VHDL

PORTS : Types
 VHDL est un langage fortement typé, interdisant l'interconnexion de
signaux de types différents
 Certains types sont prédéfinis par le langage :
• integer, bit, bit_vector, boolean, etc.
 VHDL permet d'étendre la liste des types de base
• IEEE1164 (type std_logic, std_logic_vector)
• Types spécifiques, définis par les outils des fournisseurs
• Types définis par l'utilisateur :
• type énuméré, par ex. : type jour is (lu, ma, me, je, ve, sa, di);
(souvent utilisé pour les machines d'état)
• sous-type : subtype octet is bit_vector(0 to 7);

Cypress © 1994, 1996, 1998, 1999


19
Initiation à VHDL

Type std_logic (IEEE1164)

 Le type bit de VHDL peut prendre les valeurs '0' et '1'. Ce type est
insuffisant pour décrire des signaux logiques réels (haute-
impédance, forçage, etc.)
 Le standard IEEE1164 définit des signaux multi-valeurs répondant
aux besoins de systèmes réels, et facilitant la simulation
 Le type std_logic (et std_logic_vector) possède 9 valeurs :
'0', '1', 'X', 'L', 'H', 'W', 'Z', 'U', '-'
 L'emploi du type std_logic est possible via la library IEEE1164
(cf. déclaration d'une Library) :
library ieee;
use ieee.std_logic_1164.all;

Cypress © 1994, 1996, 1998, 1999


20
Initiation à VHDL

Déclaration d'Entity : résumé


rst
q[0:7
d[7:0] boite_noire
LIBRARY ieee; co
clk
USE ieee.std_logic_1164.all;
ENTITY boite_noire IS PORT (
clk, rst: IN STD_LOGIC;
d: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
q: OUT STD_LOGIC_VECTOR(0 TO 7);
co: OUT STD_LOGIC);
END boite_noire; RANGE

MODE TYPE

Cypress © 1994, 1996, 1998, 1999


21
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


22
Initiation à VHDL

ARCHITECTURE
 L'ARCHITECTURE décrit le fonctionnement de la boîte noire déclarée
dans l'ENTITY
 VHDL permet différents niveaux de description :
 Haut niveau (comportemental) : description de la fonctionnalité, sans
référence au 'hardware' sous-jacent
 Bas niveau (structurel) : description par utilisation et interconnexion
de 'components' (par ex. portes logiques), comme pour un schéma
 D'une manière générale les descriptions de haut niveau favorisent la
portabilité, les descriptions de bas niveau l'efficacité
 A tout moment (y compris à l'intérieur d'une même architecture), c'est le
concepteur qui choisit le niveau de description adéquat

Cypress © 1994, 1996, 1998, 1999


23
Initiation à VHDL

Architecture : exemple d'un comparateur

1- Description comportementale
A
C
Comparateur
Comparateur
B
architecture ARCH1 of COMPARATEUR is
begin
C <= '1' when (A=B) else '0';
end ARCH1;

Cypress © 1994, 1996, 1998, 1999


24
Initiation à VHDL

Architecture : exemple d'un comparateur


2- Description comportementale (type data-flow)
A
C
Comparateur
Comparateur
B
architecture ARCH2 of COMPARATEUR is
begin
C <= not(A xor B);
end ARCH2;

Cypress © 1994, 1996, 1998, 1999


25
Initiation à VHDL

Architecture : exemple d'un comparateur


3- Description structurelle de bas niveau
(interconnecte des composants élémentaires) A U0 U1
S C
xor2 inv
B
use work.gatespkg.all;
architecture ARCH3 of COMPARATEUR is
signal S : bit;
begin
U0 : xor2 port map (A,B,S); Les signaux internes sont déclarés en tête de
U1 : inv port map (S,C); l'architecture (même déclaration que les signaux
d'entity, sans 'mode')
end ARCH3;

Cypress © 1994, 1996, 1998, 1999


26
Initiation à VHDL

Déclarations internes
L'en-tête d'architecture permet de déclarer les signaux internes, variables,
constantes, etc. :
 Exemple de déclaration de signal :
signal VCOMP : std_logic(4 to 7);

 Exemple de déclaration de constante :


constant NEUF : std_logic_vector(3 downto 0) := "1011";

 Exemple de déclaration de variable :


variable J : integer range 0 to 15 := 0;
(N.B. : l'emploi de variables en synthèse logique est rarement recommandé :
pas d'équivalence au niveau du 'silicium')

Cypress © 1994, 1996, 1998, 1999


27
Initiation à VHDL

Architecture : exemple d'un comparateur


4- Description mixte
A
C
Comparateur
Comparateur 0
entity COMPSYNC is B
port (A,B,CLK,RST : in bit; QC
QC : out bit);
end COMPSYNC;
CLK
RST
use work.gatespkg.all;
architecture ARCH of COMPSYNC is
signal C : bit;
constant zero : bit := '0';
begin
C <= '1' when (A=B) else '0';
U0 : dsrff port map (C,zero,RST,CLK,QC);
end ARCH;

Cypress © 1994, 1996, 1998, 1999


28
Initiation à VHDL

ARCHITECTURE
Conclusion : les descriptions comportementales sont recommandées, sauf
raison majeure de performance ou de densité :
 meilleure compacité : par exemple un comparateur 4 bits :
en comportemental :
aeqb <= '1' WHEN a = b ELSE '0';

en structurel bas niveau :


u0: xnor2 PORT MAP (a(0), b(0), xnr(0));
u1: xnor2 PORT MAP (a(1), b(1), xnr(1));
u2: xnor2 PORT MAP (a(2), b(2), xnr(2));
u3: xnor2 PORT MAP (a(3), b(3), xnr(3));
u4: and4 PORT MAP (xnr(0), xnr(1), xnr(2), xnr(3), aeqb);

 meilleure lisibilité
 meilleure portabilité (indépendance vis-à-vis du composant ciblé)
Cypress © 1994, 1996, 1998, 1999
29
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


30
Initiation à VHDL

Parallèle / Séquentiel
A
C
 VHDL permet de décrire aussi bien des B
Comparateur 0

fonctionnements parallèles (ou combinatoires) que QC


séquentiels (ou synchrones) CLK

 Le PROCESS est la construction permettant ces NRST

descriptions : architecture COMPORT of COMP is


signal C : bit;
 à l'extérieur d'un PROCESS les opérations begin
s'exécutent simultanément, et en permanence C <= not (A xor B);
process (NRST,CLK) begin
 à l'intérieur d'un PROCESS les instructions
if NRST='0' then QC <= '0';
s'exécutent séquentiellement
elsif CLK='1' then QC <= C;
 un PROCESS s'exécute à chaque changement end if;
d'état des signaux auxquels il est sensible end process;
('sensitivity list') end COMPORT;
 Les signaux modifiés par le process sont mis à
jour à la fin de celui-ci

Cypress © 1994, 1996, 1998, 1999


31
Initiation à VHDL

Parallèle / Séquentiel
 Attention, l'exemple précédent est incorrect ! A
Qu'arrive-t-il en effet dans le cas ci-dessous : C
Comparateur 0
B
QC
CLK CLK

NRST
NRST

QC<=C QC<='0' QC<=C

 Code correct :
architecture COMPORT of COMP is
signal C : bit;
begin
C <= not (A xor B);
process (NRST,CLK) begin
process (NRST,CLK) begin
if NRST='0' then QC <= '0';
if NRST='0' then QC <= '0';
elsif CLK='1' then QC <= C; elsif (CLK'event and CLK='1') then QC <= C;
end if; end if;
end process; end process;
end COMPORT;

Cypress © 1994, 1996, 1998, 1999


32
Initiation à VHDL

Parallèle / Séquentiel
 Le standard IEEE-1164 permet l'emploi des fonctions
 rising_edge(signal)
 falling_edge(signal)

exemple :

process (NRST,CLK) begin


if NRST='0' then QC <= '0';
elsif rising_edge(CLK) then QC <= C;
end if;
end process;

Cypress © 1994, 1996, 1998, 1999


33
Initiation à VHDL

Parallèle / Séquentiel
 Attention : dans un PROCESS, les sorties ne sont ré-actualisées qu'à
la fin du process

Exemple : compteur avec retenue sortante


La description ci-dessous peut sembler correcte, pourtant le signal RETENUE est
activé avec un cycle de retard :
process (CLK) begin
if (CLK'event and CLK='1') then
.....
CLK
DATA_OUT <= DATA_OUT + 1;
if DATA_OUT = "1111" then RETENUE <= '1';
DATA_OUT 1110 1111 0000
else RETENUE <= '0';
end if;
end if;
RETENUE
end process;

Cypress © 1994, 1996, 1998, 1999


34
Initiation à VHDL

Parallèle / Séquentiel
 Pour corriger le fonctionnement précédent :
• Première possibilité : anticiper la génération de RETENUE

process (CLK) begin


if (CLK'event and CLK='1') then
....
CLK
DATA_OUT <= DATA_OUT + 1;
if DATA_OUT = "1110" then RETENUE <= '1';
DATA_OUT 1110 1111 0000
else RETENUE <= '0';
end if;
end if;
RETENUE
end process;

• Problème : la description devient moins évidente

Cypress © 1994, 1996, 1998, 1999


35
Initiation à VHDL

Parallèle / Séquentiel
 Pour corriger le fonctionnement précédent :
• Deuxième possibilité : générer RETENUE de manière combinatoire
(hors process)

process (CLK) begin


if (CLK'event and CLK='1') then
....
DATA_OUT <= DATA_OUT + 1; CLK
end if;
end process; DATA_OUT 1110 1111 0000
RETENUE <= '1' when DATA_OUT = "1111" else CARRY <= '0';
.... RETENUE

• Problème : le signal RETENUE n'est plus parfaitement synchrone de DATA_OUT

Cypress © 1994, 1996, 1998, 1999


36
Initiation à VHDL

Parallèle / Séquentiel
 Au concepteur de choisir la description la plus appropriée :

RETENUE générée dans le process Génération hors process (combinatoire)

RETENUE RETENUE
CLK
CLK

Cypress © 1994, 1996, 1998, 1999


37
Initiation à VHDL

Parallèle / Séquentiel
 Remarque : il est possible d'utiliser des PROCESS pour décrire des fonctionnements
combinatoires
architecture ARCHMUX of MUX is
A
begin
C
process (A,B,SEL) begin
if SEL='0' then C <= A else C<= B; B
end if;
end process;
SEL
end ARCHMUX;
 Nous ne recommandons pas cette méthode :
 un fonctionnement combinatoire peut toujours se décrire --plus simplement-- sans
recours à un PROCESS
 L'oubli d'un signal dans la liste de sensitivité peut avoir des conséquences
fâcheuses
 Réserver l'emploi de PROCESS aux seuls fonctionnements synchrones permet de
lire plus facilement une description VHDL

Cypress © 1994, 1996, 1998, 1999


38
Initiation à VHDL

L'instruction Wait
 L'instruction 'WAIT UNTIL' peut se substituer à la
liste de sensitivité d'un PROCESS
 elle s'utilise essentiellement lorsque le PROCESS
n'est activé que par un seul signal
Les deux descriptions suivantes sont équivalentes :
sync: PROCESS sync: PROCESS (clock)
BEGIN BEGIN
WAIT UNTIL clock='1';
enable IF (clock'EVENT and clock='1');
Q
q_out
IF enable='1' THEN d_in D IF enable='1' THEN
q_out <= d_in; q_out <= d_in;
ELSE ELSE
q_out <= '0'; clock q_out <= '0';
END IF; END IF;
END PROCESS sync; END IF;
END PROCESS sync;

Cypress © 1994, 1996, 1998, 1999


39
Initiation à VHDL

Quelques exemple :
1- Compteur 4 bits avec reset synchrone
USE work.std_arith.ALL;
...
upcount: PROCESS (clk)
BEGIN (les process peuvent
IF clk’EVENT AND clk= '1' THEN être étiquetés)

IF reset = '1' THEN


count <= "0000";
ELSE
count <= count + 1;
END IF;
END IF;
END PROCESS upcount;
 Ce process n'est sensible qu'au seul signal CLK

Cypress © 1994, 1996, 1998, 1999


40
Initiation à VHDL

Quelques exemple :
2- Compteur avec reset asynchrone
USE work.std_arith.ALL;
...
PROCESS (clk, rst)
BEGIN (notation hexadécimale)
IF rst = '1' THEN
count <= x"0";
ELSIF (clk’EVENT AND clk = '1') THEN
count <= count + 1;
END IF;
END PROCESS;

 Ce process est sensible aux signaux CLK et RST. Le reset est prioritaire

Cypress © 1994, 1996, 1998, 1999


41
Initiation à VHDL

Quelques exemple :
3- Compteur à chargement synchrone et reset synchrone
USE work.std_arith.ALL;
...
PROCESS (clk, rst)
BEGIN (cette notation commode
IF rst = '1' THEN dispense de préciser la largeur
du vecteur)
count <= (others => '0') ;
ELSIF clk’EVENT AND clk = '1' THEN
IF load = '1' THEN
count <= data;
ELSE
count <= count + 1;
END IF;
END IF;
END PROCESS;

Cypress © 1994, 1996, 1998, 1999


42
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


43
Initiation à VHDL

Opérateurs VHDL standard


 Logiques (définis pour le type bit)
 and, nand
 or, nor
 xor, xnor
 not
 Relationnels (bit, bit_vector, integer)
 = (equal to)
 /= (not equal to)
 < (less than)
 <= (less than or equal to)
 > (greater than)
 >= (greater than or equal to)

Cypress © 1994, 1996, 1998, 1999


44
Initiation à VHDL

Opérateurs VHDL standard (suite)

 Arithmétique unaire (integer)


 - (arithmetic negate)
 Arithmétique (integer)
 + (addition)
 - (subtraction)
 * (multiplication)
 Concaténation (string, bit, bit_vector)
 &

Cypress © 1994, 1996, 1998, 1999


45
Initiation à VHDL

Autres opérateurs VHDL

 VHDL définit d'autres opérateurs, dont l'usage est


plus orienté vers le test ou la simulation :
 / (division)
 mod (modulus)
 rem (remainder)
 ** (exponentiation)
 Ces opérateurs ne sont pas (pas encore ?) supportés
par les synthétiseurs VHDL

Cypress © 1994, 1996, 1998, 1999


46
Initiation à VHDL

Surcharge d'opérateurs
 Les opérateurs VHDL sont définis pour des types donnés :
 par exemple l'opérateur ‘+’ est défini pour le type integer
signal a,b,c : integer range 0 to 10; c <= a + b;
 Toute utilisation d'un opérande de type non prévu est refusée
 Les opérateurs peuvent être 'surchargés' pour les faire opérer également sur d'autres types :
 par ex. l'opérateur ‘+’ peut être surchargé pour opérer également sur les types
signed, unsigned, std_logic_vector, etc.
signal d,e : std_logic_vector(3 downto 0) ; d <= e + 2;
 Les fonctions de surcharge figurent dans des packages génériques (ieee : std_logic_1164),
ou particuliers (Warp : std_arith)
 Attention : IEEE-1164 ne définit pas d'arithmétique sur le type std_logic_vector
(seulement sur les types signed et unsigned). Pour Warp, utiliser le package std_arith.

Cypress © 1994, 1996, 1998, 1999


47
Initiation à VHDL

Instructions VHDL courantes

 Instructions en mode séquentiel (dans un PROCESS)


 Assignation (<=)
 Assignation conditionnelle (IF)
 Assignation sélective (CASE)
 Instructions en mode concourant (hors d'un process)
 Assignation (<=)
 Assignation conditionnelle (WHEN)
 Assignation sélective (WITH)

Cypress © 1994, 1996, 1998, 1999


48
Initiation à VHDL

Quelques exemples
 Assignation conditionnelle, combinatoire : instruction when
library ieee;
use ieee.std_logic_1164.all;
Multiplexeur 4-->1 entity MUX4 is
port( a,b,c,d : in std_logic_vector(3 downto 0);
4
a e : out std_logic_vector(3 downto 0);
4
b 4 s1,s0 : in std_logic );
4 e
c end MUX4;
4
d architecture ARCHMUX4 of MUX4 is
begin
e <= a when (s1 & s0) = "00" else
s1 s0 b when (s1 & s0) = "01" else
c when (s1 & s0) = "10" else
d;
end ARCHMUX4;

Cypress © 1994, 1996, 1998, 1999


49
Initiation à VHDL

Quelques exemples
 Assignation conditionnelle, combinatoire

architecture ARCHDECOD of DECOD is


Décodeur 2-->4 constant ze : std_logic_vector(1 downto 0):="00";
constant un : std_logic _vector(1 downto 0):="01";
constant de : std_logic _vector(1 downto 0):="10";
s0
constant tr : std_logic _vector(1 downto 0):="11";
a(1) s1 begin
a(0) s2 s0 <= '0' when a=ze else '1';
s3 s1 <= '0' when a=un else '1';
s2 <= '0' when a=de else '1';
s3 <= '0' when a=tr else '1';
end ARCHDECOD;

Cypress © 1994, 1996, 1998, 1999


50
Initiation à VHDL

Quelques exemples
 Assignation conditionnelle, séquentielle : instruction if

Décodeur 2-->4 architecture ARCHDECODR of DECODR is


(registre en sortie) begin
process begin
s0 wait until (clk'event and clk='1');
a(1) s1 if a="00" then s0 <= '0' else s0 <= '1' ; end if;
a(0) s2 if a="01" then s1 <= '0' else s1 <= '1' ; end if;
s3 if a="10" then s2 <= '0' else s2 <= '1' ; end if;
if a="11" then s3 <= '0' else s3 <= '1' ; end if;
clk
end process;
end ARCHDECODR;

Cypress © 1994, 1996, 1998, 1999


51
Initiation à VHDL

L'instruction CASE
 Permet l'exécution d'une opération (ou d'une succession d'opérations)
en fonction de la valeur prise par une expression
architecture ARCHDECODR of DECODR is
Décodeur 2-->4 x signal temp : std_logic_vector(0 to 3);
(registre en sortie) begin
process begin
temp(0) wait until (clk'event and clk='1');
s0
a(1) temp(1)
s1 case (a) is
a(0) temp(2)
s2 when "00" => temp <= "0111";
temp(3)
s3 when "01" => temp <= "1011";
when "10" => temp <= "1101";
clk when others => temp <= "1110";
end case;
end process;
s0 <= temp(0); s1 <= temp(1); s2 <= temp(2); s3 <= temp(3);
end ARCHDECODR;

Cypress © 1994, 1996, 1998, 1999


52
Initiation à VHDL

L'instruction CASE
 Particulièrement utile pour la description de machines d'états
ARCHITECTURE archdesign OF design IS
TYPE etat is (repos, demarre, attente, fin, erreur);
SIGNAL etat_courant : etat;
BEGIN
PROCESS (clk) BEGIN
IF (clk'event and clk='1') THEN
CASE etat_courant IS
WHEN repos =>
IF start='1' then etat_courant <= demarre;
END IF;
x WHEN demarre =>
output <= input3;
etat_courant <= attente;
WHEN ...
WHEN OTHERS => ...
END CASE;
END IF;
x END PROCESS;
END archdesign;

Cypress © 1994, 1996, 1998, 1999


53
Initiation à VHDL

L'effet 'mémoire implicite'


 en VHDL, les signaux ont une valeur courante, et une valeur suivante
 Si la valeur suivante d'un signal n'est pas spécifiée, elle est supposée identique à la
valeur courante.
 De même si l'une des valeurs suivantes d'un signal conditionnel n'est pas spécifiée,
un latch sera créé pour maintenir sa valeur courante (cette création est nommée
'mémorisation implicite')
 Avantage :
 Simplifie la description d'éléments-mémoire

if (clk'event and clk='1') then Q<= D; if (clk'event and clk='1') then Q<= D;
identique à
end if; else Q <= Q;
 Inconvénient : end if;
 Peut générer des latches inattendus, lorsque toutes les options d'une
instruction conditionnelle ne sont pas spécifiées

Cypress © 1994, 1996, 1998, 1999


54
Initiation à VHDL

Mémorisation implicite:
Exemple de spécification incomplète
A
enable
 Si la fonction ci-contre est décrite par B C

C <= B when A='1';

cette spécification incomplète (absence de 'ELSE')


provoquera la synthèse d'un latch de maintien dans le cas A C
où A='0'
B
 L'écriture C <= B when A='1' else '0';
permet de simplifier considérablement la logique générée : A C
B

Cypress © 1994, 1996, 1998, 1999


55
Initiation à VHDL

Mémorisation implicite:
autre exemple de spécification incomplète
entity DECODR is port(
Décodeur 2-->4 a : in std_logic_vector(1 downto 0);
(registre en sortie) clk : in std_logic;
s0,s1,s2,s3 : out std_logic);
s0 end DECODR;
a(1) s1 architecture ARCHDECODR of DECODR is
a(0) s2 begin
process begin
s3
wait until (clk'event and clk='1'); Lorsque les sorties passent à 0
clk case (a) is elles y restent indéfiniment !
when "00" => s0 <= '0';
when "01" => s1 <= '0';
when "10" => s2 <= '0';
when others => s3 <= '0';
end case;
end process;
end ARCHDECODR;

Cypress © 1994, 1996, 1998, 1999


56
Initiation à VHDL

Comment régler le problème précédent


entity DECODR is port(
Décodeur 2-->4 a : in std_logic_vector(1 downto 0);
(registre en sortie) clk : in std_logic;
s0,s1,s2,s3 : out std_logic);
s0 end DECODR;
a(1) s1 architecture ARCHDECODR of DECODR is
a(0) begin fastidieux...
s2
process begin
s3
wait until (clk'event and clk='1');
clk case (a) is
when "00" => s0 <= '0'; s1 <= '1'; s2 <= '1'; s3 <= '1';
when "01" => s1 <= '0'; s0 <= '1'; s2 <= '1'; s3 <= '1';
when "10" => s2 <= '0'; s0 <= '1'; s1 <= '1'; s3 <= '1';
when others => s3 <= '0'; s0 <= '1'; s1 <= '1'; s2 <= '1';
end case;
end process;
end ARCHDECODR;

Cypress © 1994, 1996, 1998, 1999


57
Initiation à VHDL

Comment régler le problème précédent

architecture ARCHDECODR of DECODR is


Décodeur 2-->4 signal temp : std_logic_vector(0 to 3);
(registre en sortie) begin
process begin
temp(0) wait until (clk'event and clk='1');
s0
a(1) temp(1)
s1 case (a) is
a(0) temp(2)
s2 when "00" => temp <= "0111";
temp(3)
s3 when "01" => temp <= "1011";
when "10" => temp <= "1101";
clk when others => temp <= "1110";
end case;
end process;
s0 <= temp(0); s1 <= temp(1); s2 <= temp(2); s3 <= temp(3);
end ARCHDECODR;

Cypress © 1994, 1996, 1998, 1999


58
Initiation à VHDL

Les règles pour maitriser la


mémorisation implicite
 Se rappeler que tout signal positionné dans la branche THEN d'un IF sera également
évalué pour la branche ELSE. Ne pas mentionner un signal dans l'une des branches
signifie qu'il doit rester inchangé
 De même pour une instruction CASE :
• un signal positionné dans l'une quelconque des branches de sortie sera également
évalué pour les autres branches
• déclarer toutes les branches, ou terminer l'instruction CASE par une branche
WHEN OTHERS...
CASE decode IS
WHEN b"100" => key <= first;
WHEN b"010" => key <= second;
WHEN b"-01" => key <= third;
WHEN OTHERS => key <= none;
END CASE;

Cypress © 1994, 1996, 1998, 1999


59
Initiation à VHDL

Encore quelques
constructions utiles :

 Instruction Generate
 Paramètres Generic

Cypress © 1994, 1996, 1998, 1999


60
Initiation à VHDL

Instruction GENERATE
 Utilisée pour la génération répétitive d'instructions
(notamment de components)
 Exemple : registre série/parallèle :
LIBRARY ieee; si
USE ieee.std_logic_1164.ALL; clk
USE work.rtlpkg.ALL;
ENTITY sipo IS PORT ( po(31) po(0)
clk : IN STD_LOGIC;
si: IN STD_LOGIC;
po: INOUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END sipo;
USE WORK.rtlpkg.ALL;
ARCHITECTURE archsipo OF sipo IS
BEGIN
prem: dff PORT MAP (si, clk, po(31));
suiv: FOR i IN 0 TO 30 GENERATE
nxt: dff PORT MAP (po(i+1), clk, po(i));
END GENERATE;
END archsipo;
Cypress © 1994, 1996, 1998, 1999
61
Initiation à VHDL

Paramètre Generic
 Permet le passage de paramètres lors de l'appel d'un
component
 Exemple : multiplexeur 2-vers-1 à largeur variable
1- Description
entity mux is a t
generic (t : integer :=8); t
c
port (sel : in std_logic; b t
a,b : in std_logic _vector(0 to t-1);
c : out std_logic _vector(0 to t-1));
sel
end mux;
architecture archmux of mux is
c <= a when sel='0' else b;
end archmux;

Cypress © 1994, 1996, 1998, 1999


62
Initiation à VHDL

Paramètre Generic

2 - Utilisation

16
..... mbus
16
u0 : mux generic map (t=>16) 16 qbus
pbus
port map(s0, mbus, pbus, qbus)
.....

s0

Cypress © 1994, 1996, 1998, 1999


63
Initiation à VHDL

LPM
(Library Of Parametrized Modules)
 Standard 'de facto' pour la description de fonctions logiques classiques
 facilite la conversion schéma VHDL
 descriptions optimisées
 Utilise sur le paramétrage générique
 Exemple :
component mcompare
generic(lpm_width : positive;
lpm_representation : repre_type := LPM_UNSIGNED;
lpm_hint : goal_type := SPEED);
port(dataa : in std_logic_vector(lpm_width-1 downto 0);
datab : in std_logic_vector(lpm_width-1 downto 0);
alb : out std_logic;
aeb : out std_logic;
agb : out std_logic;
ageb : out std_logic;
aleb : out std_logic;
 Composants LPM : opérateurs logiques, registres,
aneb : out std_logic);multiplexeurs, décodeurs, fonctions
end component;
arithmétiques, RAM/ROM, etc...

Cypress © 1994, 1996, 1998, 1999


64
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


65
Initiation à VHDL

Conception modulaire et hiérarchique


VHDL supporte et encourage la conception modulaire
 Un niveau de description peut faire appel à des modules compilés
indépendamment, et les interconnecter de manière structurelle

COMPONENT 2
COMPONENT 1

 Les modules de niveaux inférieurs sont des COMPONENTs


 Si un COMPONENT est d'utilisation fréquente, il est commode
de le placer dans un PACKAGE
Cypress © 1994, 1996, 1998, 1999
66
Initiation à VHDL

Conception modulaire et hiérarchique


Description d'un comparateur 4 bits
1- Description comportementale (pour mémoire)

A 4
B 4
entity CMP4 is port(
A,B : in bit_vector(0 to 3); C
C : out bit);
end CMP4;

architecture ARCH_1 of CMP4 is


begin
C <= '1' when (A=B) else '0';
end ARCH_1;

Cypress © 1994, 1996, 1998, 1999


67
Initiation à VHDL

Conception modulaire et hiérarchique


2 - Description structurelle 'à plat' A 4
B 4

C
entity XNOR is port(x,y : in bit; xn : out bit); entity CMP4 is port(
end XNOR; A,B : in bit_vector(0 to 3);
architecture ARCH of XNOR is C : out bit);
begin end CMP4;
xn <= not(x xor y); architecture ARCH_2 of CMP4 is
end ARCH; signal i : bit_vector(0 to 3);
begin
entity AND4 is port(a,b,c,d : in bit; e : out bit); c0 : XNOR port map(A(0),B(0),i(0));
end AND4; c1 : XNOR port map(A(1),B(1),i(1));
architecture ARCH of AND4 is c2 : XNOR port map(A(2),B(2),i(2));
begin c3 : XNOR port map(A(3),B(3),i(3));
e <= a and b and c and d ; c4 : AND4 port map(i(0),i(1),i(2),i(3),C);
end ARCH; end ARCH_2;

Cypress © 1994, 1996, 1998, 1999


68
Initiation à VHDL

Conception modulaire et hiérarchique


3 - Description modulaire, sans package
entity CMP4 is port(
1- Les éléments de base sont décrits à part, et ré-utilisables A,B : in bit_vector(0 to 3);
2- Instanciation des éléments externes dans l'architecture principale C : out bit);
end CMP4;
entity XNOR is port(x,y : in bit; xn : out bit); architecture ARCH_2 of CMP4 is
end XNOR; signal i : bit_vector(0 to 3);
architecture ARCH of XNOR is component XNOR port(x,y : in bit; xn : out bit);
begin end component;
xn <= not(x xor y); component AND4 port(a,b,c,d : in bit; e : out bit);
end ARCH; end component;
begin
entity AND4 is port(a,b,c,d : in bit; e : out bit); c0 : XNOR port map(A(0),B(0),i(0));
end AND4; c1 : XNOR port map(A(1),B(1),i(1));
architecture ARCH of AND4 is c2 : XNOR port map(A(2),B(2),i(2));
begin c3 : XNOR port map(A(3),B(3),i(3));
e <= a and b and c and d ; c4 : AND4 port map(i(0),i(1),i(2),i(3),C);
end ARCH; end ARCH_2;

Cypress © 1994, 1996, 1998, 1999


69
Initiation à VHDL

Conception modulaire et hiérarchique


4 - Description modulaire avec package
package portes is 1- Les components sont inclus dans un package
component XNOR port(x,y : in bit; xn : out bit);
2- Déclaration d'accès aux éléments du package
end component;
component AND4 port(a,b,c,d : in bit; e : out bit);
end component; entity CMP4 is port(
end portes; A,B : in bit_vector(0 to 3);
C : out bit);
entity XNOR is port(x,y : in bit; xn : out bit); end CMP4;
end XNOR;
use work.portes.all;
architecture ARCH of XNOR is
begin
architecture ARCH_3 of CMP4 is
xn <= not(x xor y); signal i : bit_vector(0 to 3);
end ARCH; begin
c0 : XNOR port map(A(0),B(0),i(0));
entity AND4 is port(a,b,c,d : in bit; e : out bit); c1 : XNOR port map(A(1),B(1),i(1));
end AND4;
c2 : XNOR port map(A(2),B(2),i(2));
architecture ARCH of AND4 is
begin
c3 : XNOR port map(A(3),B(3),i(3));
e <= a and b and c and d ; c4 : AND4 port map(i(0),i(1),i(2),i(3),C);
end ARCH; end ARCH_3;

Cypress © 1994, 1996, 1998, 1999


70
Initiation à VHDL

Conception modulaire et hiérarchique


Conclusions :
 Les descriptions modulaires de haut niveau facilitent la lecture, la
mise au point, la simulation, la fiabilité
 La conception modulaire permet d'utiliser les composants de bas
niveau eventuellement fournis avec les outils logiciels
 Elle permet également d'utiliser des modules VHDL (développés par
les fabricants d'outil ou par les utilisateurs) : on peut alors parler de
description 'structurelle de haut niveau'.
 La description structurelle est la traduction textuelle directe de la
représentation schematique

Cypress © 1994, 1996, 1998, 1999


71
Initiation à VHDL

Initiation à VHDL

 Introduction
 Le cadre de travail
 La paire ENTITY/ARCHITECTURE
 Niveaux de description
 Fonctionnements parallèles et séquentiels
 Opérateurs et instructions
 Descriptions modulaires
 Attributs spécifiques

Cypress © 1994, 1996, 1998, 1999


72
Initiation à VHDL

Attributs VHDL
 Un attribut est une propriété (associée à une entity, une architecture,
un type, un signal, etc.) à laquelle peut être assignée une valeur.
 Certains attributs sont prédéfinis par le langage
• ex. : range abc : in std_logic_vector (7 downto 0);
def : in std_logic_vector abc'range;
 d'autres sont spécifiques des outils utilisés
• pour Warp :
• pin_numbers
• synthesis_off
• etc.
N.B. : Warp permet de placer les attributs dans un fichier de contrôle distinct du fichier VHDL,
de manière à laisser celui-ci indépendant du composant choisi.

Cypress © 1994, 1996, 1998, 1999


73
Initiation à VHDL

Attribut pin_numbers

 Utilisé pour connecter les Entrées/Sorties d'une


entity aux broches d'un composant
ENTITY counter IS PORT (
clk, rst: IN STD_LOGIC;
count: OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );
ATTRIBUTE pin_numbers OF counter: ENTITY IS
"clk:13 rst:2 " &
"count(3):3 count(2):4 count(1):5 count(0):6";
END counter;

Cypress © 1994, 1996, 1998, 1999


74
Initiation à VHDL

Attribut synthesis_off
 La synthèse d'une architecture amène certains signaux internes à
disparaître (leur équation étant fusionnée à d'autres)
 L'attribut synthesis_off appliqué à un signal permet de conserver sa
présence au terme de la synthèse
A
E
B G
C
F
D

Sans attribut 'synthesis_off' : Avec attribut 'synthesis_off' appliqué à E :


A A E=A.B
B B
G = (A.B) + (C.D)
C
D G= E + (C.D)
C
D

Cypress © 1994, 1996, 1998, 1999


75
Initiation à VHDL

synthesis_off : pourquoi ?

 Exemple : synthèse d'un comparateur 8 bits contrôlant un


multiplexeur 2-vers-1 de 4-bit :

C(7 downto 0)
comparateur
D(7 downto 0) 8 bits

A(3 downto 0)
mux X(3 downto 0)
B(3 downto 0)

Cypress © 1994, 1996, 1998, 1999


76
Initiation à VHDL

synthesis_off : exemple

 Sans attribut synthesis_off


C comparateur
ENTITY mux IS PORT ( 8 bits
D
a, b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); SEL

c, d: IN STD_LOGIC _VECTOR(7 DOWNTO 0);


A
x: OUT STD_LOGIC _VECTOR(3 DOWNTO 0)); X
B mux
END mux;

ARCHITECTURE archmux OF mux IS


SIGNAL sel: STD_LOGIC;
BEGIN
sel <= '1' WHEN (c = d) ELSE '0';
x <= a WHEN (sel = '1') ELSE b;
END archmux;

Cypress © 1994, 1996, 1998, 1999


77
Initiation à VHDL

synthesis_off : exemple
Equations générées (avec comparateur 4 bits seulement) : C comparateur
x(0) = b * c_0 * /d_0 8 bits
D
+ b * /c_0 * d_0
SEL
+ b * c_1 * /d_1
+ b * /c_1 * d_1
+ b * c_2 * /d_2 A
+ b * /c_2 * d_2 X
+ b * c_3 * /d_3 B mux
+ b * /c_3 * d_3
+ a * c_3 * c_2 * c_1 * /c_0 * d_3 * d_2 * d_1 * /d_0
+ a * /c_3 * c_2 * c_1 * /c_0 * /d_3 * d_2 * d_1 * /d_0
+ a * c_3 * /c_2 * c_1 * /c_0 * d_3 * /d_2 * d_1 * /d_0
+ a * /c_3 * /c_2 * c_1 * /c_0 * /d_3 * /d_2 * d_1 * /d_0
+ a * c_3 * c_2 * /c_1 * /c_0 * d_3 * d_2 * /d_1 * /d_0 id. pour x(1), x(2), x(3)
+ a * /c_3 * c_2 * /c_1 * /c_0 * /d_3 * d_2 * /d_1 * /d_0
+ a * c_3 * /c_2 * /c_1 * /c_0 * d_3 * /d_2 * /d_1 * /d_0
+ a * /c_3 * /c_2 * /c_1 * /c_0 * /d_3 * /d_2 * /d_1 * /d_0
+ a * c_3 * c_2 * c_1 * c_0 * d_3 * d_2 * d_1 * d_0
+ a * /c_3 * c_2 * c_1 * c_0 * /d_3 * d_2 * d_1 * d_0
+ a * c_3 * /c_2 * c_1 * c_0 * d_3 * /d_2 * d_1 * d_0
+ a * /c_3 * /c_2 * c_1 * c_0 * /d_3 * /d_2 * d_1 * d_0
+ a * c_3 * c_2 * /c_1 * c_0 * d_3 * d_2 * /d_1 * d_0
+ a * /c_3 * c_2 * /c_1 * c_0 * /d_3 * d_2 * /d_1 * d_0
+ a * c_3 * /c_2 * /c_1 * c_0 * d_3 * /d_2 * /d_1 * d_0
+ a * /c_3 * /c_2 * /c_1 * c_0 * /d_3 * /d_2 * /d_1 * d_0

Le synthétiseur exprime l'équation des sorties à partir des entrées

Cypress © 1994, 1996, 1998, 1999


78
Initiation à VHDL

synthesis_off : exemple

 Avec synthesis_off
C comparateur
ENTITY mux IS PORT ( 8 bits
D
a, b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); SEL

c, d: IN STD_LOGIC _VECTOR(7 DOWNTO 0);


A
x: OUT STD_LOGIC _VECTOR(3 DOWNTO 0)); X
B mux
END mux;

ARCHITECTURE archmux OF mux IS


SIGNAL sel: STD_LOGIC;
ATTRIBUTE synthesis_off OF sel:SIGNAL is TRUE;
BEGIN
sel <= '1' WHEN (c = d) ELSE '0';
x <= a WHEN (sel = '1') ELSE b;
END archmux;

Cypress © 1994, 1996, 1998, 1999


79
Initiation à VHDL

synthesis_off : exemple
Equations générées (avec comparateur complet 8 bits)

C comparateur
8 bits
D
/sel = c_0 * /d_0 + /c_0 * d_0 + c_1 * /d_1 + /c_1 * d_1 SEL
+ c_2 * /d_2 + /c_2 * d_2 + c_3 * /d_3 + /c_3 * d_3
+ c_4 * /d_4 + /c_4 * d_4 + c_5 * /d_5 + /c_5 * d_5 A X
+ c_6 * /d_6 + /c_6 * d_6 + c_7 * /d_7 + /c_7 * d_7 mux
B

x_3 = /sel * b_3 + sel * a_3

x_2 = /sel * b_2 + sel * a_2

x_1 = /sel * b_1 + sel * a_1

x_0 = /sel * b_0 + sel * a_0

Cypress © 1994, 1996, 1998, 1999


80
Initiation à VHDL

synthesis_off : exemple

 Ressources utilisées :
 sans synthesis_off
• 1092 termes produits, 72 macrocellules
 avec synthesis_off
• 24 termes produits , 5 macrocellules
 Attention : l'emploi de l'attribut synthesis_off peut, en
maintenant l'existence de signaux intermédiaires,
entrainer une dégradation de la performance

Cypress © 1994, 1996, 1998, 1999


81
Initiation à VHDL

Les outils Cypress :

Warp2

Cypress © 1994, 1996, 1998, 1999


82
Initiation à VHDL

Warp2
Report File
(modèles pour
simulation externe)

(Config. file) Aldec


Simulation temporelle
.JED

VHDL Text Galaxy


Synthèse

(Programmation)
FSM editor

(InSRkit)

Cypress © 1994, 1996, 1998, 1999


83
Initiation à VHDL

Warp2
Warp2 s'intègre également dans des environnements CAO généralistes : Viewlogic, Exemplar,
Mentor, Cadence, Synopsys, etc.

Exemple : Viewlogic VHDL Entry


Viewdraw
Schematic Entry

SpeedWave or VCS
Viewlogic
Source-level
Warp2 Simulation

Warp
Synthesis

Warp
Fitting

Jedec/Jam VHDL, Verilog


ViewSim, SpeedWave
Programming File or 3rd Party
or VCS
Simulation models

Cypress © 1994, 1996, 1998, 1999


84

Вам также может понравиться