45
VHDL Structures de bases Synthèse d’opérateurs standards

VHDL

Embed Size (px)

DESCRIPTION

VHDL par mohamed amine tahiri

Citation preview

VHDL

Structures de basesSynthèse d’opérateurs standards

2

Présentation

Electronique reprogrammable Apparition des premiers circuits vers les années 70: premiers PLD-> PAL,

GAL Evolution vers composants plus complexes: CPLD, FPGA Différentes technologies pour la programmation des connexions

Permanents , Volatiles statiques, Volatiles Capacité de programmation In-Situ

• composants dits ISP via interface JTAG

Contexte de compétitivité mondiale Importance du Time-To-Market

3

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 programmablesET cablé

OU cablé

Constitution d’un réseau programmable

Représentation standard

4

xPLD

Simple Programme Logic Device Composants simples

réseau ET/OU programmable ou fixe PAL (OTP en général), GAL reprogrammable

Différentes familles en fonction des ressources rajoutés par le constructeurs

5

FPGA

Field Programmable Grid Array Granularité plus fine que les CPLD ( macrocellules - complexes mais + nombreuses) Intégration matérielle de composants supplémentaires

RAM: appelé LUT (Look-Up Table) Mutiplexeurs divers PLL Multiplieurs câblés (FPGA haut de gamme => concurrence avec les DSP)

Réseau de routage réparti ( non centralisé contrairement aux CPLD)

Exemple de référence

Famille Cyclone (FPGA Low Cost d’ALTERA)

Concurrent: Spartan3 (chez Xilinx)

Répartition des applications

Source Altera

6

FPGA

La carte DE2 (utilisé en TP)SpecificationsFPGA• Cyclone II EP2C35F672C6 FPGA andEPCS16 serial configuration deviceI/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 slotSwitches, 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

7

VHDL introduction

Programmation ou description? Les objectifs du langage VHDL

Conception de circuits intégrés reconfigurable ou non (ASIC, FPGA…) : SYNTHESE

Mise au point de modèle de simulations numériques (circuits virtuels) : MODELISATION

Le langage est capable de DECRIRE des comportements CONCURRENTS ( // ) Des comportements séquentiels

Synthèse ou modélisation

Notre cible en TP: FPGA

Cyclone 2 sur la carte DE2

Les deux portes travaillent en //

Nous nous focaliserons dans ce cours à la synthèse uniquement

8

VHDL: concepts de base

Structure générale

Votre fichier texte de description: xxx.vhd

Mode transfert des signaux de votre entity

9

Flot de conception

Un outils de développement: Quartus II d’Altera

10

VHDL: concepts de base

Méthodologie de conception Guide pratique du débutant

Décomposition du cahier des charges en fonctions élémentaires Classification de la fonction

• COMBINATOIRE: instructions dites concurrentes• SEQUENTIELLE: utilisation d’un PROCESS

Logique combinatoire

La sortie ne dépend pas de l’état passé

Un vecteur d’entrée = un vecteur de sortie unique

Des exemples:

•Multiplexeurs

•Additionneurs

•Décodeur 7 segements

•Encodeurs de priorité

Logique séquentielle

La sortie dépend de son état passé

Système nécessitant une horloge (systèmes dits synchrones)

Des exemples:

•Compteurs

•Registres à décalage

•Machine d’état (automate)

11

VHDL: concepts de base

Les questions à se poser On identifie les fonctions et on les dessine sur papier On repère et nomme les entrées de chaque blocs ( on évite d’utiliser les

mêmes noms) On répertorie les signaux INTERNES (mot clé SIGNAL) Le bloc est-il combinatoire ou séquentiel?

Si séquentiel alors description avec le mot clé PROCESS + instructions autorisées

Le bloc est-il utilisé plusieurs fois Si oui il vaut mieux créer un composant (entity+ architecture) Sinon le bloc est synthétiser par les lignes de codes directementExemple: faire une porte ET 4entrée avec des ET 2 entrées

Il faut un SIGNAL

On créera 1 composant ET2 (entity+architecture)

Utilisé 3 fois pour décrire ET4

ET4 est un composant (entity+architecture)Voir page

12 pour plus de détails

12

VHDL: concepts de base

Un autre exemple: Horloge BCD 2 digits Blocs décodeurs 7 segments - combinatoire Blocs compteurs – séquentiel Les Blocs compteurs sont cascadé pour la propagation de la retenue

Après 9 j’ai 0 avec un de retenue! Affichage 10

Sorties pilotant les Leds de l’afficheur 1Séquentiel donc process

COMPT: PROCESS(CLK)Begin….END PROCESS;

Ce fil ne sort pas du composant de plus haut niveau: on le déclarera

SIGNAL FILS: bit_vector(3 downto 0);

13

VHDL: concepts de base

Les librairies Facilite la tâche du concepteur Rajout de fonctionnalités supplémentaires

La librairie IEEE A mettre au début 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 arithmétiques sur ces STD_LOGIC_VECTOR   USE IEEE.NUMERIC_STD.ALL; Et aussi USE IEEE.std_logic_arith.all;

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

Exemples

Applicatifs

14

VHDL: concepts de base

Complément sur les opérations arithmétiques Le rajout de use IEEE.numeric_std.all; permet

De travailler avec des valeurs signées et non signées• 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);

De convertir des signed ou unsigned en std_logic_vector• LEDG(3 downto 0)<=std_logic_vector(tempo);

De redimensionner des vecteurs • Permet d’étendre le bit de signe correctement!• signal A,B: signed(LARG downto 0);

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

De travailler avec les opérateurs arithmétiques standart• >, >=, =<,<, + ,- etc….

Le rajout de use IEEE.std_logic_unsigned.all; permet De travailler avec les opérateurs arithmétiques standart de mélanger des entiers avec des std_logic_vector: A<= A +1;

IEEE.std_logic_unsigned.all et IEEE.std_logic_arith.all sont d’anciennes bibliothèques

Ne pas mettre en même temps:

IEEE.numeric_std.all;

IEEE.std_logic_arith.all;

Préfèrez l’emploi de IEEE.numeric_std.all;

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

Recopie du bit bit de poids fortsA<= A(3)&A

15

VHDL: concepts de base

Littéraux Caractères: ’0’, ’x’,’a’,’%’ Chaînes: ”11110101”,”xx”,”bonjour”,”$@&” Chaînes de bits: B”0010_1101”, X ”2D”, O ”055” Décimaux:27, -5, 4e3, 76_562, 4.25 Basés: 2#1001#, 8#65_07, 16#C5#e2

Les opérateurs Logiques (boolean, bit, std_ulogic)

AND, OR, NAND, NOR, XOR, NOT Relationnels ( retournent un boolean)

= /= < <= > >= Arithmétiques

+ - * / ** MOD REM Concaténations d’éléments de tableaux &

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

Ne pas confondre 1 bit

exemple ‘0’ ou ‘1’

Avec un vecteur de bits

” 11  ” ou ” 1101110 ”   

Un bus (ou ensemble de fils électrique) est représenté sous forme d’un vecteur de bits

STD_LOGIC_VECTOR (3 DOWNTO 0);

16

Logique combinatoire: Instructions concurrentes

Assignation simples

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

--portes ET --3 entrées E2 E1 E0-- 1 sortie S0entity ET3 is port(

E:IN std_logic_vector(2 downto 0);S:OUT std_logic);

end ET3;

--definition de l'architecturearchitecture arch_ET3 of ET3 isbeginS<=E(2) and E(1) and E(0); -- E(2) accès au fil 2end arch_ET3;

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 filS2,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'architecturearchitecture arch_example of example isbeginS1<='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;

Exemple 1Exemple 2

Bit Poid Fort

Bit Poid faible

17

Logique combinatoire: Instructions concurrentes

Assignation conditionnelle Structure WHEN/ELSE

signal <= signal1 when expresion_boolénne else……… signal1xx when expresion_boolénne else

signal par défaut;---- Solution 1: with WHEN/ELSE -------------2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4 ---------------------------------------------5 ENTITY encoder IS6 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 IS11 BEGIN12 y <= "00" WHEN x="0001" ELSE13 "01" WHEN x="0010" ELSE14 "10" WHEN x="0100" ELSE15 "11" WHEN x="1000" ELSE20 "ZZZ";21 END encoder1;22 ---------------------------------------------

Exemple d’application:

encodeur clavier pour PIC

Intérêt: réduire le nombre d’entrée du PIC

18

Logique combinatoire: Instructions concurrentes

Assignation sélective with expression select signal1 <= signal1when valeur 1,

signal2 when valeur2,------

signal par défaut when others ;

Le multiplexeur: on aiguille une enrée vers la sortie en fonction d’un numéro d’aiguillage

MUX

1 voie parmi 4Autre possibilté:

std_logic_vector(1 downto 0)

19

Logique combinatoire: Instructions concurrentes

Instanciation (placement) de composants déjà crées Découpage de votre projet en fonctions: création de composants

adéquats Assemblage des composants créés pour structurer votre projet MOT CLE: PORTMAP

Ma Référence :port map ( liste ordonnée de signaux) ;• ou

Ma Référence : port map ( port=> signal , port => signal ) ;

Analogie avec ORCAD: on choisit un composant de la bibliothèque en

le référencant sur la feuilleExemple: résistance R1

Un 555: U1

exemple: applicatif: Comment faire un additionneur 4 bits?

etape 1: je crée un composant ADDITIONNEUR 1 bitsLIBRARY 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 ISBEGINCout <= (X AND Y) OR (Ci AND (X XOR Y));S <= X XOR Y XOR Ci;END Dataflow;Full Adder

20

Logique combinatoire: Instructions concurrentes

étape 2: je valide le composant ( compilation /simulation)

étape3: je structure mon niveau supérieur ( comment faire 4 bits avec 1 bit?)

architecture arch_add4full of add4full is-- declaration du composant add1full component add1full isport(

Ci:IN std_logic;X,Y:IN std_logic;S,Cout:OUT std_logic);

end component add1full;-- declaration des fils internes pour le report carrysignal Fil1,Fil2,Fil3:std_logic;begin-- placement des 4 aditionneurs completsU0: 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;

--librairie pour inclure type std_logiclibrary 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;

21

VHDL: concepts de base

Notre ET4

--librairie pour inclure type std_logiclibrary IEEE; use IEEE.std_logic_1164.all; ENTITY ET2 IS

PORT(A,B: IN STD_LOGIC;S: OUT STD_LOGIC);

END ET2;

ARCHITECTURE arch_ET2 OF ET2 ISBEGINS<= A and B; END arch_ET2;

library IEEE; --librairie pour inclure type std_logicuse IEEE.std_logic_1164.all; ENTITY ET4 IS

PORT(X1,X2,X3,X4 : IN

STD_LOGIC;Y: OUT STD_LOGIC);

END ET4;

ARCHITECTURE arch_ET4 OF ET4 IS-- partie déclarative COMPOSANTCOMPONENT ET2 isPORT

(A,B: IN STD_LOGIC;S: OUT STD_LOGIC);

END COMPONENT ET2;-- partie déclarative SIGNAL--pas de IN ou OUT car signal INTERNESIGNAL FIL1,FIL2: STD_LOGIC ;

BEGIN ------------------------- 1ere porte ET placéeU1:ET2 port map (A=>X1,B=>X2,S=>FIL1); -- 2ème porte ET placéeU2:ET2 port map (A=>X3,B=>X4,S=>FIL2); -- 3ème porte ET placée U3:ET2 port map (A=>FIL1,B=>FIL2,S=>Y);-- on pourrait faire à la place !!!!-- Y<= X1 and X2 and X3 and X4END arch_ET4;

Je commence par faire ma ET2

2 fichiers .vhd avec chacun 1 entity+1 architecture

Je respecte les noms choisis sur papier

On déclare ET2

Les fils de connexions INTERNES

PORT MAP pour placement et connexion

22

Logique combinatoire: Instructions concurrentes

Bilan Pour décrire des systèmes

combinatoires les instructions types « concurrentes » seront préférées

L’ordre des instructions est SANS IMPORTANCE ( car en parallèle)

Il est souhaite de scinder les projets en composants simples

APPROCHE METHODOLOGIQUE TOP-DOWN

Utilisation des bibliothèques IEEE

--les librarieslibrary IEEE; use IEEE.std_logic_1164.all; ……….

ENTITY LENIVEAUTOP (………..)End ENTITY

ARCHITECTURE …..

COMPONENT Truc…END COMPONENTCOMPONENT Machin…END COMPONENT

SIGNAL: ……….SIGNAL: ……..

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

Squelette de description VHDL

Déclaration de composants créés

Utilisation des ressources disponibles

23

Logique combinatoire: exemples

Décodeurs 7 segments UTILISATION D’UNE TABLE (LUT) POUR DECRIRE LE SYSTEME

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

--definition de l'architecturearchitecture arch_dec_7seg_v1 of decod7seg is-- definition d'un nouveau type-- tableau de 16 elements de 7 bitstype 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","0000010",

"1111000","0000000","0011000","0001000","0000011","1000110","0100001",

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

end arch_dec_7seg_v1;

entity decod7seg is port(

iDigit:IN std_logic_vector(3 downto 0);oSeg:OUT std_logic_vector(6 downto

0));

end decod7seg;

Carte DE2:

Anode commune

Segment actif à ‘0’

Brochage: voir p31 du manuel

Création de nouveaux types: TYPE

Tableau: ARRAY

24

Logique combinatoire: exemples

Additionneur « haut niveau » Emploi des librairies IEEE; On augmente la taille de 1 si l’on souhaite conserver la retenue d’entrée

architecture arch1_add4full of adddirect is--creation de TEMP pour resultat: extension de 1 bitsignal TEMP:std_logic_vector(LARG downto 0); beginTEMP<=('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 fortend arch1_add4full;

--librairie pour inclure type std_logiclibrary 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;

Les attributs des signaux -Exemple S[5:0]

S’HIGH renvoie 5 et S’LOW renvoie 0

S’RANGE renvoie 5 downto 0

S’event renvoie TRUE si changement d’état de S

Utilisation de GENERIC lors du PORT MAP

U1: generic(10)

adddirect PORT MAP(xxxxxx);

25

Logique combinatoire: exemples

2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4 USE ieee.std_logic_unsigned.all;5 ----------------------------------------------6 ENTITY ALU IS7 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 IS14 SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0);15 BEGIN16 ----- Arithmetic unit: ------17 WITH sel(2 DOWNTO 0) SELECT18 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;

26 ----- Logic unit: -----------27 WITH sel(2 DOWNTO 0) SELECT28 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) SELECT38 y <= arith WHEN '0',39 logic WHEN OTHERS;40 END dataflow;41 ----------------------------------------------

Arithmetic Logic Unit (ALU)

Sélection Op arithmétique/logique

Code Opératoire (mot de commande sur 3 bits)

26

Logique combinatoire: exemples

Buffers 3 états

1 LIBRARY ieee;2 USE ieee.std_logic_1164.all;3 ----------------------------------------------4 ENTITY tri_state IS5 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 IS11 BEGIN12 output <= input WHEN (ena='0') ELSE13 (OTHERS => 'Z');14 END tri_state;15 ----------------------------------------------

De manière générale il faut se poser la question:

Le composant cible dispose t’il des ressources nécessaires pour synthétiser ma fonction

Pas de 3 états possibles si le composants n’en a pas!!

27

Logique séquentielle: le process

Le mot clé PROCESS Syntaxe:

Le PROCESS est activé lors d’un changement d’état d’un des signaux de la liste de sensibilité

Une fois dans le PROCESS le déroulement 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

MONETIQUETTE:process (signal1, signal2 etc)-- zone déclarativeSignal sFIL1,sFIL2: xxxxxxxxBegin xxx xxx xxxend process MONETIQUETTE;

processbeginq <= d;wait until Reloj = ‘1’;end process;

Processbeginc <= a and b;wait on a, b;end process;

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

Écritures alternatives

28

Logique séquentielle: le process

Réveil du process Exemple: bascule D latch

Fonctionnement sur niveau

Processus activé

29

Logique séquentielle: le process

Rendre synchrone Bascule D edge: fonctionnement sur front

Autre façon:Process(CLK)BeginIf (CLK=‘1’) then Q<=D;End if;End process;

30

Logique séquentielle: le process

Ecriture correcte des process Les compilateurs imposent une certaine rigidité dans la description des

process Les règles a respecter

process(horl)if (horl’event and horl = ‘1’) thenif (ena = ‘ 1 ’) thencontenu_registre <= valeur_in;end if;end if;end process;

Ce qu’il faut faire!

En pratique le FPGA (ou CPLD) possède une ou des broches spécifiques pour le signal d’horloge

31

Logique séquentielle: le process

Penser à l’initialisation du systèmes Signaux reset et set: comportement défini par l’utilisateur

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 PROCESS (rst, clk) BEGIN IF (rst=‘0') THEN q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS;END behavior;

Reset ASYNCHRONE

Comportement synchrone de la bascule

process (CLK)Beginif (CLK'event and CLK ='1') thenif (RESET =’1’) thenS <= ‘0’;elsif (SET =’1’)thenS <= ‘1’;elseS <= D;end if;end if;end process ;

Reset et Set SYNCHRONE

On remarquera que RST a disparu de la liste de sensibilité

Actif à 1 ici pour l’exemple

32

Logique séquentielle: le process

Mise à jour des signaux à la fin du process Exemple 1: bascule avec sortie complémentée

---- Solution 1: NE MARCHE PAS---------------2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4 ---------------------------------------5 ENTITY dff IS6 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 IS12 BEGIN13 PROCESS (clk)14 BEGIN15 IF (clk'EVENT AND clk='1') THEN16 q <= d;17 qbar <= NOT q;18 END IF;19 END PROCESS;20 END not_ok;21 ---------------------------------------

LIGNE 17

Je me fais avoir car si d a changé q ne changera qu’à la fin du process

---- Solution 2: OK -------------------2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4 ---------------------------------------5 ENTITY dff IS6 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 IS12 BEGIN13 PROCESS (clk)14 BEGIN15 IF (clk'EVENT AND clk='1') THEN16 q <= d;17 END IF;18 END PROCESS;19 qbar <= NOT q;20 END ok;21 ---------------------------------------

LIGNE 19

Je décris un relation COMBINATOIRE => je sors du PROCESS!!!

33

Logique séquentielle: 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 isPORT (RESET, CLOCK : in std_logic;RET : out std_logic;Q : out std_logic_vector (3 downto 0));end CMP4BITSRET;

architecture DESCRIPTION of CMP4BITSRET issignal CMP: std_logic_vector (3 downto 0);beginprocess (RESET,CLOCK)beginif RESET ='1' thenCMP <= "0000"; elsif (CLOCK ='1' and CLOCK'event) thenCMP <= CMP + 1;if (CMP = "1111") thenRET <= '1';elseRET <= '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 , l’ancienne valeur et RET passe à 1Oui mais trop tard!!

34

Logique séquentielle: le process

Des solutions

SOLUTION 2: process (RESET,CLOCK)beginif RESET='1' thenCMP <= "0000";elsif (CLOCK ='1' and CLOCK'event) thenCMP <= CMP + 1;end if;end process;

-- Validation de la retenueRET <= '1' when (CMP = "1111") else '0';

SOLUTION 1:

process (RESET,CLOCK)beginif RESET ='1' thenCMP <= "0000";elsif (CLOCK ='1' and CLOCK'event) thenCMP <= CMP + 1;if (CMP = "1110") then–- La retenue passera à un quand CMP = 14 décimalRET <= '1';elseRET <= '0';end if;end if;end process;

Version complètement synchrone:

J’anticipe pour avoir un résultat correct

Je décris le combinatoire HORS du PROCESS

35

Logique séquentielle: 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 isPORT (CLOCK : in std_logic;Q : out std_logic_vector (3 downto 0));end CMP4BITS;

architecture DESCRIPTION of CMP4BITS issignal Q_BUS_INTERNE : std_logic_vector(3 downto 0));beginprocess (CLOCK)beginif (CLOCK ='1' and CLOCK'event) thenQ_BUS_INTERNE <= Q_BUS_INTERNE + 1;end if;end process;Q <= Q_BUS_INTERNE; -- affectation du bus interne au-- signal de sortie Qend DESCRIPTION;

Q est défini en sortie

OR Q<=Q+1 signifie Relire état courant et incrémenteSolution 1: définir BUFFER au lieu de OUT

Solution 2: couramment utilisée: passer par un signal

36

Logique séquentielle: les instructions

Assignation conditionnelle Structure SI/SINON SI

COMPTEUR GRAYLIBRARY ieee;USE ieee.std_logic_1164.all;USE work.std_arith.all;entity GRAY isport (H,R :in std_logic;Q :out std_logic_vector(2 downto 0));end GRAY;architecture ARCH_GRAY of GRAY issignal X :std_logic_vector(2 downto 0);beginprocess(H,R)beginif R='1' then X <= "000";elsif (H'event and H='1') thenif 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;

Library ieee;Use ieee.std_logic_1164.all;Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity BASCULET isport (D,CLK : in std_logic;S : buffer std_logic);end BASCULET;

architecture DESCRIPTION of BASCULET isbeginPRO_BASCULET : process (CLK)Beginif (CLK'event and CLK='1') thenif (D=’1’) thenS <= not (S);end if;end if;end process PRO_BASCULET;end DESCRIPTION;

Bascule T

Compteur de GRAY

T comme TOGGLE ( basculement)

La sortie change d’état à chaque front ( utilisation pour la synthèse des compteurs)

Code binaire réfléchi

(codeur de position par exemple)

37

Logique séquentielle: les instructions

Assignation conditionnelle Structure CASE/IS

Utile pour décrire des grafcets, machine d’états

CAS possibles de l’expression ESTLORSQUE signal = valeur1 => instructions séquentielles;LORSQUE signal = valeur2 =>instructions séquentielles;LORSQUE signal = valeur3 =>instructions séquentielles;LORSQUE signal = AUTRES =>instructions séquentielles;FIN DE CAS;

Case selecteur iswhen condition1 => instructions ;

…….instructions ;

when condition2 => instructions ; ----when others => instructions ; end case ;

38

Logique séquentielle: les instructions

Exemple de CASE/IS Description d’un registre à décalage

Reg_dec: PROCESS (h)VARIABLE stmp: std_logic_vector(3 DOWNTO 0);BEGINIf (h=‘1’ and h’event) thenCASE selection IS

WHEN ”11”=> stmp := d_entree; --chargement paralelleWHEN ”10”=>stmp:= stmp(2 DOWNTO 0) & edg; --gauche

WHEN ”01”=>stmp:= edd &stmp(3 DOWNTO 1); --droiteWHEN OTHERS => ; --mémorisation

END CASE;sortie <= stmp;END PROCESS Reg_dec;

Schéma de principe d’un registre à décalage SIMPLE

registre à décalage à droite OU à gauche

On peut utiliser une variable à la place d’un signal

Affecttation d’une variable

Mavariable:= ma valeur;

CONTRAIREMENT AU SIGNAUX LA VALEUR EST MISE A JOUR DE SUITE

Rappel: & « colle » les signaux ensemble

la sortie est SYNCHRONE

Pas de retard supplémentaire car utilisation d’une variable

Si emploi d’un signal à la place d’une variable affectation EN DEHORS DU PROCESS ( voir chapitre Mise à jour des signaux et page suivante pour un exemple)

39

Logique séquentielle: des exemples

Registre à décalage simple Sortie série ( 1 seule sortie)

1 --------------------------------------------------2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4 --------------------------------------------------ENTITY shiftreg IS6 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 IS12 SIGNAL internal: STD_LOGIC_VECTOR (n-1 DOWNTO 0);13 BEGIN14 PROCESS (clk, rst)15 BEGIN16 IF (rst='1') THEN17 internal <= (OTHERS => '0');18 ELSIF (clk'EVENT AND clk='1') THEN19 internal <= d & internal(internal'LEFT DOWNTO 1);20 END IF;21 END PROCESS;22 q <= internal(0);23 END behavior;24 --------------------------------------------------

40

Logique séquentielle: des exemples

Registre à décalage Sortie parallèle Choix du sens

LIBRARY ieee;USE ieee.std_logic_1164.all;USE work.std_arith.all;entity DECAL_DG isport (H,R,SENS :in std_logic;IN_OUT,OUT_IN :inout std_logic);end DECAL_DG;architecture ARCH_DECAL_DG of DECAL_DG issignal Q :std_logic_vector(3 downto 0);beginprocess(H,R)beginif 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;

Emploi de signaux et non de variables

Affectation en dehors du process

41

Logique séquentielle: des exemples

Une RAMLIBRARY ieee;USE ieee.std_logic_1164.all; ---------------------------------------------------ENTITY ram ISGENERIC ( bits: INTEGER := 8; -- # of bits per word

words: INTEGER := 16); -- # of words in the memoryPORT ( 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 ISTYPE vector_array IS ARRAY (0 TO words-1) OF STD_LOGIC_VECTOR (bits-1 DOWNTO 0);SIGNAL memory: vector_array;BEGINPROCESS (clk, wr_ena)BEGINIF (clk'EVENT AND clk='1') THEN

IF (wr_ena='1') THENmemory(addr) <= data_in;

END IF;END IF;END PROCESS; data_out <= memory(addr);END ram;

Création d’un nouveau type: TYPE

C’est un tableau de vecteursDéclaration d’un signal du type créé précédemment

42

Logique séquentielle: des exemples

Diviseur de fréquence Diviseur par comptable Possibilité de faire par décomptage aussi

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_arith.all;entity DIV_FREQ1 isport (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 issignal Q :std_logic_vector(3 downto 0);beginprocess(H)beginif (H'event and H='1') thenif 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 d’un diviseur de fréquence

•On évitera de cascader la sortie du diviseur sur l’horloge du bloc suivant

•La bonne méthode:Horloge du système LA même pour tous les blocsLa sortie du diviseur est une entrée de validation du bloc suivant

Si En=‘1’ alors je compte

43

Logique séquentielle: des exemples

Application et utilisation d’un diviseur de fréquence

LIBRARY ieee;USE ieee.std_logic_1164.all;USE work.std_arith.all;entity COMPTCAS isport (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 issignal X :std_logic_vector(3 downto 0);beginprocess(H,R)beginif R='1' then X <= "0000";elsif (H'event and H='1') thenif 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;

LIBRARY ieee;USE ieee.std_logic_1164.all;USE work.std_arith.all;entity COMPT12 isport (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 issignal X :std_logic_vector(11 downto 0);signal CO1,CO2,CO3,EN1 :std_logic;component COMPTCASport (H,R,EN : in std_logic;CO : out std_logic;Q : out std_logic_vector(3 downto 0));end component;beginCOMPTEUR1 : 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;

COMPOSANT HAUT NIVEAU

44

Logique séquentielle: des exemples

Détection d’un front Détection d’un changement d’état d’un signal Contrainte: DESCRIPTION SYNCHRONE

Detection: PROCESS        VARIABLE detect : std_logic_vector(1 DOWNTO 0);        BEGIN            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';              END IF;             IF detect = "10" THEN                         front_descendant <= '1';             END IF;        END PROCESS; 

Rappel:

la variable prend sa valeur instannément

Le signal prend sa valeur à la sortie du process

Équivalent à

Process(clk)

If (clk=‘1’ and clk’event)

……

45

Bibliographie

Certaines illustrations et exemples proviennent de cours ou d’ouvrages présents ci-dessous

Introduction à la Synthèse 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 l’étudiant GEII http://perso.orange.fr/xcotton/electron/coursetdocs.htm