Vous êtes sur la page 1sur 45

VHDL

Structures de bases
Synthse doprateurs standards

Prsentation

Electronique reprogrammable
Apparition des premiers circuits vers les annes 70: premiers PLD-> PAL,
GAL
Evolution vers composants plus complexes: CPLD, FPGA
Diffrentes technologies pour la programmation des connexions
Permanents , Volatiles statiques, Volatiles
Capacit de programmation In-Situ
composants dits ISP via interface JTAG

Contexte de comptitivit mondiale


Importance du Time-To-Market

Connexions programmables
Introduction
Deux formes canoniques pour les quations logiques
Somme de produits S=a.b+ c.d
Produits de somme
S=(z+f).(e +x)

Connexions programmables
ET cabl
Reprsentation
standard

OU cabl

Constitution dun rseau


programmable

xPLD
Simple Programme Logic Device
Composants simples
rseau ET/OU programmable ou fixe
PAL (OTP en gnral), GAL reprogrammable

Diffrentes familles en
fonction des ressources
rajouts par le constructeurs

FPGA
Field Programmable Grid Array
Granularit plus fine que les CPLD ( macrocellules - complexes mais + nombreuses)
Intgration matrielle de composants supplmentaires

RAM: appel LUT (Look-Up Table)


Mutiplexeurs divers
PLL
Multiplieurs cbls (FPGA haut de gamme => concurrence avec les DSP)

Rseau de routage rparti ( non centralis contrairement aux CPLD)


Rpartition des applications
Source Altera

Exemple de rfrence
Famille Cyclone (FPGA Low Cost
dALTERA)
Concurrent: Spartan3 (chez Xilinx)

FPGA
La carte DE2 (utilis en TP)

Specifications
FPGA
Cyclone II EP2C35F672C6 FPGA and
EPCS16 serial configuration device
I/O Devices
Built-in USB Blaster for FPGA configuration
10/100 Ethernet, RS-232, Infrared port
Video Out (VGA 10-bit DAC)
Video In (NTSC/PAL/Multi-format)
USB 2.0 (type A and type B)
PS/2 mouse or keyboard port
Line-in, Line-out, microphone-in
(24-bit audio CODEC)
Expansion headers (76 signal pins)
Memory
8-MB SDRAM, 512-KB SRAM, 4-MB Flash
SD memory card slot
Switches, LEDs, Displays, and Clocks
18 toggle switches
4 debounced pushbutton switches
18 red LEDs, 9 green LEDs
Eight 7-segment displays
16 x 2 LCD display
27-MHz and 50-MHz oscillators, external SMA clock input

VHDL introduction
Programmation ou description?
Les objectifs du langage VHDL
Conception de circuits intgrs reconfigurable ou non (ASIC, FPGA) :
SYNTHESE
Mise au point de modle de simulations numriques (circuits virtuels) :
MODELISATION

Le langage est capable de DECRIRE


des comportements CONCURRENTS ( // )
Des comportements squentiels

Synthse ou modlisation

Les deux portes


travaillent en //

Nous nous
focaliserons
dans ce cours
la synthse
uniquement

Notre cible en
TP: FPGA
Cyclone 2 sur
la carte DE2

VHDL: concepts de base


Structure gnrale
Votre fichier texte de
description: xxx.vhd

Mode transfert des


signaux de votre

entity

Flot de conception
Un outils de dveloppement: Quartus II dAltera

VHDL: concepts de base


Mthodologie de conception
Guide pratique du dbutant
Dcomposition du cahier des charges en fonctions lmentaires
Classification de la fonction
COMBINATOIRE: instructions dites concurrentes
SEQUENTIELLE: utilisation dun PROCESS

Logique combinatoire

Logique squentielle

La sortie ne dpend pas de ltat pass

La sortie dpend de son tat pass

Un vecteur dentre = un vecteur de sortie unique

Systme ncessitant une horloge (systmes dits


synchrones)

Des exemples:
Multiplexeurs
Additionneurs
Dcodeur 7 segements
Encodeurs de priorit

Des exemples:
Compteurs
Registres dcalage
Machine dtat (automate)

10

VHDL: concepts de base


Les questions se poser
On identifie les fonctions et on les dessine sur papier
On repre et nomme les entres de chaque blocs ( on vite dutiliser les
mmes noms)
On rpertorie les signaux INTERNES (mot cl SIGNAL)
Le bloc est-il combinatoire ou squentiel?
Si squentiel alors description avec le mot cl PROCESS + instructions
autorises

Le bloc est-il utilis plusieurs fois


Si oui il vaut mieux crer un composant (entity+ architecture)
Sinon
le bloc
estporte
synthtiser
pardesles
Exemple:
faire une
ET 4entre avec
ET lignes
2 entres de codes directement
Voir page 12
pour plus de
dtails

Il faut un
SIGNAL

ET4 est un
composant
(entity+architecture)

On crera 1 composant
ET2 (entity+architecture)
Utilis 3 fois pour dcrire
ET4

11

VHDL: concepts de base


Un autre exemple: Horloge BCD 2 digits
Blocs dcodeurs 7 segments - combinatoire
Blocs compteurs squentiel
Les Blocs compteurs sont cascad pour la propagation de la retenue
Aprs 9 jai 0 avec un de retenue! Affichage 10
Ce fil ne sort pas du composant de plus
haut niveau: on le dclarera
SIGNAL FILS: bit_vector(3 downto 0);

Squentiel donc process


COMPT:
PROCESS(CLK)
Begin
.
END PROCESS;

Sorties pilotant
les Leds de
lafficheur 1

12

VHDL: concepts de base


Les librairies
Facilite la tche du concepteur
Rajout de fonctionnalits supplmentaires

La librairie IEEE
A mettre au dbut de votre description
Pour rajouter les types tendues std_logic et std_logic_vector
use IEEE.STD_LOGIC_1164.all;

DORENAVANT nous remplacerons SYSTEMATIQUEMENT


BIT par STD_LOGIC
BIT_VECTOR par STD_LOGIC_VECTOR

Pour utiliser des fonctions arithmtiques sur ces STD_LOGIC_VECTOR


USE IEEE.NUMERIC_STD.ALL;
Et aussi USE IEEE.std_logic_arith.all;
Exemples
Applicatifs

Q<=Q+1; -- Q tant par exemple un std_logic_vector et 1 est un entier!!


A<B -- A et B des std_logic_vector
oData<=CONV_STD_LOGIC_VECTOR(TEMP,8); avec TEMP integer range 0 to 255;

13

VHDL: concepts de base


Complment sur les oprations arithmtiques

Le rajout de use IEEE.numeric_std.all; permet


De travailler avec des valeurs signes et non signes

signal A,B: signed(3 downto 0);


signal tempo: unsigned(3 downto 0);

De convertir un std_logic_vector en signed ou unsigned

A<= signed(SW(3 downto 0));


B<=unsigned(RES);

IEEE.std_logic_unsigned.all et
IEEE.std_logic_arith.all sont danciennes
bibliothques

Ne pas mettre en mme temps:

IEEE.numeric_std.all;
De convertir des signed ou unsigned en std_logic_vector
IEEE.std_logic_arith.all;
LEDG(3 downto 0)<=std_logic_vector(tempo);
De redimensionner des vecteurs

Permet dtendre le bit de signe correctement!


signal A,B: signed(LARG downto 0);
A<= resize(signed(SW(LARG downto 1)),LARG+1);

Prfrez lemploi de IEEE.numeric_std.all;

De travailler avec les oprateurs arithmtiques standart

>, >=, =<,<, + ,- etc.

Alternative resize
A<=resize(signed(SW(LARG downto 1)),LARG+1);

Le rajout de use IEEE.std_logic_unsigned.all; permet

De travailler avec les oprateurs arithmtiques standart Recopie du bit bit de poids forts
A<= A(3)&A
de mlanger des entiers avec des std_logic_vector: A<= A +1;

14

VHDL: concepts de base


Littraux

Caractres: 0, x,a,%
Ne pas confondre 1 bit
Chanes: 11110101,xx,bonjour,$@&
Chanes de bits: B0010_1101, X 2D, O 055 exemple 0 ou 1
Dcimaux:27, -5, 4e3, 76_562, 4.25
Avec un vecteur de bits
Bass: 2#1001#, 8#65_07, 16#C5#e2
11 ou 1101110

Les oprateurs
Logiques (boolean, bit, std_ulogic)
AND, OR, NAND, NOR, XOR, NOT

Un bus (ou ensemble de


fils lectrique) est
reprsent sous forme
dun vecteur de bits

Relationnels ( retournent un boolean)


= /= < <= > >=

Arithmtiques
+ -

** MOD

REM

Concatnations dlments de tableaux &


"bon" & "jour" => "bonjour"

STD_LOGIC_VECTOR (3 DOWNTO 0);

15

Logique combinatoire: Instructions concurrentes


Assignation simples
Exemple 1
library IEEE;
use IEEE.std_logic_1164.all;
--librairie pour inclure type std_logic
--portes ET
--3 entres E2 E1 E0
Bit Poid
-- 1 sortie S0
Bit Poid
faible
entity ET3 is
Fort
port(
E:IN std_logic_vector(2 downto 0);
S:OUT std_logic
);
end ET3;
--definition de l'architecture
architecture arch_ET3 of ET3 is
begin
S<=E(2) and E(1) and E(0); -- E(2) accs au fil 2
end arch_ET3;

Exemple 2
library IEEE;
use IEEE.std_logic_1164.all;
entity example is
port(
E:IN std_logic_vector(2 downto 0);
S1:OUT std_logic; --1 fil
S2,S3:OUT std_logic_vector(3 downto 1); --3 fils
S1[3:1]
S4:OUT std_logic_vector(2 downto 0)
);
end example;
--definition de l'architecture
architecture arch_example of example is
begin
S1<='0';
S2<='1'& E(1 downto 0);
-- operateur COLLER (ou CONCATENE)
-- S2(3)
S2(2)
S2(1)
-- '1'

E(1)

&

E(0)

S3<="101";
S4<= "111" XOR E; --manip sur les bus directement
end arch_example;

16

Logique combinatoire: Instructions concurrentes


Assignation conditionnelle

signal <=

Structure WHEN/ELSE
---- Solution 1: with WHEN/ELSE ------------2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 --------------------------------------------5 ENTITY encoder IS
6 PORT ( x: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
7 y: OUT STD_LOGIC_VECTOR (1 DOWNTO 0));
8 END encoder;
9 --------------------------------------------10 ARCHITECTURE encoder1 OF encoder IS
11 BEGIN
12 y <= "00" WHEN x="0001" ELSE
13
"01" WHEN x="0010" ELSE
14
"10" WHEN x="0100" ELSE
15
"11" WHEN x="1000" ELSE
20
"ZZZ";
21 END encoder1;
22 ---------------------------------------------

signal1 when expresion_boolnne else

signal1xx when expresion_boolnne else


signal par dfaut;

Exemple dapplication:
encodeur clavier pour PIC
Intrt: rduire le nombre dentre du PIC

17

Logique combinatoire: Instructions concurrentes


Assignation slective

with expression select


signal1 <= signal1when valeur 1,
signal2 when valeur2,
-----signal par dfaut when others ;
Le multiplexeur: on aiguille une enre vers la
sortie en fonction dun numro daiguillage
MUX
1 voie parmi 4

Autre possibilt:
std_logic_vector(1 downto 0)

18

Logique combinatoire: Instructions concurrentes


Instanciation (placement) de composants dj cres
Dcoupage de votre projet en fonctions: cration de composants
adquats
Assemblage des composants crs pour structurer votre projet
Analogie avec ORCAD: on choisit
MOT CLE: PORTMAP
un composant de la bibliothque en
Ma Rfrence :port map ( liste ordonne de signaux) ;

ou

Ma Rfrence : port map ( port=> signal , port => signal

le rfrencant sur la feuille


Exemple: rsistance R1
Un 555: U1
);

exemple: applicatif: Comment faire un additionneur 4 bits?


etape 1: je cre un composant ADDITIONNEUR 1 bits

Full Adder

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY fa IS PORT (
Ci, X, Y: IN STD_LOGIC;
S, Cout: OUT STD_LOGIC);
END fa;
ARCHITECTURE Dataflow OF fa IS
BEGIN
Cout <= (X AND Y) OR (Ci AND (X XOR Y));
S <= X XOR Y XOR Ci;
END Dataflow;

19

Logique combinatoire: Instructions concurrentes


tape 2: je valide le composant ( compilation /simulation)
tape3: je structure mon niveau suprieur ( comment faire 4 bits avec 1 bit?)

architecture arch_add4full of add4full is

-- declaration du composant add1full


--librairie pour inclure type std_logic
library IEEE;
use IEEE.std_logic_1164.all;
entity add4full is
port(
Cin:IN std_logic;
A:IN std_logic_vector(3 downto 0);
B:IN std_logic_vector(3 downto 0);
Res:OUT std_logic_vector(3 downto 0);
Cout:OUT std_logic
);
end add4full

component add1full is
port(
Ci:IN std_logic;
X,Y:IN std_logic;
S,Cout:OUT std_logic
);
end component add1full;
-- declaration des fils internes pour le report carry
signal Fil1,Fil2,Fil3:std_logic;
begin

-- placement des 4 aditionneurs complets


U0: add1full port map (Cin,A(0),B(0),Res(0),Fil1);
U1: add1full port map (Fil1,A(1),B(1),Res(1),Fil2);
U2: add1full port map
(X=>A(2),Rin=>Fil2,Y=>B(2),Cout=>Fil3,S=>Res(2));
U3: add1full port map (Fil3,A(3),B(3),Res(3),Cout);
end arch_add4full;

20

VHDL: concepts de base


library IEEE; --librairie pour inclure type std_logic
use IEEE.std_logic_1164.all;

Notre ET4

ENTITY ET4 IS
--librairie pour inclure type std_logic
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY ET2 IS
PORT
(
A,B: IN
S: OUT
);

PORT
(X1,X2,X3,X4

: IN

STD_LOGIC;
Y: OUT
);

Je commence par faire ma


ET2

STD_LOGIC;
STD_LOGIC

END ET2;
ARCHITECTURE arch_ET2 OF ET2 IS
BEGIN
S<= A and B;
END arch_ET2;

2 fichiers .vhd avec chacun 1 entity+1 architecture

END ET4;

On
dclare
ET2

STD_LOGIC

Je respecte les noms


choisis sur papier

ARCHITECTURE arch_ET4 OF ET4 IS


-- partie dclarative COMPOSANT
COMPONENT ET2 is
PORT
(A,B: IN
STD_LOGIC;
S: OUT
STD_LOGIC);
END COMPONENT ET2;
-- partie dclarative SIGNAL
--pas de IN ou OUT car signal INTERNE
Les
SIGNAL FIL1,FIL2: STD_LOGIC ;
BEGIN
------------------------ 1ere porte ET place
U1:ET2 port map (A=>X1,B=>X2,S=>FIL1);
-- 2me porte ET place
U2:ET2 port map (A=>X3,B=>X4,S=>FIL2);
-- 3me porte ET place
U3:ET2 port map (A=>FIL1,B=>FIL2,S=>Y);
-- on pourrait faire la place !!!!
-- Y<= X1 and X2 and X3 and X4
END arch_ET4;

fils de
connexions
INTERNES

PORT MAP
pour
placement et
connexion

21

Logique combinatoire: Instructions concurrentes


Bilan
Pour dcrire des systmes
combinatoires les instructions types
concurrentes seront prfres
Lordre des instructions est SANS
IMPORTANCE ( car en parallle)
Il est souhaite de scinder les projets en
composants simples
APPROCHE METHODOLOGIQUE TOPDOWN

Utilisation des bibliothques IEEE

Squelette de
description
VHDL

--les libraries
library IEEE;
use IEEE.std_logic_1164.all;
.
ENTITY LENIVEAUTOP (
..)
End ENTITY
ARCHITECTURE ..
COMPONENT Truc

END COMPONENT
COMPONENT Machin

END COMPONENT

Dclaration de
composants crs

SIGNAL: .
SIGNAL: ..
XX<=1110;
YY<= A AND B;
U1: Truc PORT MAP( .);
S<= 10 when (A=B) else
00;
U2: Machin PORT MAP( .);

Utilisation des
ressources
disponibles

With (Toto) select


G<=
END ARCHITECTURE

22

Logique combinatoire: exemples


Dcodeurs 7 segments
UTILISATION DUNE TABLE (LUT) POUR DECRIRE LE SYSTEME
entity decod7seg is
port(
iDigit:IN std_logic_vector(3 downto 0);
oSeg:OUT std_logic_vector(6 downto
0)
);
end decod7seg;

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

Cration de
nouveaux types:
TYPE
Tableau: ARRAY

--definition de l'architecture
architecture arch_dec_7seg_v1 of decod7seg is
-- definition d'un nouveau type
-- tableau de 16 elements de 7 bits
type ROM is array(15 downto 0) of std_logic_vector(6 downto 0);
--initialisaion du tableau
-- tableau vu comme une memoire(LUT)
signal LUT:ROM:=(
"1000000","1111001","0100100","0110000","0011001","0010010","000
0010",
"1111000","0000000","0011000","0001000","0000011","1000110","010
0001",

Carte DE2:
Anode commune
Segment actif 0
Brochage: voir p31 du manuel

"0000110","0001110");
begin
-- pour indexer tableau il faut un entier
-- fonction de conversion conv_integer dans
IEEE.std_logic_unsigned.all
oSeg<=LUT(conv_integer(iDigit));

23

Logique combinatoire: exemples


Additionneur haut niveau
Emploi des librairies IEEE;
On augmente la taille de 1 si lon souhaite conserver la retenue dentre
--librairie pour inclure type std_logic
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity adddirect is
generic (LARG:integer:=4);
-- parametre generique
-- taille aditionneur changer en 1 clic!
port(
Cin:IN std_logic;
A:IN std_logic_vector(LARG-1 downto
0);
B:IN std_logic_vector(A'range);
Res:OUT std_logic_vector(A'range);
Cout:OUT std_logic
);
end adddirect;

architecture arch1_add4full of adddirect is


--creation de TEMP pour resultat: extension de 1 bit
signal TEMP:std_logic_vector(LARG downto 0);
begin
TEMP<=('0'&A)+('0'&B)+Cin;
--A et B etendu de 1 bit.
Res<=TEMP(TEMP'HIGH-1 downto 0);
Cout<=TEMP(TEMP'HIGH);
--TEMP'HIGH renvoi indice poids fort
end arch1_add4full;
Les attributs des signaux -Exemple S[5:0]
SHIGH renvoie 5 et SLOW renvoie 0
SRANGE renvoie 5 downto 0
Sevent renvoie TRUE si changement dtat de S

Utilisation de GENERIC lors du PORT MAP


U1: generic(10)
adddirect PORT MAP(xxxxxx);

24

Logique combinatoire: exemples


Arithmetic Logic Unit (ALU)

Slection Op
2 LIBRARY ieee;
arithmtique/logique
3 USE ieee.std_logic_1164.all;
4 USE ieee.std_logic_unsigned.all;
5 ---------------------------------------------6 ENTITY ALU IS
7 PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
8 sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
9 cin: IN STD_LOGIC;
10 y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
11 END ALU;
12 ---------------------------------------------13 ARCHITECTURE dataflow OF ALU IS
14 SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0);
15 BEGIN
16 ----- Arithmetic unit: -----17 WITH sel(2 DOWNTO 0) SELECT
18 arith <=
a WHEN "000",
19
a+1 WHEN "001",
20
a-1 WHEN "010",
21
b WHEN "011",
22
b+1 WHEN "100",
b-1 WHEN "101",
24
a+b WHEN "110",
25
a+b+cin WHEN OTHERS;

Code Opratoire (mot de


commande sur 3 bits)
26 ----- Logic unit: ----------27 WITH sel(2 DOWNTO 0) SELECT
28 logic <=
NOT a WHEN "000",
29
NOT b WHEN "001",
30
a AND b WHEN "010",
31
a OR b WHEN "011",
32
a NAND b WHEN "100",
33
a NOR b WHEN "101",
34
a XOR b WHEN "110",
35
NOT (a XOR b) WHEN OTHERS;
36 -------- Mux: --------------37 WITH sel(3) SELECT
38 y <=
arith WHEN '0',
39
logic WHEN OTHERS;
40 END dataflow;
41 ----------------------------------------------

25

Logique combinatoire: exemples


Buffers 3 tats

De manire gnrale il faut se poser la


question:
Le composant cible dispose til des
ressources ncessaires pour synthtiser
ma fonction

1 LIBRARY ieee;
2 USE ieee.std_logic_1164.all;
3 ---------------------------------------------4 ENTITY tri_state IS
5 PORT ( ena: IN STD_LOGIC;
6 input: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
7 output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
8 END tri_state;
9 ---------------------------------------------10 ARCHITECTURE tri_state OF tri_state IS
11 BEGIN
12 output <= input WHEN (ena='0') ELSE
13
(OTHERS => 'Z');
14 END tri_state;
15 ----------------------------------------------

Pas de 3 tats possibles si le composants


nen a pas!!

26

Logique squentielle: le process


Le mot cl PROCESS
Syntaxe:

MONETIQUETTE:process (signal1, signal2 etc)


-- zone dclarative
Signal sFIL1,sFIL2: xxxxxxxx
Begin
xxx
xxx
xxx
end process MONETIQUETTE;

Le PROCESS est activ lors dun changement dtat dun des signaux de la
liste de sensibilit
Une fois dans le PROCESS le droulement est SEQUENTIELLE
Les instructions utilisables dans un PROCESS sont SPECIFIQUE ( pas de
when/else par exemple)
Les signaux sont mis jour uniquement la fin du process

critures
alternatives

process
begin
q <= d;
wait until Reloj = 1;
end process;

Process
begin
c <= a and b;
wait on a, b;
end process;

Process(a,b)
begin
c <= a and b;
end process;

27

Logique squentielle: le process


Rveil du process
Exemple: bascule D latch
Fonctionnement sur niveau

Processus activ

28

Logique squentielle: le process


Rendre synchrone
Bascule D edge: fonctionnement sur front

Autre faon:
Process(CLK)
Begin
If (CLK=1) then
Q<=D;
End if;
End process;

29

Logique squentielle: le process


Ecriture correcte des process
Les compilateurs imposent une certaine rigidit dans la description des
process
Les rgles a respecter

process(horl)
if (horlevent and horl = 1) then
if (ena = 1 ) then
contenu_registre <= valeur_in;
end if;
end if;
end process;

Ce quil faut faire!


En pratique le FPGA (ou CPLD)
possde une ou des broches
spcifiques pour le signal
dhorloge

30

Logique squentielle: le process


Penser linitialisation du systmes
Signaux reset et set: comportement dfini par lutilisateur
Reset et Set SYNCHRONE
On remarquera que RST a disparu de la
liste de sensibilit
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------ENTITY dff IS
PORT ( d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END dff;
--------------------------------------ARCHITECTURE behavior OF dff IS
BEGIN
Reset ASYNCHRONE
PROCESS (rst, clk)
BEGIN
Comportement
IF (rst=0') THEN
synchrone de la bascule
q <= '0';
ELSIF (clk'EVENT AND clk='1') THEN
q <= d;
END IF;
END PROCESS;
END behavior;

process (CLK)
Begin
if (CLK'event and CLK ='1') then
if (RESET =1) then
S <= 0;
elsif (SET =1)then Actif 1 ici pour
S <= 1;
lexemple
else
S <= D;
end if;
end if;
end process ;

31

Logique squentielle: le process


Mise jour des signaux la fin du process
Exemple 1: bascule avec sortie complmente
---- Solution 1: NE MARCHE PAS--------------2 LIBRARY ieee;
3 USE ieee.std_logic_1164.all;
4 --------------------------------------5 ENTITY dff IS
6 PORT ( d, clk: IN STD_LOGIC;
7 q: BUFFER STD_LOGIC;
8 qbar: OUT STD_LOGIC);
9 END dff;
10 --------------------------------------11 ARCHITECTURE not_ok OF dff IS
12 BEGIN
13 PROCESS (clk)
14 BEGIN
15 IF (clk'EVENT AND clk='1') THEN
16 q <= d;
17 qbar <= NOT q;
LIGNE 17
18 END IF;
Je me fais avoir car si d a
19 END PROCESS;
chang q ne changera qu
20 END not_ok;
la fin du process
21 ---------------------------------------

---- Solution 2: OK ------------------2 LIBRARY ieee;


3 USE ieee.std_logic_1164.all;
4 --------------------------------------5 ENTITY dff IS
6 PORT ( d, clk: IN STD_LOGIC;
7 q: BUFFER STD_LOGIC;
8 qbar: OUT STD_LOGIC);
9 END dff;
10 --------------------------------------11 ARCHITECTURE ok OF dff IS
12 BEGIN
13 PROCESS (clk)
14 BEGIN
15 IF (clk'EVENT AND clk='1') THEN
16 q <= d;
LIGNE 19
17 END IF;
Je dcris un relation
18 END PROCESS;
COMBINATOIRE => je
19 qbar <= NOT q;
sors du PROCESS!!!
20 END ok;
21 ---------------------------------------

32

Logique squentielle: le process


Mise jour des signaux
Cas des compteurs

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity CMP4BITSRET is
PORT (
RESET, CLOCK : in std_logic;
RET : out std_logic;
Q : out std_logic_vector (3 downto 0));
end CMP4BITSRET;

architecture DESCRIPTION of CMP4BITSRET is


signal CMP: std_logic_vector (3 downto 0);
begin
process (RESET,CLOCK)
begin
if RESET ='1' then
CMP <= "0000";
elsif (CLOCK ='1' and CLOCK'event) then
CMP <= CMP + 1;
if (CMP = "1111") then
RET <= '1';
else
RET <= '0';
end if;
end if;
end process;
Q <= CMP;
end DESCRIPTION;
1110+1=1111 oui mais la fin du process
Conclusion: etat 1111 et pas de retenue!
Prochain front: 1111+1=0 je detecte 1111 , lancienne
valeur et RET passe 1
Oui mais trop tard!!

33

Logique squentielle: le process


Des solutions
SOLUTION 1:
process (RESET,CLOCK)
begin
if RESET ='1' then
CMP <= "0000";
elsif (CLOCK ='1' and CLOCK'event)
then
CMP <= CMP + 1;
if (CMP = "1110") then
- La retenue passera un quand CMP
= 14 dcimal
RET <= '1';
else
RET <= '0';
Version compltement
end if;
synchrone:
end if;
Janticipe pour avoir un rsultat
end process;
correct

SOLUTION 2:
process (RESET,CLOCK)
begin
if RESET='1' then
CMP <= "0000";
elsif (CLOCK ='1' and
CLOCK'event) then
CMP <= CMP + 1;
Je dcris le
end if;
combinatoire HORS
end process;
du PROCESS
-- Validation de la retenue
RET <= '1' when (CMP = "1111")
else '0';

34

Logique squentielle: les instructions


Assignations directes
S<= signal;

Q est dfini en sortie


OR Q<=Q+1 signifie
Relire tat courant et
incrmente
Solution 1: dfinir BUFFER
au lieu de OUT
Solution 2: couramment
utilise: passer par un signal

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity CMP4BITS is
PORT (
CLOCK : in std_logic;
Q : out std_logic_vector (3 downto 0));
end CMP4BITS;
architecture DESCRIPTION of CMP4BITS is
signal Q_BUS_INTERNE : std_logic_vector(3 downto 0));
begin
process (CLOCK)
begin
if (CLOCK ='1' and CLOCK'event) then
Q_BUS_INTERNE <= Q_BUS_INTERNE + 1;
end if;
end process;
Q <= Q_BUS_INTERNE; -- affectation du bus interne au
-- signal de sortie Q
end DESCRIPTION;

35

Logique squentielle: les instructions


Assignation conditionnelle
Structure SI/SINON SI

Library ieee;
Use ieee.std_logic_1164.all;
Bascule T
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity BASCULET is
T comme TOGGLE ( basculement)
port (
La sortie change dtat chaque front
D,CLK : in std_logic;
( utilisation pour la synthse des
S : buffer std_logic);
compteurs)
end BASCULET;
architecture DESCRIPTION of BASCULET is
begin
PRO_BASCULET : process (CLK)
Begin
if (CLK'event and CLK='1') then
if (D=1) then
S <= not (S);
end if;
end if;
end process PRO_BASCULET;
end DESCRIPTION;

Compteur de
GRAY
Code binaire
rflchi
(codeur de
position par
exemple)

COMPTEUR GRAY
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.std_arith.all;
entity GRAY is
port (H,R :in std_logic;
Q :out std_logic_vector(2 downto 0));
end GRAY;
architecture ARCH_GRAY of GRAY is
signal X :std_logic_vector(2 downto 0);
begin
process(H,R)
begin
if R='1' then X <= "000";
elsif (H'event and H='1') then
if X = "000" then X <= "001";
elsif X = "001" then X <= "011";
elsif X = "011" then X <= "010";
elsif X = "010" then X <= "110";
elsif X = "110" then X <= "111";
elsif X = "111" then X <= "101";
elsif X = "101" then X <= "100";
elsif X = "100" then X <= "000";
end if;
end if;
end process;
Q <= X;
end ARCH_GRAY;

36

Logique squentielle: les instructions


Assignation conditionnelle
Structure CASE/IS
Utile pour dcrire des grafcets, machine dtats
Case selecteur is
when condition1 =>
when condition2 =>
---when others
=>
end case ;

instructions ;
.
instructions ;
instructions ;
instructions ;

CAS possibles de lexpression EST


LORSQUE signal = valeur1 => instructions squentielles;
LORSQUE signal = valeur2 =>instructions squentielles;
LORSQUE signal = valeur3 =>instructions squentielles;
LORSQUE signal = AUTRES =>instructions squentielles;
FIN DE CAS;

37

Logique squentielle: les instructions


Exemple de CASE/IS

Schma de principe dun registre dcalage SIMPLE

Description dun registre dcalage


registre dcalage droite OU gauche

On peut utiliser une variable la


place dun signal

Reg_dec: PROCESS (h)


VARIABLE stmp: std_logic_vector(3 DOWNTO 0);
Affecttation dune variable
BEGIN
Mavariable:= ma valeur;
If (h=1 and hevent) then
CASE selection IS
CONTRAIREMENT AU SIGNAUX
WHEN 11=> stmp := d_entree; --chargement paralelle
LA VALEUR EST MISE A JOUR DE
WHEN 10=>stmp:= stmp(2 DOWNTO 0) & edg; --gauche
SUITE
WHEN 01=>stmp:= edd &stmp(3 DOWNTO 1); --droite
Rappel: & colle
WHEN OTHERS => ; --mmorisation
les signaux ensemble
END CASE;
la sortie est SYNCHRONE
sortie <= stmp;
END PROCESS Reg_dec;
Pas de retard supplmentaire car utilisation dune variable
Si emploi dun signal la place dune variable affectation
EN DEHORS DU PROCESS ( voir chapitre Mise jour des
signaux et page suivante pour un exemple)

38

Logique squentielle: des exemples


Registre dcalage simple
Sortie srie ( 1 seule sortie)

1 -------------------------------------------------2 LIBRARY ieee;


3 USE ieee.std_logic_1164.all;
4 -------------------------------------------------ENTITY shiftreg IS
6 GENERIC (n: INTEGER := 4);
7 PORT (d, clk, rst: IN STD_LOGIC;
8 q: OUT STD_LOGIC);
9 END shiftreg;
10 -------------------------------------------------11 ARCHITECTURE behavior OF shiftreg IS
12 SIGNAL internal: STD_LOGIC_VECTOR (n-1 DOWNTO 0);
13 BEGIN
14 PROCESS (clk, rst)
15 BEGIN
16 IF (rst='1') THEN
17
internal <= (OTHERS => '0');
18 ELSIF (clk'EVENT AND clk='1') THEN
19
internal <= d & internal(internal'LEFT DOWNTO 1);
20 END IF;
21 END PROCESS;
22 q <= internal(0);
23 END behavior;
24 --------------------------------------------------

39

Logique squentielle: des exemples


Registre dcalage
Sortie parallle
Choix du sens

Emploi de signaux et non de


variables
Affectation en dehors du
process

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.std_arith.all;
entity DECAL_DG is
port (H,R,SENS :in std_logic;
IN_OUT,OUT_IN :inout std_logic);
end DECAL_DG;
architecture ARCH_DECAL_DG of DECAL_DG is
signal Q :std_logic_vector(3 downto 0);
begin
process(H,R)
begin
if R='1' then Q <= "0000";
elsif (H'event and H='1') then
if SENS = '1' then
Q <= Q(2 downto 0) & IN_OUT;
else Q <= OUT_IN & Q(3 downto 1);
end if;
end if;
end process;
OUT_IN <= Q(3) when SENS = '1' else 'Z';
IN_OUT <= Q(0) when SENS = '0' else 'Z';
end ARCH_DECAL_DG;

40

Logique squentielle: des exemples


Une RAM
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------ENTITY ram IS
GENERIC ( bits: INTEGER := 8; -- # of bits per word
words: INTEGER := 16); -- # of words in the memory
PORT ( wr_ena, clk: IN STD_LOGIC;
addr: IN INTEGER RANGE 0 TO words-1;
data_in: IN STD_LOGIC_VECTOR (bits-1 DOWNTO 0);
data_out: OUT STD_LOGIC_VECTOR (bits-1 DOWNTO 0));
12 END ram;
--------------------------------------------------ARCHITECTURE ram OF ram IS
TYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0);
SIGNAL memory: vector_array;
Dclaration dun signal du type
BEGIN
cr prcdemment
PROCESS (clk, wr_ena)
BEGIN
IF (clk'EVENT AND clk='1') THEN
IF (wr_ena='1') THEN
memory(addr) <= data_in;
END IF;
END IF;
END PROCESS;
data_out <= memory(addr);
END ram;

Cration dun nouveau type:


TYPE
Cest un tableau de vecteurs

41

Logique squentielle: des exemples


Diviseur de frquence
Diviseur par comptable
Possibilit de faire par dcomptage aussi
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_arith.all;
entity DIV_FREQ1 is
port (H :in std_logic;
N :in std_logic_vector(3 downto 0);
DIV : out std_logic);
end DIV_FREQ1;
architecture ARCH_DIV_FREQ1 of DIV_FREQ1 is
signal Q :std_logic_vector(3 downto 0);
begin
process(H)
begin
if (H'event and H='1') then
if Q = 15 then Q <= N;
else Q <= Q + 1;
end if;
end if;
end process;
DIV <= '1' when Q = 15 else '0';
end ARCH_DIV_FREQ1;

Application et utilisation dun diviseur


de frquence
On vitera de cascader la sortie du
diviseur sur lhorloge du bloc suivant
La bonne mthode:
Horloge du systme LA mme
pour tous les blocs
La sortie du diviseur est une
entre de validation du bloc
suivant
Si En=1 alors je
compte

42

Logique squentielle: des exemples


Application et utilisation dun diviseur de frquence

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.std_arith.all;
entity COMPTCAS is
port (H,R,EN :in std_logic;
CO :out std_logic;
Q :out std_logic_vector(3 downto 0));
end COMPTCAS;
architecture ARCH_COMPTCAS of COMPTCAS is
signal X :std_logic_vector(3 downto 0);
begin
process(H,R)
begin
if R='1' then X <= "0000";
elsif (H'event and H='1') then
if EN = '1' then X <= X + 1;
else X <= X;
end if;
end if;
end process;
Q <= X;
CO <= '1' when Q = 15 else '0';
end ARCH_COMPTCAS;

COMPOSANT HAUT NIVEAU


LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.std_arith.all;
entity COMPT12 is
port (H,RAZ,EN :in std_logic;
CO :out std_logic;
Q :out std_logic_vector(11 downto 0));
end COMPT12;
architecture ARCH_COMPT12 of COMPT12 is
signal X :std_logic_vector(11 downto 0);
signal CO1,CO2,CO3,EN1 :std_logic;
component COMPTCAS
port (H,R,EN : in std_logic;
CO : out std_logic;
Q : out std_logic_vector(3 downto 0));
end component;
begin
COMPTEUR1 : COMPTCAS port map(H,RAZ,EN,CO1,Q(3 downto 0));
COMPTEUR2 : COMPTCAS port map(H,RAZ,CO1,CO2,Q(7 downto 4));
EN1 <= CO1 and CO2;
COMPTEUR3 : COMPTCAS port map(H,RAZ,EN1,CO3,Q(11 downto 8));
CO <= CO1 and CO2 and CO3;
end ARCH_COMPT12;

43

Logique squentielle: des exemples


Dtection dun front
Dtection dun changement dtat dun signal
Contrainte: DESCRIPTION SYNCHRONE
quivalent
Detection: PROCESS
VARIABLE detect : std_logic_vector(1 DOWNTO 0);
Process(clk)
BEGIN
If (clk=1 and clkevent)
WAIT UNTIL rising_edge (clk); -- c'est donc synchrone de clk
front_montant <= '0';

front_descendant <= '0' ;


detect(1) := detect(0);
detect(0) := signal_lent;
IF detect = "01" THEN
front_montant <= '1';
Rappel:
END IF;
la variable prend sa valeur instannment
IF detect = "10" THEN
front_descendant <= '1';
Le signal prend sa valeur la sortie du
END IF;
process
END PROCESS;

44

Bibliographie
Certaines illustrations et exemples proviennent de cours ou douvrages
prsents ci-dessous
Introduction la Synthse logique Philippe LECARDONNEL & Philippe
LETENNEUR
Le langage de description VHDL T. BLOTIN
VHDl J.maillefert
Circuit Design with VHDL Volnei A. Pedroni

Un lien bien utile pour ltudiant GEII


http://perso.orange.fr/xcotton/electron/coursetdocs.htm

45