Intro Synthese VHDL
Intro Synthese VHDL
Intro Synthese VHDL
V.H.D.L.
SOMMAIRE
I) INTRODUCTION. .................................................................................................... 2
II) RELATION ENTRE UNE DESCRIPTION VHDL ET LES CIRCUITS LOGIQUES
PROGRAMMABLES. ................................................................................................. 3
II.1) SCHMA FONCTIONNEL DIMPLANTATION DE DESCRIPTIONS VHDL DANS UN CIRCUIT LOGIQUE
PROGRAMMABLE. ................................................................................................................................... 3
II.2) LAFFECTATION DES BROCHES DENTRES SORTIES. ........................................................................ 3
II.3) ORGANISATION FONCTIONNELLE DE DVELOPPEMENT DUN PLD. ..................................................... 4
page 2
S1
BLOC
VHDL N1
BLOC
VHDL N2
BLOC
VHDL N4
S2
E3
S3
BLOC
VHDL N5
Synchro
BLOC
VHDL N3
S4
E4 (CLK)
page 3
U10
1
CLK
U15
CLK
67
Q3
IB1 1
Q2
Q1
Q0
U16
OB11
U17
OB11
U18
OB11
2
3
Q3
2
4
Q2
2
5
Q1
2
6
Q0
2
78
ROUGE1
2
13
ROUGE2
2
76
VE RT1
2
11
VE RT2
2
77
ORANG E1
2
12
ORANG E2
OB11
COMPTEURP
U19
U23
3
INV
U20
4
OB11
NAND2
U22
U24
2
NAND3
U21
U26
3
U28
U30
2
2
INV
NAND2
OB11
NAND2
1
U27
U29
U31
2
INV
OB11
NAND2
A
U32
INV
START='0'
IDLE
OB11
NAND2
U25
RESET='1'
library IEEE;
use IEEE.std_logic_1164.all;
use
IEEE.STD_LOGIC_UNSIGNED.all;
U37
U35
2
5
OB11
1
2
3
START='1'
START='1'
U36
1
U38
START='0'
OB11
AND4
entity CNT_4B is
port (
CLK: in STD_LOGIC;
RESET: in STD_LOGIC;
ENABLE: in STD_LOGIC;
AND4
Entre schmatique
Entre syntaxique
langages:
- VHDL
VHDL
VHDL
Diagrammes dtats
VHDL
STIMULI ou
TESTBENCH
Simulation
comportementale
VHDL
SYNTHETISEUR
SYNTHETISEURS CONNUS:
-FPGA Expres (Synosys).
-EXEMPLAR (Exemplar).
-SYNPLICITY (Synplicity).
VITAL, VHDL
STIMULI ou
TESTBENCH
Simulation aprs
synthse
EDIF, XNF
Outils de placement et
routage interne au
circuit. Cet outil est
propre chaque
fabriquant
Optimisation
Placement / routage
dans le circuit choisi
Simulation temporelle
JEDEC
La programmation du circuit
peut se faire soit:
- En utilisant un
programmateur.
- En tlchargement le code
JEDEC directement sur
lobjet technique (JTAG ou
ISP)
CIRCUIT
FPGA
CPLD
page 4
library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
IN0
D0
entity DEMUX2_4 is
port(IN0, IN1: in std_logic;
D0, D1, D2, D3: out std_logic);
end DEMUX2_4;
IN1
D1
D2
D3
demux42
U1
U2
3
INV
D0
AND2
1
U3
U4
3
INV
D1
AND2
1
U5
3
D2
AND2
1
U6
3
2
AND2
page 5
D3
);
Remarque : Aprs la dernire dfinition de signal de linstruction port il ne faut jamais mettre de point virgule.
page 6
NOM_DU_SIGNAL
: sens
type;
Exemple:
BUS
CLOCK: in
std_logic;
: out
std_logic_vector(7 downto 0);
out
in
inout
buffer
III.2.3) Le TYPE.
Le TYPE utilis pour les signaux dentres / sorties est :
- le std_logic pour un signal.
- le std_logic_vector pour un bus compos de plusieurs signaux.
Par exemple un bus bidirectionnel de 5 bits scrira :
LATCH : inout std_logic_vector (4 downto 0) ;
O LATCH(4) correspond au MSB et LATCH(0) correspond au LSB.
Les valeurs que peuvent prendre un signal de type std_logic sont :
- 0 ou L : pour un niveau bas.
- 1 ou H : pour un niveau haut.
- Z
: pour tat haute impdance.
- -
: Quelconque, cest dire nimporte quelle valeur.
S.T.S. GRANVILLE P.L.s
page 7
:
:
:
:
:
:
:
:
:
page 8
in std_logic; CNT:
entity MAGNITUDE is
port( A, B: in std_logic_vector(7 downto 0);
AGRB: buffer std_logic));
end MAGNITUDE;
entity 7SEG is
port (
A
B
C
D
SA
SB
SC
SD
SE
SF
SG
end 7SEG;
:
:
:
:
:
:
:
:
:
:
:
in std_logic;
in std_logic;
in std_logic;
in std_logic;
out std_logic;
out std_logic;
out std_logic;
out std_logic;
out std_logic;
out std_logic;
out std_logic;
entity IMAGE3 is
port (CLK : in std_logic; S,I : out std_logic);
end IMAGE3;
entity COMP4BIT is
port (A,B :in std_logic_vector(3 downto 0);
PLUS,MOINS,EGAL :out std_logic);
end COMP4BIT;
entity COMPT_4 is
port (H,R :in std_logic;
Q :out std_logic_vector(3 downto 0));
end COMPT_4;
entity DECAL_D is
port (H,R,IN_SERIE :in std_logic;
OUT_SERIE :out std_logic);
end DECAL_D;
page 9
page 10
<=
<=
<=
<=
<=
'0'
'0'
'0'
'0'
'0'
when
when
when
when
when
(ADRESSE
(ADRESSE
(ADRESSE
(ADRESSE
(ADRESSE
>=
>=
>=
>=
>=
x"E000")
x"0000")
x"0400")
x"0800")
x"0D00")
and
and
and
and
and
(ADRESSE
(ADRESSE
(ADRESSE
(ADRESSE
(ADRESSE
<=
<=
<=
<=
<=
x"FFFF")
x"03FF")
x"07FF")
x"0CFF")
x"0FFF")
else
else
else
else
else
'1';
'1';
'1';
'1';
'1';
INTER1 <= '0' when (ADRESSE >= x"8000") and (ADRESSE <= x"8001") else '1';
INTER2 <= '0' when (ADRESSE >= x"A000") and (ADRESSE <= x"A001") else '1';
INTER3 <= '0' when (ADRESSE >= x"C000") and (ADRESSE <= x"C00F") else '1';
end DESCRIPTION;
page 11
U1
U2
3
INV
D0
AND2
IN1
U3
U4
3
INV
D1
AND2
1
U5
3
D2
AND2
1
U6
3
D3
AND2
page 12
Remarque : La base dcimale ne peut pas tre utilise lors de laffectation de signaux. On
peut seulement lutiliser avec certains oprateurs, comme + et pour raliser des compteurs (voir le chapitre sur les compteurs).
Exemple:
Library ieee;
Use ieee.std_logic_1164.all;
entity AFFEC is
port (
E1,E2
BUS1,BUS2,BUS3
S1,S2,S3,S4
end AFFEC;
: in std_logic;
: out std_logic_vector(3 downto 0);
: out std_logic);
'1'; -- S1 =
'0'; -- S2 =
E1; -- S3 =
'1' when (E2
1
0
E1
='1') else 'Z'; -- S4 = 1 si E1=1 sinon S4
-- prend la valeur haute impdance
BUS1 <= "1000";
-- BUS1 = "1000"
BUS2 <= E1 & E2 & "10";
-- BUS2 = E1 & E2 & 10
BUS3 <= x"A";
-- valeur en HEXA -> BUS3 = 10(dc)
end DESCRIPTION;
page 13
Valeur de A
"001"
Valeur de B
"110"
VHDL
and
nand
or
nor
xor
xnor
not
sll
srl
rol
ror
Exemples :
S1 <= A sll 2 ;
S2 <= A rol 3 ;
-- S3 = R
Remarque : Pour raliser des dcalages logiques en synthse logique, il est prfrable dutiliser les instructions suivantes :
Dcalage droite :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= 0 & A(7 downto 1); -- dcalage dun bit droite
S1 <= "000" & A(7 downto 3); -- dcalage de trois bits droite
Dcalage gauche :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= A(6 downto 0) & 0; -- dcalage dun bit gauche
S1 <= A(4 downto 0) & "000"; -- dcalage de trois bits gauche
page 14
VHDL
+
*
/
Remarque N1 : Pour pouvoir utiliser les oprateurs ci-dessus il faut rajouter les bibliothques suivantes au dbut du fichier VHDL:
Use ieee.numeric_std.all ;
Use ieee.std_logic_arith.all ;
Exemples :
S1 <= A 3 ; -- S1 = A 3
-- On soustrait 3 la valeur de lentre / signal A
S1 <= S1 + 1 ; -- On incrmente de 1 le signal S1
Remarque N2 : Attention lutilisation de ces oprateurs avec des signaux comportant un nombre de bits important peut gnrer de grandes structures lectroniques.
Exemples :
S1 <= A * B ;-- S1 = A multipli par B : A et B sont cods sur 4 bits
S2 <= A / B ;-- S2 = A divis par B : A et B sont cods sur 4 bits
page 15
VHDL
=
/=
<
<=
>
>=
page 16
Exemple N2 :
-- Structure volue dun
S2 <= E1 when (SEL="00" )
E2 when (SEL="01" )
E3 when (SEL="10" )
E4 when (SEL="11" )
else 0;
multiplexeur 4 vers 1
else
else
else
SEL[1:0]
S2
E2
E4
E1
page 17
4 vers 1
when
when
when
when
when
"00",
"01",
"10",
"11",
others;
Remarque: when others est ncessaire car il faut toujours dfinir les autres cas du
signal de slection pour prendre en compte toutes les valeurs possibles de celui-ci.
Schma correspondant aprs synthse:
E3
SEL[1:0]
S2
E2
E4
E1
Lquation logique ci-dessus donne aussi le mme schma, mais elle est peu comprhensible, cest pourquoi on prfre des descriptions de plus haut niveau en utilisant les
instructions VHDL volues.
page 18
S2
SEL[1:0]
SEL[1:0]
SEL[1:0]
E2
SEL[1:0]
SEL[1]
SEL[1:0]
SEL[1:0]
SEL[1]
SEL[1:0]
S2
SEL[0]
E1
page 19
SEL[1:0]
SEL[1:0]
SEL[1]
S2
E2
SEL[1:0]
page 20
Lassignation slective
case signal_de_slection is
when valeur_de_slection => instructions
[when others => instructions]
end case;
Exemple:
case SEL is
when 000 => S1 <= E1;
when 001 => S1 <= 0;
when 010 | 011 => S1 <=1;
-- La barre | permet de raliser
-- un ou logique entre les deux
-- valeurs 010 et 011
when others => S1 <= 0;
end case;
page 21
CLK
Commentaires
FD11
- Seul le signal CLK fait partie de la liste de sensibilit. Daprs les rgles de fonctionnement
nonces prcdemment, seul un changement dtat du signal CLK va dclencher le process et par consquent valuer les instructions de celui-ci.
- Linstruction if (CLK'event and CLK='1') then permet de dtecter un front
montant du signal CLK. La dtection de front est ralise par lattribut event appliqu
lhorloge CLK. Si on veut un dclenchement sur un front descendant, il faut crire
linstruction suivante : if (CLK'event and CLK='0').
- Les bibliothques IEEE possdent deux instructions permettant de dtecter les fronts
montants ) rising_edge(CLK) ou descendants falling_edge(CLK).
- Si la condition est remplie alors le signal de sortie S sera affect avec la valeur du signal
dentre D.
page 22
: in std_logic;
: out std_logic);
RESET
RESET + SET
SET
SET
RESET . ( D + SET )
D
RESET + D
D
CLK
FD11
page 23
: in std_logic;
: out std_logic);
D + SET
RESET
SET
PS
D
CLK
S . SET + D . SET
CD
FD41
RESET
S . SET
Commentaire
Lentre RESET est prioritaire sur lentre SET qui est son tour prioritaire sur le front montant de lhorloge CLK. Cette description est asynchrone car les signaux dentre SET et
RESET sont mentionns dans la liste de sensibilit du process.
page 24
: in std_logic;
: out std_logic);
CLK
D
FD11
Commentaires :
La description ci-dessus fait appel un signal interne appel S_INTERNE, pourquoi faire
appel celui-ci ? La rponse est que le signal S est dclar comme une sortie dans lentit,
et par consquent on ne peut pas utiliser une sortie en entre.
Pour contourner cette difficult on utilise un signal interne qui peut tre la fois une entre
ou une sortie. Avec cette faon dcrire, les signaux de sortie dune description ne sont jamais utiliss comme des entres. Cela permet une plus grande portabilit du code.
Si on ne dclare pas de signal interne, le synthtiseur renverra certainement une erreur du
type : Error, cannot read output: s; [use mode buffer or inout].
Le synthtiseur signale quil ne peut pas lire la sortie S et par consquent, celle-ci doit tre
du type buffer ou inout.
page 25
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity BASCULET is
port (
D,CLK
S
end BASCULET;
entity BASCULET is
port (
D,CLK
S
end BASCULET;
: in std_logic;
: inout std_logic);
: in std_logic;
: buffer std_logic);
BI11
U2
CL
IB11
U3
CLK
FD1
U5
IB11
U2
3
2
IB11
U1
OB11
2
IB11
FD11
Commentaires :
Commentaires :
On peut constater que S est bien du type On peut constater que S est bien du type buffer.
inout.
page 26
Commentaires :
La description ci-dessus est trs simple. Le dclenchement du process se fera sur un changement dtat du signal CLOCK, lincrmentation de la sortie Q se
fera sur le front montant de lhorloge CLOCK.
Cette description fort simple, appelle quelques commentaires :
Lincrmentation du compteur est ralise par loprateur + associ la
valeur 1. Cela est logique, mais elle lest beaucoup moins pour les PLDs et
les synthtiseurs, pourquoi ? La rponse est que les entres et sorties ainsi
que les signaux sont dclars de type std_logic
ou
std_logic_vector, et par consquent on ne peut pas leur associer de
valeur entire dcimale.
page 27
Le signal Q est dclar dans lentit de type inout, cela est logique car il
est utilis la fois comme entre et comme sortie pour permettre
lincrmentation du compteur. Ce type dcriture est peu utilis car elle ne
permet pas au code dtre portable, on prfra utiliser un signal interne,
celui-ci peut tre la fois une entre et une sortie.
end DESCRIPTION;
page 28
Quelle diffrence entre les deux descriptions ? Dans la deuxime le signal RESET
nest plus dans la liste de sensibilit, par consquence le process ne sera dclench que
par le signal CLOCK. La remise zro ne se fera que si un front montant sur CLOCK a lieu.
page 29
page 30
page 31
page 32
page 33
page 34
-- Affectation automatique
attribute pldtype : string;
-- dfinition de lattribut Type de broche
attribute pldtype of HORLOGE : signal is "CLOCK";
-- ne pas confondre avec IN
attribute pldtype of ENTREE : signal is "IN";
attribute pldtype of SORTIE : signal is "OUT";
attribute pldtype of ENTREESORTIE : signal is "IO"; -- ne pas confondre avec INOUT
attribute pldtype of VALIDATION : signal is "EN";
attribute pldtype of A,B,C : signal is "IN"; -- signaux simples ou bus de mme type
attribute pldtype of D,E,F : signal is "IO"; -- signaux simples ou bus de mme type
Affectation manuelle des broches dun SPLD
-- Affectation manuelle
attribute pldpin : string;
-- dfinition de lattribut Numro de broche
attribute pldpin of NOMSIGNAL: signal is "1";
-- une seule broche
attribute pldpin of NOMBUS: signal is "23,22,21,20";
-- LSB en premier !
end NOMENTITE;
page 35
Dbut de
lArchitecture
Affectation
simple
Sortie
Sortie
Sortie
autres
vaut Entree0
vaut Entree1
vaut Entree2
cas
-- partie Squentielle
process (SIGNAL1, SIGNAL2,... )
begin
if SIGNAL1'event and SIGNAL1 = '1' -- dtection dun front montant sur Signal1
then if NOMAUX >= x"9"
-- test dingalit
then NOMAUX <= x"0";
-- affectation simple
else NOMAUX <= NOMAUX + 1;
-- incrmentation et affectation (autoris
end if; -- seulement avec la librairie ieee.std_logic_unsigned.all)
end if;
Assignation Slective : case ... is ... when...
case ENTREECOMMANDE is -- signal de slection
when "00" => SORTIE <= ENTREE0; --quand EntreeCommande =
when "01" => SORTIE <= ENTREE1; --quand EntreeCommande =
when "10" => SORTIE <= ENTREE2; --quand EntreeCommande =
wheN others => SORTIE <= ENTREE3; --dans les autres cas,
end case;
end process ;
end NOMARCHITECTURE;
-- REMARQUES
-- Valeurs Numriques
-- '1' : binaire pour un bit
-- "11" : binaire pour un bus
-- x"11" : heXadcimal pour un bus
-- 11 : dcimal (ne peut pas sappliquer tous les types de signaux)
-- Tests
-- = gal
/= diffrent
-- >= suprieur ou gal
< infrieur
<= infrieur ou gal
>
suprieur
page 36