Академический Документы
Профессиональный Документы
Культура Документы
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
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
Non :
VHDL, qu'est-ce ?
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
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
Commentaires et identificateurs
ou :
signal CLK: bit; -- horloge systeme
VHDL ne fait pas de différence, pour les identificateurs et les mots-clés, entre
majuscules et minuscules :
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"
a
Entity et Architecture
Toute description VHDL simple peut être faite sans autre connaissance
qu'Entity et Architecture
ENTITYs
ARCHITECTUREs
PACKAGEs
(COMPONENTs)
Library X Library Y
Library WORK
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
L'Entity
Nom
rst
q[7:0
Entrées/Sorties
d[7:0] BOITE_NOIRE
co
clk
PORTS : Modes
Le MODE correspond au sens de transfert :
IN Entrée (monodirectionnelle)
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);
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;
MODE TYPE
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
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
1- Description comportementale
A
C
Comparateur
Comparateur
B
architecture ARCH1 of COMPARATEUR is
begin
C <= '1' when (A=B) else '0';
end ARCH1;
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);
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';
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
Parallèle / Séquentiel
A
C
VHDL permet de décrire aussi bien des B
Comparateur 0
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
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;
Parallèle / Séquentiel
Le standard IEEE-1164 permet l'emploi des fonctions
rising_edge(signal)
falling_edge(signal)
exemple :
Parallèle / Séquentiel
Attention : dans un PROCESS, les sorties ne sont ré-actualisées qu'à
la fin du process
Parallèle / Séquentiel
Pour corriger le fonctionnement précédent :
• Première possibilité : anticiper la génération de RETENUE
Parallèle / Séquentiel
Pour corriger le fonctionnement précédent :
• Deuxième possibilité : générer RETENUE de manière combinatoire
(hors process)
Parallèle / Séquentiel
Au concepteur de choisir la description la plus appropriée :
RETENUE RETENUE
CLK
CLK
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
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;
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)
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
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;
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
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.
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;
Quelques exemples
Assignation conditionnelle, combinatoire
Quelques exemples
Assignation conditionnelle, séquentielle : instruction if
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;
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;
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
Mémorisation implicite:
Exemple de spécification incomplète
A
enable
Si la fonction ci-contre est décrite par B C
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;
Encore quelques
constructions utiles :
Instruction Generate
Paramètres Generic
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;
Paramètre Generic
2 - Utilisation
16
..... mbus
16
u0 : mux generic map (t=>16) 16 qbus
pbus
port map(s0, mbus, pbus, qbus)
.....
s0
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...
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
COMPONENT 2
COMPONENT 1
A 4
B 4
entity CMP4 is port(
A,B : in bit_vector(0 to 3); C
C : out bit);
end CMP4;
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;
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
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.
Attribut pin_numbers
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
synthesis_off : pourquoi ?
C(7 downto 0)
comparateur
D(7 downto 0) 8 bits
A(3 downto 0)
mux X(3 downto 0)
B(3 downto 0)
synthesis_off : exemple
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
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
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
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
Warp2
Warp2
Report File
(modèles pour
simulation externe)
(Programmation)
FSM editor
(InSRkit)
Warp2
Warp2 s'intègre également dans des environnements CAO généralistes : Viewlogic, Exemplar,
Mentor, Cadence, Synopsys, etc.
SpeedWave or VCS
Viewlogic
Source-level
Warp2 Simulation
Warp
Synthesis
Warp
Fitting