Anda di halaman 1dari 45

VHDL

Str uctures de bases Synthse dopr ateur s standar ds

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 3

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 Rpartition des applications aux CPLD) 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 input6

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
Les deux portes travaillent en //

Synthse ou modlisation
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 La sortie ne dpend pas de ltat pass Un vecteur dentre = un vecteur de sortie unique

Logique squentielle La sortie dpend de son tat pass 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 est synthtiser par les lignes de codes directement
Exemple: faire une porte ET 4entre avec des ET 2 entres Il faut un SIGNAL ET4 est un composant (entity+architecture)

Voir page 12 pour plus de dtails

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);

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

De convertir un std_logic_vector en signed ou unsigned


A<= signed(SW(3 downto 0)); B<=unsigned(RES); LEDG(3 downto 0)<=std_logic_vector(tempo);

Ne pas mettre en mme temps: IEEE.numeric_std.all; IEEE.std_logic_arith.all;

De convertir des signed ou unsigned en std_logic_vector

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 de mlanger des entiers avec des std_logic_vector: A<= A +1;

Recopie du bit bit de poids forts


A<= A(3)&A

14

VHDL: concepts de base


Littraux
Caractres: 0, x,a,% Chanes: 11110101,xx,bonjour,$@& Chanes de bits: B0010_1101, X 2D, O 055 Dcimaux:27, -5, 4e3, 76_562, 4.25 Bass: 2#1001#, 8#65_07, 16#C5#e2
Ne pas confondre 1 bit exemple 0 ou 1 Avec un vecteur de bits 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
STD_LOGIC_VECTOR (3 DOWNTO 0);

Concatnations dlments de tableaux &


"bon" & "jour" => "bonjour" 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
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 ---------------------------------------------

signal <=

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


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)

Assignation slective

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 MOT CLE: PORTMAP Analogie avec ORCAD: on choisit
Ma Rfrence :port map ( liste ordonne de signaux) ;
ou

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

un composant de la bibliothque en 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
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;

Full Adder

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


Notre ET4
--librairie pour inclure type std_logic library IEEE; use IEEE.std_logic_1164.all; ENTITY ET2 IS PORT ( A,B: IN S: OUT ); END ET2; ARCHITECTURE arch_ET2 OF ET2 IS BEGIN S<= A and B; END arch_ET2; library IEEE; --librairie pour inclure type std_logic use IEEE.std_logic_1164.all; ENTITY ET4 IS PORT (X1,X2,X3,X4 Y: OUT ); : IN STD_LOGIC STD_LOGIC;

Je commence par faire ma ET2 On dclare ET2

END ET4;

Je respecte les noms ARCHITECTURE arch_ET4 OF ET4 IS choisis sur papier


-- 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 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;

STD_LOGIC; STD_LOGIC

Les fils de connexions INTERNES

2 fichiers .vhd avec chacun 1 entity+1 architecture

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 TOP-DOWN
--les libraries library IEEE; use IEEE.std_logic_1164.all; . ENTITY LENIVEAUTOP ( ..) End ENTITY ARCHITECTURE .. COMPONENT Truc END COMPONENT COMPONENT Machin END COMPONENT SIGNAL: . SIGNAL: ..

Dclaration de composants crs

Utilisation des bibliothques IEEE

Squelette de description VHDL

XX<=1110; YY<= A AND B; U1: Truc PORT MAP( .); S<= 10 when (A=B) else 00; U2: Machin PORT MAP( .); With (Toto) select G<= END ARCHITECTURE

Utilisation des ressources disponibles

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
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;

critures alternatives

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 synchrone IF (rst=0') THEN 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

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!!

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;

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;

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;

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

35

Logique squentielle: les instructions


Assignation conditionnelle
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 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;

Structure SI/SINON SI

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

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
Description dun registre dcalage registre dcalage droite OU gauche
Schma de principe dun registre dcalage SIMPLE

Reg_dec: PROCESS (h) VARIABLE stmp: std_logic_vector(3 DOWNTO 0); BEGIN If (h=1 and hevent) then CASE selection IS WHEN 11=> stmp := d_entree; --chargement paralelle WHEN 10=>stmp:= stmp(2 DOWNTO 0) & edg; --gauche WHEN 01=>stmp:= edd &stmp(3 DOWNTO 1); --droite WHEN OTHERS => ; --mmorisation END CASE; la sortie est SYNCHRONE sortie <= stmp; END PROCESS Reg_dec; Pas de retard supplmentaire car utilisation dune variable

On peut utiliser une variable la place dun signal Affecttation dune variable Mavariable:= ma valeur; CONTRAIREMENT AU SIGNAUX LA VALEUR EST MISE A JOUR DE SUITE Rappel: & colle les signaux ensemble

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 diviseur de frquence

dun

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)); 43 CO <= CO1 and CO2 and CO3; end ARCH_COMPT12;

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 cidessous
Introduction la Synthse logique Philippe LECARDONNEL & Philippe LETENNEUR Le langage de description VHDL T. B LOTIN 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

Anda mungkin juga menyukai