Upload
aminemohamed
View
7
Download
0
Tags:
Embed Size (px)
DESCRIPTION
VHDL par mohamed amine tahiri
Citation preview
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
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