CHAPITRE 1 : Les circuits logiques programmables (PLD) GRARI K. 1 I. INTRODUCTION 1) Circuit logique programmable • Un circuit logique programmable, ou réseau logique programmable, est un circuit intégré logique qui peut être reconfiguré après sa fabrication. • Il est composé de nombreuses cellules logiques élémentaires et bascules logiques librement connectables • Comme dans toute réalisation en logique câblée, une fonction logique est définie par les interconnexions entre des opérateurs combinatoires et des bascules GRARI K. 2 I. INTRODUCTION 2) Structure de base d’un PLD La plupart des PLDs suivent la structure suivante : Un ensemble d’opérateurs « ET » sur lesquels viennent se connecter les variables d’entrée et leurs compléments. Un ensemble d’opérateurs « OU » sur lesquels les sorties des opérateurs « ET » sont connectées. Une éventuelle structure de sortie (Portes inverseuses, logique 3 états, registres...). GRARI K. 3 I. INTRODUCTION 2) Structure de base d’un PLD • Les deux premiers ensembles forment chacun ce qu’on appelle une matrice. Les interconnexions de ces matrices doivent être programmables. • C’est la raison pour laquelle elles sont assurées par des fusibles qui sont « grillés » lors de la programmation. • Lorsqu’un PLD est vierge toutes les connexions sont assurées. GRARI K. 4 I. INTRODUCTION 2) Structure de base d’un PLD : exemple • La figure ci dessous représente la structure interne d’un PLD ayant ses fusibles intacts. Les équations logiques : Q1 Q0 Fusible intact a b GRARI K. 5 I. INTRODUCTION 2) Structure de base d’un PLD : exemple • Si on veut obtenir les fonctions ci dessous« grillera » des fusibles de façon à obtenir le schéma suivant : Q1 Q0 Fusible intact a b GRARI K. 6 I. INTRODUCTION 3) Les différents types des circuits intégrés • Les standards : – Codeurs, Latchs, AOP, CAN, etc. • Avantages : – Leur coûts sont faibles car ils sont produits en très grandes quantité GRARI K. 7 I. INTRODUCTION 3) Les différents types des circuits intégrés • Un ASIC : – application-specific integrated circuit, littéralement « circuit intégré propre à une application », est un circuit intégré développé pour un client)c’ est un circuit intégré (micro-électronique) spécialisé. En général, il regroupe un grand nombre de fonctionnalités uniques ou sur mesure. • Avantages : – Solution rentable lors d’une fabrication à grand nombre d’exemplaire – Maximum de performances GRARI K. 8 I. INTRODUCTION 3) Les différents types des circuits intégrés • Les programmables: – C’est un compromis entre les deux types de circuits précédents : – Configurables : PAL, CPLD, FPGA – Programmables : Microprocesseurs, microcontrôleurs • Avantages : – Il faut viser le maximum d’applications spécifiques possibles grâce à un unique circuit standard – L’intérêt des programmables est de pouvoir couvrir un large spectre d’applications GRARI K. 9 II. Les différents types de PLD 1) Quatre familles de PLD PLD PAL GAL EPLD GRARI K. FPGA 10 II. Les différentes familles de PLD 1) PAL (Programmable Array Logic): • • • Développés au début des années 70 par MMI (exAMD) La programmation se fait par destruction de fusibles Aucun fusible n’est grillé à l’achat de la PAL La fusion des fusibles est obtenue en appliquant à leurs bornes une tension de 11,5 V pendant 10 à 50µS (leur tension de fonctionnement est environ de 5V) en utilisant un programmateur adapté. GRARI K. 11 II. Les différentes familles de PLD 1) PAL (Programmable Array Logic): • La plupart des P.A.L. sont constitués : – – – – Un ensemble de portes « ET » sur lesquelles viennent se connecter les variables d’entrée et leurs compléments. Un ensemble de portes « OU » sur lesquelles les sorties des opérateurs « ET » sont connectées les variables d’entrée. Le nombre d’entrées varie entre 10 et 22. Le nombre de sorties varie entre 1 et 10. GRARI K. 12 II. Les différentes familles de PLD 1) PAL (Programmable Array Logic): GRARI K. 13 II. Les différentes familles de PLD 1) PAL (Programmable Array Logic): • Exemple : PAL22V10 GRARI K. 14 II. Les différentes familles de PLD 2) GAL (Generic Array Logic): • • • • Un GAL est un PAL effaçable électriquement Développés il y a un peu plus de 10 ans, par l’entreprise LATTICE Ils peuvent donc être reprogrammés à volonté sans pour autant avoir une durée de vie restreinte. dans leur structure interne les GALs sont constitués de transistor CMOS alors que les PALs classiques sont constitués de transistors bipolaires. GRARI K. 15 II. Les différentes familles de PLD 2) GAL (Generic Array Logic): • • • • La consommation des GALs est beaucoup plus faible. D’autres constructeurs fabriquent les GAL’s en les appelant « PAL CMOS ». Les GAL sont dotés d’un bit de sécurité qui peut être activé lors de la programmation empêchant ainsi toute lecture du contenu du circuit. Ce bit est remis à zéro seulement en effaçant complètement le GAL. GRARI K. 16 II. Les différentes familles de PLD 2) GAL (Generic Array Logic): • Exemple : GAL16V8 GRARI K. 17 II. Les différentes familles de PLD 3) EPLD (Erasable Programmable Logic Device) • • Circuit logique reprogrammable, effaçables par exposition aux ultraviolets Avec une grande capacité GRARI K. 18 II. Les différentes familles de PLD 4) FPGA (Forecasting Programmable Gate Array) • • • Réseau de portes programmables sur sites Evolution de CPLD mais avec un concept différent Offre un niveau d’intégration très élevé par rapport aux autres GRARI K. 19 II. Les différentes familles de PLD 4) FPGA (Forecasting Programmable Gate Array) Blocs logiques Interconnexion programmable Bloc d’entrée/sortie GRARI K. 20 III. FPGA 1) • Les différents types FPGA programmable une seule fois (OTP) – – – • Logique combinatoire : portes logiques traditionnelles AND et OR Logique séquentielle : flip-flops Interconnexions : type anti-fusible FPGA reprogrammable (SRAM) – – – – Logique combinatoire dans des look up tables (LUT) : type SRAM. Logique séquentielle : flip-flops. Possibilité de configuration des blocs logiques Il faut une mémoire externe (par ex. PROM) pour la sauvegarde de la configuration (en cas de hors tension) GRARI K. 21 III. FPGA 2) Constitution des FPGA • Constituée de deux couches: – – La couche opérative comporte une structure régulière de cellules logiques identiques entourées d’un réseau d’interconnexions La couche de configuration est un ensemble de cellules mémoires statiques (SRAM) qui, d’une part, configurent les cellules logiques de la couche opérative et, d’autre part, établissent leurs interconnexions (chemins de routage) GRARI K. 22 III. FPGA 2) Constitution des FPGA • Constituée de deux couches: GRARI K. 23 III. FPGA 3) Routage • • Les algorithmes de placement et de routage font un compromis entre l’utilisation des ressources disponibles et la vitesse Les délais de propagation des signaux dépendent du routage (non prédictible) GRARI K. 24 III. FPGA 3) Routage Cellule logique Commutateur •Point de connexion (passe-transistor) •Génère un temps de propagation GRARI K. 25 III. FPGA 4) Le processus de configuration (Ex. : carte SPARTAN-3E) • Tout d’abord, la configuration (bitstream) est enregistrée dans un circuit mémoire flash PROM externe, pour permettre la conservation des informations lorsque le système est hors tension Téléchargement, via un câble USB, GRARI K. 26 III. FPGA 4) Le processus de configuration (Ex. : carte SPARTAN-3E) • Après la mise sous tension, ou en appuyant sur le bouton configuration restart, le bitstream est copié de manière série dans la SRAM du circuit FPGA Flash PROM Bouton « configuration restart » GRARI K. 27 CHAPITRE 2 : Introduction et règle d’écriture de VHDL GRARI K. 28 I. INTRODUCTION 1) VHDL: GRARI K. 29 I. INTRODUCTION 1) L’histoire de VHDL • 1980 : Le DOD a financé un projet pour créer un langage de description de matériel (HDL) • 1987 : le langage de description VHDL est devenu une norme IEEE numéro 1076 . • 1993 : VHDL est révisé pour supprimer quelques ambiguïtés et améliorer la portabilité du langage La norme est révisée tous les 5 ans (P1076-87, P1076-93, P1076-2000, P1076-2002, P1076-2006) GRARI K. 30 I. INTRODUCTION 1) L’utilité de VHDL • VHDL est un langage de description matériel (HDL) destiné à représenter le comportement d’un système électronique numérique. • Mais aussi à synthétiser le système c'est-à-dire être le transformé par des logiciels adaptés (synthétiseurs) en une série de portes logiques (NETLIST) prêtes à être implémentées sur un circuit reconfigurable (FPGA,EPLD, CPLD…) • VHDL est l'un des trois grands langages de description de matériel utilisés majoritairement dans l'industrie, avec Verilog et SystemC. GRARI K. 31 II. Les avantages de VHDL 1) Un langage complet • VHDL couvre les différentes étapes de la conception de systèmes numériques: Spécifications, modélisation, simulation, synthèse. Spécifications Synthèse VHDL Modélisation Simulation GRARI K. 32 II. Les avantages de VHDL 2. Un langage indépendant • VHDL n’appartient à personne en particulier, qui aurait le pouvoir sur son évolution et son utilisation. Son indépendance vis-à-vis des architecture et technologie est totale. GRARI K. 33 II. Les avantages de VHDL 3. Un langage flexible • VHDL permet à l’ utilisateur d’effectuer ses descriptions en se plaçant à différents niveaux d’abstraction: Niveau comportemental : haut niveau Niveau intermédiaire Niveau structurel : bas niveau GRARI K. 34 II. Les avantages de VHDL 4. Un langage moderne • Sa syntaxe est particulièrement lisible et permet de minimiser les commentaires, ses mécanismes de partitionnement et d’empaquetage permettent la conception modulaire, l’archivage, et la réutilisation. GRARI K. 35 II. Les avantages de VHDL 5. Un langage ouvert • VHDL est standardisé en 1987, grâce à son évolution il a put durer, VHDL est donc un langage ouvert mais ses évolutions sont contrôlées en devenant elles aussi standard. GRARI K. 36 II. Règles d’écriture de VHDL 1. Commentaires • • Ils débutent par un double tiret du 6 « -- » et se prolongent jusqu’à la fin de la ligne. Si le commentaire doit se poursuivre sur la ligne suivante, un double tiret est nécessaire. Exemple: A<=B and C; --en VHDL le symbole <= effectue une -- une assignation : A prend la valeur -- de l’ opération (B and C) GRARI K. 37 II. Règles d’écriture de VHDL 2. Majuscules et minuscules • VHDL ne distingue pas les majuscules des minuscules: pour lui BONJOUR est identique à bonjour ou à BoNjOuR GRARI K. 38 II. Règles d’écriture de VHDL 3. Identificateurs • VHDL manipule de nombreux objets : signaux, paquetages, processus, etc. Désignés par leur nom. Les règles de dénomination sont les mêmes pour tous: Le nom est constitué d’une suites de caractères : 26 lettres de l’alphabet, les 10 chiffres et tiret 8 ‘_’ Le premier caractère doit être une lettre Il ne peut y avoir deux tirets 8 « _ » de suite L’identificateur ne peut se terminer par « _ » Le nom ne doit pas être un mot réservé de VHDL GRARI K. 39 II. Règles d’écriture de VHDL 4. Noms réservés • Ces mots-clés ne peuvent être utilisés comme identificateurs: GRARI K. 40 II. Règles d’écriture de VHDL abs access after alias all and configuration impure constant in disconnect inertial downto inout else is elsif label null of on open or others rem report return rol ror select type unaffected units until use variable architecture array assert attribute begin block body buffer bus case component end entity exit file for function generate generic group guarded if out package port postponed procedure process pure range record register reject severity signal shared sla sll sra srl subtype then to transport wait when while with xnor xor library linkage literal loop map mod nand new next nor not GRARI K. 41 II. Règles d’écriture de VHDL 5. Littéraux • Ce sont des valeurs explicites attribués à différents objets: constantes, variables… Entier : 123 1_2_3 Entier basé : base #valeur# : 2#10# 16#1F# Valeurs physiques : toujours laisser un espace entre la valeur et l’unité : 100 ps 2 ns 5 V Caractères : ils s’ écrivent entre apostrophe : ‘A’,‘a’,‘%’, ‘ ‘ (espace), les caractères acceptés sont les caractères ASCII imprimables. NB ‘A’ est différent de ‘a’. GRARI K. 42 II. Règles d’écriture de VHDL 5. Littéraux Chaine de caractère : elles s’ écrivent entre guillemets : "Bonjour" "bonjour" (ces deux valeurs sont différentes). Une chaine de caractère peut être obtenue en concaténant plusieurs chaine au moyen de l’operateur & . Bits: entre apostrophes, et ont pour seules valeurs ‘0’ et ‘1’. Le type généralisé std_logic utilise en outre les valeurs ‘U’, ‘X’, ‘H’, ‘L’, ‘W’, ‘Z’, et ‘-’. Bus: ils s’écrivent entre guillemets constituées des 0 et 1: "00110" . Par défaut la base de représentation est binaire , mais il est possible d’ utiliser une notation octale ou hexadécimale en préfixant la chaine: O"47" X "12AC" GRARI K. 43 II. Règles d’écriture de VHDL 6. Espaces Les espaces ne sont pas significatifs, sauf dans les valeurs littérales et pour la séparation des identificateurs, ils ne sont pas nécessaire entre identificateurs et symboles. Les deux lignes suivantes sont correctes et équivalentes: A<=B and C; A <= B and GRARI K. C ; 44 II. Règles d’écriture de VHDL 7. Sauts de lignes Une instruction peut s’étendre sur plusieurs lignes, tant que le saut de ligne ne s’ effectue pas au milieu d’un identificateur, d’un symbole d’operateur, ou d’ un littéral. A<=B When C=‘0’ else D; Peut aussi s’ écrire: A<=B When C=‘0’ else D; GRARI K. 45 II. Règles d’écriture de VHDL 8. Fin d’instruction Un fin d’instruction est repéré par le point virgule ‘;’ c’est l’une des erreurs les plus fréquentes. GRARI K. 46 CHAPITRE 3 : Structure d’une description VHDL GRARI K. 47 Exemple d’une description VHDL library ieee; use ieee.std_logic_1164.all; entity add is port(a,b: in std_logic; c: out std_logic); end add; architecture archi1 of add is begin c<=a and b; GRARI K. end archi1; Déclaration des bibliothèques Déclaration de l’entité a b c Déclaration d architecture a c b 48 I. Bibliothèque : Library • Une bibliothèque est une bibliothèque ou sont stockées des entités, des architectures, des paquetages. • Elles sont déclarées en en-tête d’une description VHDL par l’instruction library • l’instruction use permet de sélectionner quels objets pourront être utilisés dans la suite de la description. • Les bibliothèques work et std sont toujours accessible sans besoin de déclaration GRARI K. 49 I. Bibliothèque : Library 1. exemple LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY « nom »; •« nom » : est symbolique et ENTITY cmpl_sig IS définit par l'outil de compilation PORT ( a, b, sel : IN std_logic; •Note : Work et STD pas x, y, z : OUT std_logic; END cmpl_sig; nécessaire de les déclarer ARCHITECTURE logic OF cmpl_sig IS USE nom_lib.nom-pacq.objet BEGIN •All est un mot réservé tous les x <= (a AND NOT sel) OR (b AND sel); pacquages y <= a WHEN sel='0' ELSE b; WITH sel SELECT Placer la bibliothèque en premier z <= a WHEN '0', permettra à tout les unités de les b WHEN '1', utilisées '0' WHEN OTHERS; END logic; CONFIGURATION cmpl_sig_conf OF cmpl_sig IS FOR logic END FOR; END cmpl_sig_conf; GRARI K. 50 I. Bibliothèque : Library 2. Bibliothèque STD •Contient les pacquages suivants: – standard (Types: Bit, Booléen, entier, réel, et le temps. Toutes les fonctions qui supportent ces types) –TEXTIO (opérateur de fichier) •Une bibliothèque implicite – pas besoin d’ être déclaré GRARI K. 51 I. Bibliothèque : Library 3. Types définis dans le pacquage standard •Bit: –2 valeurs logiques (‘0’,’1’) •signal S1 : bit; –Bus de Bit (bit_vector) •signal S3: bit_vector(3 downto 0); •signal temp : bit_vector(0 to 3) ; •Type Booléen •Vrai , Faux GRARI K. 52 I. Bibliothèque : Library 3. Types définis dans le pacquage standard • Entier: Les valeurs positives et négatives en décimal –signal N : integer; -- nombre de 32 bits –signal int_tmp1 : integer range 0 to 255; --nombre de 8 bits –N.B. : Le paquet standard a d'autres types GRARI K. 53 I. Bibliothèque : Library 4. Bibliothèque IEEE • Contient les packages suivants: –std_logic_1164 (types de std_logic et fonctions associées) –std_logic_arith (fonctions arithmétiques) –std_logic_signed (fonctions arithmétiques signées) –std_logic_unsigned (fonctions arithmétiques non signé) GRARI K. 54 I. Bibliothèque : Library 4. Bibliothèque IEEE a) le package std_logic_1164 : –Définition des types: std_logic et std_logic_vector •‘U’ : non initialisé •‘X’ : niveau inconnu, forçage fort •‘0’ : niveau 0, forçage fort •‘1’ : niveau 1, forçage fort •‘Z’ : haute impédance •‘W’ : niveau inconnu, forçage faible •‘L’ : niveau 0, forçage faible •‘H’ : niveau 1, forçage faible •‘-’: quelconque GRARI K. 55 I. Bibliothèque : Library 4. Bibliothèque IEEE b) le package std_logic_arith : –Les opérateurs de base : +, -, *, –Les comparateurs de base : <=, >=, /=, = GRARI K. 56 I. Bibliothèque : Library 4. Bibliothèque IEEE b) Déclaration d’une bibliothèque: LIBRARY <nom de bibliothèque>; USE <nom de bibliothèque >.<nom de paquetage >.all; GRARI K. 57 II. Entité 1. L’entité • l'entité est une vue externe du module, elle définit toutes les entrées et les sorties IN1 IN2 IN3 BOITE NOIRE Entrées Sorties Types GRARI K. OUT1 OUT2 58 II. Entité 2. Syntaxe entity Nom_entité is port(Nom_entrée_1 : in type; Nom_entrée_2 : in type; Nom_entrée_3 : in type; ..... Nom_sortie_1 : out type; Nom_ent_sor_1 : inout type); end Nom_entité; GRARI K. 59 II. Entité 3. Port: •Les entrées et les sorties d'un module sont toujours représentées par un port, il en existe 4 différents types, qui sont: – – – – in : port d'entrée. out : port de sortie. inout : port bidirectionnel (utilisation pour des bus). buffer : port de sortie qui peut être relu (ne pas utiliser) GRARI K. 60 II. Entité 3. Port: •Un signal de type buffer ne peut pas être connecté directement avec un signal de type out (le VHDL est typé). Il est nécessaire d’utiliser un cast. Cela n’est pas très pratique. Nous déconseillons l’utilisation de ce type! Nous verrons plus tard comment se passer de ce type en utilisant un signal interne dans l’architecture GRARI K. 61 II. Entité 4. Exemple •Prenant comme exemple l'entité d'un multiplexeur 8 à 1 avec 3 entrées de sélection. Sel A B C D E F G H 2 1 0 Multiplexeur S 8à1 GRARI K. 62 II. Entité 4. Exemple •Ecrire l’entité d’un additionneur Add4 de deux mots, a et b, de 4 bits en entrée, avec une retenue entrante retin, et une sortie som sur 4 bits avec une retenue sortante retout. GRARI K. 63 II. Entité 4. Exemple •Dessiner le schéma du composant correspondant à l’entité suivante : entity exemple is port(b : in bit; clk : in bit; raz : in bit; a : inout bit); end exemple; GRARI K. 64 III. Architecture 1. L’architecture • Le corps d’une architecture définit le corps d’une entité de conception. Il spécifie les relations entre les entrées et les sorties d’une entité de conception. • La partie déclarative déclare des objets qui seront visibles et utilisables par l’entité de conception. • Toutes les instructions qui décrivent le corps de l’architecture sont des instructions concurrentes qui s’exécutent de façon asynchrone les unes par rapport aux autres. GRARI K. 65 II. Architecture 1. L’architecture • La relation entre les entrées et les sorties d’une entité peut être exprimée sous forme Logique, TDV, Flotdon, Comportementale, M-Etat, Structurelle, ces formes peuvent coexister à l’intérieur d’un même corps d’architecture: – Logique: Equations logiques, description du fonctionnement directement avec des équations logiques. – TDV: Table de vérité, description du fonctionnement avec une table de vérité (utilisation de l'instruction with ... select). GRARI K. 66 II. Architecture 1. L’architecture – Flot_Don: Flot de données, description du fonctionnement très proche du fonctionnement logique (utilisation des instructions concurrentes <=, when ...else ou with ... select) – Comportementale: description du fonctionnement en décrivant le comportement (exemple: description avec un process et de l'instruction if... then ... else) – M _Etat: Machine d'état, description du fonctionnement à l'aide d'une machine d'état – Structurelle: description du module en donnant les interconnexions entre différents sous modules (description hiérarchique avec l'instanciation de composant) GRARI K. 67 II. Architecture 1. L’architecture • Dans un circuit logique, toutes les portes fonctionnent simultanément. On dit alors que les portes fonctionnent de manière concurrente, c'est-à-dire que l'ensemble des opérations se déroulent en parallèle. • Le langage VHDL a été créé dans le but de pouvoir décrire le comportement d'un circuit. Le langage dispose donc d'instructions concurrentes. Cette notion est particulière au langage de description de matériel. GRARI K. 68 II. Architecture 1. L’architecture • Parfois, il est plus performant de décrire le comportement en utilisant un algorithme en utilisant une instruction tel que le if .. then .. else . C'est la raison de l’existence, dans le langage VHDL, d’une instruction concurrente particulière, l’instruction process. Celle-ci permet de décrire le comportement du circuit avec des instructions séquentielles. A l'intérieur de cette instruction le déroulement des instructions est séquentiel. GRARI K. 69 III. Architecture 2. Syntaxe architecture nom_architecture of nom_entité is --déclarations sous-programmes, types --constantes, signaux, alias, composants Zone de déclaration begin Instructions_Concurrentes; process (Liste_De_Sensibilité) Begin Instructions_Séquentielles; end process; end nom_architecture; GRARI K. Zone de définition 70 III. Architecture 3. Exemple architecture Flot_Don of Multiplexeur is begin with Sel select S <= A when "000", B when "001", C when "010", D when "011", E when "100", F when "101", G when "110", H when "111", 'X' when others; end Flot_Don; GRARI K. 71 III. Architecture 3. Exemple • Ecrire l’architecture (description logique) d’un additionneur Add4 de deux mots, a et b, de un bit en entrée, une sortie som somme sur un bits avec une retenue sortante ret. GRARI K. 72 IV. Package • • • VHDL supporte et encourage la conception modulaire et hiérarchique : les paires entités/architectures peuvent être réutilisée et partagées. Les structures permettant de regrouper ces entités/architectures pour faciliter la réutilisation sont appelées packages (paquetages) Certains paquetages sont inclus dans l’outils de développement d'autres sont créer par l’utilisateur afin de regrouper des définitions, des sousprogrammes, .. pour son projet. (chapitre 5) GRARI K. 73 V. Description comportementale et structurelle • Il existe deux façons distinctes de décrire une structure. L'une dite comportementale et l'autre structurelle. Comportemental • Ce que fait l’entité Structurel • Comment elle le fait GRARI K. 74 V. Description comportementale et structurelle 1. Description comportementale • La description de la fonctionnalité est faite sans hypothèse sur sa réalisation concrète, ni référence à l’architecture matérielle. C’est sur l’intelligence du synthétiseur que repose l’efficacité de la méthode, à lui d’interpréter la description pour la traduire en logique concrète. Elle favorise la portabilité, la lisibilité, la maintenance et l’évolutivité. • • GRARI K. 75 V. Description comportementale et structurelle 1. Description comportementale : exemple comparateur A B Comparateur = C Entity comparateur is A,B : in bit; C : out bit; End comparateur; GRARI K. 76 V. Description comportementale et structurelle 1. Description comportementale : exemple comparateur architecture comportem1 of comparateur is Begin C <= 1 when A=B else ‘0’; end comportem1; • Ou avec l’équation xor architecture comportem2 of comparateur is Begin C <= not(A xor B); end comportem2; GRARI K. 77 V. Description comportementale et structurelle 2. Description structurelle • La fonctionnalité est décrite par utilisation et interconnexion de composant élémentaires, de manière similaire à un schéma. La description s’attache principalement à la réalisation, à l’implémentation de la fonction. Le qualificatif « structurel» désigne, dans la terminologie VHDL, ce qui est interconnecté par des signaux • GRARI K. 78 V. Description comportementale et structurelle 2. Description structurelle • Dans cette forme de description, le concepteur se substitue largement au synthétiseur dans sa fonction d’interprétation VHDL inclut les mécanismes et constructions permettant de choisir le niveau de description le plus approprié • GRARI K. 79 V. Description comportementale et structurelle 2. Description structurelle • À tout moment, éventuellement d’une ligne de description à l’autre , c’est le concepteur qui décide du niveau de description : les deux niveau et leurs intermédiaires peuvent coexister pacifiquement au sein d’une même description GRARI K. 80 V. Description comportementale et structurelle 2. Description structurelle : exemple comparateur • Une description structurelle est l’équivalent littéral d’un schéma représentant l’interconnexion de portes élémentaires. Ici le comparateur est composé d’un composant «ou exclusif à deux entrées» et un composant «inverseur» • A C B GRARI K. 81 V. Description comportementale et structurelle 2. Description structurelle : exemple comparateur Use work.gatespkg.all; architecture structurelle of comparateur is Signal int1 : bit; begin U0 : xor2 port map (A,B,int1); U1 : inv port map (int1,C); end structurelle; GRARI K. 82 CHAPITRE 4 : Les objets et les éléments de VHDL GRARI K. 83 I. Les objets 1. Signaux • Les signaux représentent l'interconnexion physique (fils) processus (fonctions) qui communiquent entres eux Les signaux peuvent être déclarés dans les packages, entité et architecture Un signal interne n’a pas de mode (sens), ce n’est qu’un fil d’interconnexion • • Fonction 1 Signal GRARI K. Fonction 2 84 I. Les objets 1. Signaux • Déclaration des signaux: signal bus_local : std_logic_vector(7 downto 0) ; signal bus_ent, bus_sort : bit; GRARI K. 85 I. Les objets 1. Signaux • Affectation d’un signal par l’instruction "<=" . Nom_du_signal <= expression; • Exemple : bus1 <= A or B ; bus2 <= (bus1 and not(C xor D)); A bus1 B C D E bus2 GRARI K. 86 I. Les objets 1. Signaux • Affectation d’une valeur à un signal signal bus_local : std_logic_vector (7 downto 0); Tous les bits bus_local <= “10101010”; bus_local <= x”AA” ; Un seul bit Groupe de bit N.B. bus_local (7) <= ‘1’; bus_local (7 downto 4) <= “1010”; un seul bit guillemet simple (‘) Multi-bit guillemet double (“) GRARI K. 87 I. Les objets 2. Variable • Est un objet capable de retenir une valeur, pendant une durée limitée, elle ne peut être employée qu’à l’ intérieur d’un process. A l’opposé d’un signal une variable n’est pas une liaison concrète, et ne laissera pas une trace âpres synthèse. Stockage temporaire • Sans retard GRARI K. 88 I. Les objets 2. Variable • Déclaration d’une variable variable nom__variable : type_de vairable; variable indice : integer; • Affectation d’une valeur à une variable " := " nom__variable :=valeur_de vairable; Indice := 12; • Déclaration et affectation variable indice : integer := 12; GRARI K. 89 I. Les objets 2. Variable • Les affectations de variables sont mis à jour immédiatement – N’entraine pas un retard GRARI K. 90 I. Les objets 2. Variable • Affectation d’une valeur à une variable variable temp : std_logic_vector (7 downto 0); Tous les bits temp := “10101010”; temp := x”AA” ; Un seul bit Groupe de bit N.B. temp (7) := ‘1’; temp (7 downto 4) := “1010”; un seul bit guillemet simple (‘) Multi-bit guillemet double (“) GRARI K. 91 I. Les objets 2. Variable • Comparaison entre signal et variable Signal (<=) Affectation Utilité Champ d’application Variable (:=) signal <= affectation Variable := affectation Représente l'interconnexion physique Représente un stockage local Global (Communication entre PROCESS) locale (à l’intérieur du process) Comportement Mis à jour à la fin de la déclaration du processus (Nouvelle valeur non disponible) GRARI K. Mise à jour immédiate (Nouvelle valeur disponible) 92 I. Les objets 3. Constantes • Une constante peut être assimilée à un signal interne auquel est associée une valeur fixe et définitive. La déclaration de constante est rarement une nécessitée, plus généralement une simplification d’écriture pour une meilleure compréhension, une meilleure lisibilité et une meilleur évolutivité. • GRARI K. 93 I. Les objets 3. Constantes • Déclaration d’une constante et affectation (:=) constant nom__const : type_de vairable := valeur_cont; • Exemple: contant zero : bit_vector (1 downto 0) := ”00”; contant huit_ou_plus : std_logic (3 downto 0) := ”1---”; GRARI K. 94 I. Les objets 3. Alias • Une déclaration d’alias permet de dénommer un objet de différentes manières. GRARI K. 95 I. Les objets 3. Alias • Exemple : un bus de 32 bits (dbus) que l’on souhaite pouvoir utiliser indifféremment par octet. signal dbus : bit_vector (31 downto 0); • • Pour designer l’octet du poids fort on nomme dbus(31 downto 24) Pour designer l’octet du poids faible on nomme dbus(7 downto 0) GRARI K. 96 I. Les objets 3. Alias • Exemple : cette méthode devient rapidement fatigante si les sous-éléments sont utilisé fréquemment, une autre solution consiste à redéfinir le signal dbus par des alias signal dbus : bit_vector (31 downto 0); alias octet3 : bit_vector(7 downto 0) is dbus (31 downto 24); -- octet3 c’est l'octet du poids fort; alias octet0 : bit_vector(7 downto 0) is dbus (7 downto 0); -- octet0 c’est l'octet du poids faible; GRARI K. 97 I. Les objets 3. • Alias Exemple : – Refaire pour octet2 et octet1 – Refaire pour les deux demi-mot du signal dbus GRARI K. 98 II. Operateurs 1. Operateurs standard : operateurs logiques Catégorie and nand or nor xor xnor not signification Et Non-et Ou Non-ou Ou exclusif Egal (non ou-excusif) non GRARI K. Type entrée/sortie boolean Bit Bit_vector 99 II. Operateurs 2. Operateurs standard : operateurs relationnels Catégorie = /= < <= > >= signification Type entrée résultat Egal Non égal Tout type boolean scalaire Inferieur Inferieur ou égal Supérieur Supérieur ou égal GRARI K. 100 II. Operateurs 3. Operateurs standard :operateurs arithmétiques Catégorie + * / abs ** mod rem signification Unaire (signe +) ou addition Unaire (signe -) ou soustraction Multiplication Division Valeur absolue Exponentiation Modulo reste GRARI K. Type entrée/sortie Integer real integer 101 II. Operateurs 4. Operateurs standard : Décalage Catégorie signification sll (shift left logical) décalage logique à gauche srl (shift right logical) décalage logique à droite rol (rotate left ) rotation logique à gauche ror (rotate right) rotation logique à droite GRARI K. Type entrée/sortie bit_vector 102 II. Operateurs 5. Operateurs standard : Décalage • Exemple: Instruction “1100” sll 1 “1100” srl 2 “1100” rol 1 “1100” ror 2 • Résultat “1000” “0011” “1001” “0011” 1100” ror –1 est la meme chose que “1100” rol 1 GRARI K. 103 II. Operateurs 6. Operateurs standard : Concaténation Catégorie & signification concaténation GRARI K. Type entrée/sortie entrée résultat bit Bit_vector Bit_vector 104 II. Operateurs 7. Operateurs standard : priorité Plus élevé exponentiation Valeur absolue Ordre de priorité des opérateurs multiplication addition décalage GRARI K. Plus bas relationnel logique 105 II. Operateurs 7. Operateurs standard : priorité • Tous les operateurs logiques sont de même priorité, l’utilisation des parenthèse est nécessaire des qu’une incertitude d’ interprétation existe. A B E C D E<= (A and B) or (C and D) E<= A and B or C and D GRARI K. 106 II. Operateurs 7. Operateurs standard : Exemple • Prenant comme exemple l‘architecture d'un multiplexeur 8 à 1 avec 3 entrées de sélection. Sel A B C D E F G H 2 1 0 Multiplexeur S 8à1 GRARI K. 107 II. Operateurs 7. Operateurs standard : Exemple • Ecrire l’ensemble d’un fichier VHDL (Library, Entity, Architecture) qui décrit une porte OU à 2 entrées a et b de 1 bit (sortie s) GRARI K. 108 II. Operateurs 7. Operateurs standard : Exemple • Ecrire l’ensemble d’un fichier VHDL (Library, Entity, Architecture) qui décrit un additionneur ADD4 à 2 entrées de 4 bits A et B signées et une sortie S de 4 bits GRARI K. 109 II. Operateurs 7. Operateurs standard : Exemple • Ecrire l’ensemble d’un fichier VHDL (Library, Entity, Architecture) permettant la concaténation de 2 bus de 4 bits A et B en un bus C de 8 bits (le bus A représente les bits de poids fort). GRARI K. 110 CHAPITRE 5 : Fonctionnements concurrents et séquentiels GRARI K. 111 Fonctionnement concurrents et séquentiels • • Instruction concurrente : instruction à l’extérieur des process. Instruction séquentielle : instruction à l’intérieur d’un process GRARI K. 112 I. Fonctionnements concurrents • • • VHDL se distingue des langages de programmation traditionnels par une caractéristique majeure : les instructions sont évaluées en permanence et toutes simultanément Chez les logiciens ce type de fonctionnement est appelé parallèle ou concurrent Chez les électroniciens on parle de fonctionnement combinatoire GRARI K. 113 I. Fonctionnements concurrents • Exemple : A<=B; B<=C; • En programmation traditionnelle on comprendrait: – – • A prend la valeur de B, Puis B prend la valeur de C (sans effet rétroactif sur A) En VHDL on a : – – – À tous moment A prend la valeur de B, et À tous moment B prend la valeur de C, Autrement dit à tout moment A,B et C ont la même valeur l’ordre des instructions n’a pas d’importance. GRARI K. 114 I. Fonctionnements concurrents • Exemple : Logique combinatoire E B D A C Architecture ex1 of exem is Begin A <= B and C; B <= D and E; End ex1; Architecture ex2 of exem is Begin B <= D and E; A <= B and C; End ex2; GRARI K. 115 II. Fonctionnements séquentiels • • • • Ce mode concerne uniquement les fonctions, procédure et process Les process manipulent les variables et signaux Au sein de ces descriptions, les déclarations sont exécutées de manière séquentielle, l’une après l’autre L’ordre des déclarations est donc important GRARI K. 116 II. Fonctionnements séquentiels 1. • process Un process est un groupe délimité d’instructions, doté de trois caractéristiques essentielles : – Le processus s’exécute à chaque changement d’ état d’un des signaux auxquels il est déclaré sensible. – Les instructions du processus s’exécutent séquentiellement, – Les modifications apportées aux valeurs de signaux par les instructions prennent effet à la fin du processus. GRARI K. 117 II. Fonctionnements séquentiels 1. • process La structure d’un processus est la suivante: nom_optionnel : process (liste_de_signaux) --partie déclarative du process begin --instructions séquentiels end process nom_optionnel; • ou nom_optionnel : process --partie déclarative du process begin --instructions séquentiels wait on (liste_de_signaux) end process nom_optionnel; GRARI K. 118 II. Fonctionnements séquentiels 1. • • • • process Le nom du process est optionnel, le même nom devra en fin du processus. Le mot-clé process est suivi de la liste dite de sensibilité Il est possible de remplacer la liste de sensibilité par une instruction wait on placée à la fin du corps de process dans la partie declarative du processus sont listées les variables locales du processus. GRARI K. 119 II. Fonctionnements séquentiels 2. • • • Déclenchement d’un process Un process se déclenche à chaque changement d’état d’un de ses signaux d’activation Et se rendort jusqu’au prochain déclenchement. La liste des signaux déclenchant le processus est appelée liste de sensibilité et figure entre parenthèse derrière la déclaration de processus GRARI K. 120 II. Fonctionnements séquentiels 2. Déclenchement d’un process : exemple bascule D • L’un des exemples les plus simples concerne la description d’une bascule-D GRARI K. 121 II. Fonctionnements séquentiels Library ieee; Use ieee.std.logic_1164.all; Entity bascule_D is port( D, CLK : in std_logic; Q : out std_logic); End bascule_D; Architecture arch_basc_D of bascule_D is Begin Process (CLK) Begin If (CLK=‘1’) then Q <= D; End if; End process; End arch_basc_D; GRARI K. 122 II. Fonctionnements séquentiels 2. Déclenchement d’un process : exemple bascule D • Process (CLK) : la liste de sensibilité se limite à un signal : CLK son changement (0 à 1 ou 1 à 0) déclenchera l’exécution du processus If ( CLK=‘1’) then Q<=D : s’il s’agit d’un front montant de CLK alors la valeur de la sortie Q prend la valeur de l’entrée D if : fin d’instruction if, l’absence de clause else est interprétée comme signifiant : sinon la sortie Q ne change pas . End process : c’est à ce moment seulement que sont mises à jour les valeurs des signaux évalués dans le processus • • • GRARI K. 123 II. Fonctionnements séquentiels 3. Mise à jour des valeurs de signaux : R. à D. • Les valeurs de signaux d’un process ne prennet effet qu’a la fin du processus (end process) Ce comportement est important comme le montre l’exemple du registre à décalage de deux bits • D_IN D_OUT S1 Registre à décalage CLK GRARI K. 124 II. Fonctionnements séquentiels Library ieee; Use ieee.std.logic_1164.all; Entity reg_dec is port( D_IN, CLK : in std_logic; D_OUT : out std_logic); End reg_dec; Architecture arch_reg_dec of reg_dec is Signal S1 : std_logic; Begin Process (CLK) Begin If (CLK=‘1’) then S1 <= D_IN; D_OUT<=S1; End if; End process; GRARI K. End arch_reg_dec; 125 II. Fonctionnements séquentiels 3. Mise à jour des valeurs de signaux : R. à D. • If (CLK=‘1’) then : les assignations suivantes ne s’effectueront que s’il s’agit d’un front montant de CLK S1<=D_IN : sur le front montant de CLK le signal interne S1 prend la valeur de l’entrée D_IN D_OUT<=S1 : sur le même front montant de CLK, D_OUT prend la valeur du signal interne S1. les instructions du processus étant exécutées séquentiellement, on pourrait penser que, S1 ayant déjà pris sa nouvelle valeur, D_OUT prend à son tour cette nouvelle valeur. La règle n°3 des processus : les valeur des signaux ne sont mises à jour qu’à la fin du processus • • GRARI K. 126 II. Fonctionnements séquentiels 4. Liste de sensibilité multi signaux : bascule D RZ • Rien n’empêche un processus d’être sensible à plusieurs signaux, c’est même le cas le plus courant. Prenant l’exemple d’une bascule D avec remise à zéro • D_IN Q CLK NRESET GRARI K. 127 II. Fonctionnements séquentiels 4. Liste de sensibilité multi signaux : bascule D RZ Library ieee; Use ieee.std.logic_1164.all; Entity D_RAZ is port( D, NRESET, CLK : in std_logic; Q : out std_logic); End D_RAZ; Architecture arch_D_RAZ of D_RAZ is Begin Process (CLK,NRESET) Begin If NRESET=‘0’ then Q<=‘0’; elsif CLK=‘1’ then Q<=D; End if; End process; End arch_D_RAZ; GRARI K. 128 II. Fonctionnements séquentiels 4. Liste de sensibilité multi signaux : bascule D RZ • Process(CLK,NRESET) : le processus est sensible aux changement d’état des signaux CLK et NRESET If NRESET=‘0’ then q<=‘0’ : lorsque le signal NRESET passe à 0, la sortie Q est à zéro. La séquentialité des instructions dans le processus est importante : puisque le signal NRESET est testé d’ emblée, il est donc prioritaire : les instructions suivantes ne seront exécutées que si NRESET est inactif (à ‘1’) Elesif CLK=‘1’ then Q<=D : si NRESET est inactif et CLK est à 1, alors la sortie Q prend la valeur de l’entrée D. • • GRARI K. 129 II. Fonctionnements séquentiels 4. Liste de sensibilité multi signaux : bascule D RZ Chronogramme D CLK NRESET Q 1 2 GRARI K. 3 130 II. Fonctionnements séquentiels 4. Liste de sensibilité multi signaux : bascule D RZ • D’après le chronogramme la description précédente n’est pas conforme au fonctionnement d’une bascule D avec remise à zéro Le problème vient d’une mauvaise interprétation de la condition if CLK=‘1’ on ne souhaiterait exécuter les instructions associés que si c’est réellement le signal CLK qui a déclenché le processus et non par une autre condition alors que CLK se trouvait à ‘1’ VHDL permet de résoudre ce problème via l’attribut event • • GRARI K. 131 II. Fonctionnements séquentiels 5. Attribut event • L’attribut event accolé à un signal permet de reconnaitre si le déclenchement du processus est dut à ce signal La description correcte du processus est: • Process (CLK,NRESET) begin If NRESET=‘0’ then Q<=‘0’; elsif (CLK event and CLK=‘1’) then Q<=D; End if; End process; • Il est recommandé de toujours utiliser la forme if(CLK event and CLK=‘1’) pour décrire un front montant et if(CLK event and CLK=‘0’) pour décrire un front descendant GRARI K. 132 CHAPITRE 6 : Instructions GRARI K. 133 Instructions • • • Certaines instructions VHDL ne sont utilisables qu’en mode séquentiel c’est-à-dire à l’intérieur d’un processus d’autres seulement en mode concurrent (hors processus) L’instruction if…then…else est utilisée seulement à l’intérieur du processus Mais l’instruction when…else hors de processus exclusivement GRARI K. 134 I. Instruction en mode concurrent 1. • • Assignation inconditionnelle C’est la plus utilisée des instructions Forme générale : Signal <= expression; • Exemple: A <= B and C; • • A prend la valeur de l’opération (B and C) Autres exemples: F <= 124; Bus_in <= ¨0000¨; GRARI K. 135 I. Instruction en mode concurrent 2. • Assignation conditionnelle Forme générale: Signal <= {expression when condition} else expression; • Exemple: A <= B when (C=‘1’) else D; • • A prend la valeur de B si C est égal à ‘1’ sinon A prend la valeur de D la condition testée doit être booléenne. L’assignation conditionnelle peut être à double détente, exemple: A <= B when S=T else C when S=U else ‘0’; GRARI K. 136 I. Instruction en mode concurrent 2. • Assignation conditionnelle Si les conditions listés sont exclusives, la logique sera synthétisée sans ambigüité. Si les condition ne sont pas exclusives, alors la logique sera synthétisé compte tenu de l’ordre de déclaration des conditions. Exemple: A <= B when (C=‘0’) else D when (E=‘1’) else ‘0’; • Il est fortement conseillé que les conditions soient exhaustives. l’exemple sera traitée comme: A <= B when (C=‘0’) else D when (C=‘1’ and E=‘1’) else ‘0’; GRARI K. 137 I. Instruction en mode concurrent 4. • Assignation sélective Forme générale: With selecteur select Signal <= {expression when valeur_selecteur ,} [expression when others]; • Cette expression permet d’assigner différentes valeurs à un signal, selon la valeur prise par une expression appelée sélecteur: prenant l’exemple: GRARI K. 138 I. Instruction en mode concurrent 4. Assignation sélective Architectutre arch_sel of expl_sel is Signal ETAT : std_logic_vector(1 downto 0); Signal X, A, B, C, D : std_logic; Begin with ETAT select X <= A when ¨¨00¨, B when ¨01¨, C when ¨10¨, D when others; End Arch_sel; • X prend la valeur de A si le signal ETAT, utilisé comme sélecteur, vaut ¨00¨, B si le sélecteur vaut ¨01¨, etc. GRARI K. 139 I. Instruction en mode concurrent 4. Assignation sélective with (A2 & A1 & A0) select CS <= ‘0’ when ¨¨010¨, ‘1’ when others; • La termination de l’instruction par when others est toujours recommandée, de manière à regrouper toutes les valeurs éventuellement non listées du sélecteur, par exemple le sélecteur ETAT de l’exemple 1 est de type std_logic il existe plus de quatre cas (XX et ZX) GRARI K. 140 II. Instruction en mode séquentiel 1. • Assignation inconditionnelle de signal Elle a la même forme que l’assignation en mode concurrent. Dans un processus les nouvelles valeurs des signaux sont calculées au fur et à mesure des assignations, mais ne prennent effet qu’à la fin du processus. A <= (B and C); • A va prendre la valeur de (B and C) GRARI K. 141 II. Instruction en mode séquentiel 2. • Assignation inconditionnelle de variable Forme générale: Var :+ expression; • Contrairement à l’assignation de signal, l’assignation de variable prend effet immédiatement. GRARI K. 142 II. Instruction en mode séquentiel 3. • • Assignation conditionnelle Elle peut s’appliquer aux variable aussi bien qu’aux signaux, les exemple ci-dessous concernent des signaux. Forme générale: If condition then instructions {elsif condition then instructions} [else instructions] End if; GRARI K. 143 II. Instruction en mode séquentiel 3. Assignation conditionnelle : exemple if LOAD=‘1’ then CNT <= DATA_IN; else CNT <= CNTT + 1; end if; • • Si le signal LOAD vaut ‘1’ alors CNT va prendre la valeur de DATA_IN, sinon CNT + 1, la condition testée doit être booléenne. Chacune des branches conditionnelles peut être constituée d’une séquence d’instructions, incluant le cas échéant une nouvelle instruction if: if LOAD=‘1’ then CNT <= DATA_IN; elsif C_EN = ‘1’ then if C_UP=‘1’ then CNT <= CNT + 1; else CNT <= CNT – 1; end if; end if; GRARI K. 144 II. Instruction en mode séquentiel 4. Assignation sélective • Forme générale : Case selecteur is {when valeur_selecteur} => {instruction} [when others => {instruction}] End case; • Le sélecteur est une expression dont les différentes valeurs possibles permettent de générer des actions différenciées • Les valeurs utiles du sélecteur sont listées au moyen de clause when chacune associée à une liste d’instruction • Les valeurs restantes sont regroupés sous la clause when others GRARI K. 145 II. Instruction en mode séquentiel 4. • Assignation sélective Exemple: Case AD is When X¨0¨ => CS <= ¨100¨; When X¨8¨ | X¨9¨ | X¨A¨ | X¨B¨ => CS <= ¨010¨; When X¨1¨ | X¨2¨ => CS <= ¨001¨; When others => CS <= ¨000¨; End case; GRARI K. 146 II. Instruction en mode séquentiel 4. Assignation sélective • Exemple: – Case AD is : le sélecteur est le bus AD, de largeur 4 bits – When X¨0¨=>CS<=¨¨100¨: lorsque AD vaut 0, le vecteur intermédiaire est positionné à ¨100¨ – When X¨8¨|X¨9¨|X¨A¨|X¨B¨=>CS<=¨010¨: lorsque AD vaut de 8 à B (hex) le vecteur intermédiaire est positionné à ¨010¨ – When X¨1¨|X¨2¨=>CS<=¨001¨: lorsque AD vaut 1 ou 2, le vecteur intermédiaire CS est positionné à ¨001¨ – When others => CS <=¨000¨: dans tous les autres cas le vecteur intermédiaire CS est positionné à ¨000¨, elle garantie un ‘point de chute’ à tous les valeurs possibles du selecteur GRARI K. 147 II. Instruction en mode séquentiel 5. Boucle for…loop • Forme générale: [étiquette :] for variable boucle in intervalle loop {instructions} End loop [étiquette]; • Pour chaque valeur successive de de la variable de boucle dans l’intervalle indiqué, exécuter les instructions listées. • La variable de boucle, qui n’a pas à être déclarée au préalable, peut bien entendu être utilisée par les instructions de la boucle. La lise d’instructions peut contenir toute instruction séquentielle, par exemple conditionnelle ou nouvelle boucle. GRARI K. 148 II. Instruction en mode séquentiel 5. Boucle for…loop • Exemple: Boucle1 : for indice in 7 downto 0 loop If indice = then d_bus(indice) <= databus(15); Else d_bus(indice) <= not(d_bus(15-indice)); End if; End loop boucle1; GRARI K. 149 II. Instruction en mode séquentiel 6. Boucle while…loop • Forme générale: [étiquette :] while condition loop {instructions} End loop [étiquette]; • Tant que la condition est vraie, exécuter les instructions de la boucle ( les instructions de la boucle doivent assurer que la condition deviendra fausse au bout d’un temps fini) • La synthèse aisée de cette boucle impose que la condition testée soit statique, c’est-à-dire figée au moment de la compilation GRARI K. 150 II. Instruction en mode séquentiel 6. Boucle while…loop • Exemple TOTAL :=15; I:=15; Boucle2 : while I >=0 loop If compte(I)= ‘0’ then TOTAL := TOTAL-1; Else TOTAL :=TOTAL-2; End if; I := I-2; End loop boocle2; GRARI K. 151 II. Instruction en mode séquentiel 7. Boucle next et exit: • L’instruction next permet de terminer une itération de boucle sans exécuter les instructions suivante, l’instruction exit permet de terminer l’ exécution de la boucle. • Exemple: C:=0; Boucle3 : for k in 1 to 7 loop If DBUS(k)=‘0’ then next; Elseif DBUS(k)=‘1’ and DBUS(k-1)=‘1’ then exit boucle3; Else C:=C+1; End if; End loop boucle3; GRARI K. 152 III. Mémorisation implicite • Cette caractéristique propre à VHDL, est importante à appréhender car elle apporte autant d’avantage lorsqu’elle est utilisée à bon escient que de mauvaise surprise lorsqu’elle est oubliée. • En VHDL, les signaux ont une valeur courante et une valeur prochaine, déterminée par l’operateur d’assignation. Si lors d’une instruction conditionnelle un signal reçoit une assignation dans une branche, alors il doit recevoir une assignation dans toutes les autres branche : si ce n’est pas le cas chaque absence d’assignation signifie que la prochaine valeur du signal est identique à la valeur courante et le synthétiseur génère une logique de mémorisation (registre, latch) afin de préserver cette valeur courante GRARI K. 153 III. Mémorisation implicite • Avantage : simplification de la description des fonctionnement basés sur des signaux d’horloge. • Exemple Precess (CLK) If (CLK’event and CLK=‘1’) then Q1 <= D_IN; Q2 <= Q1; Q3 <= Q2; End if; End process; • Les sorties ne changent d’état que sur un front d’horloge (FM) lorsque le processus est déclenché par l’autre front d’horloge les sorties ne doivent pas changer la clause else donc inutile GRARI K. 154 III. Mémorisation implicite • La description est équivalente à: Precess (CLK) If (CLK’event and CLK=‘1’) then Q1 <= D_IN; Q2 <= Q1; Q3 <= Q2; Else Q1 <= Q1; Q2 <= Q2; Q3 <= Q3; End if; End process; GRARI K. 155 CHAPITRE 7 : Fonctions et procédures GRARI K. 156 Fonctions et procédures • • • • Les fonctions et procédures de VHDL sont équivalentes à celles des langages de programmation traditionnels Les fonctions ne possèdent que des paramètres d’entrée et retournant un seul résultat Les procédures possèdent des paramètres d’entrées, de sortie (multiples) et paramètres d’entrée modifiable Les fonctions sont plus utilisées, pour les procédures on préfère généralement les instanciations de composant GRARI K. 157 I. Description de fonctions • L’exemple suivant décrit une fonction BIT_BOOL, assurant la conversion du type bit en type booléen Function BIT_BOL (A : bit) return boolean is Begin If A=‘1’ then return (TRUE); Else return (FALSE); End if; End BIT_BOOL; • Function BIT_BOL (A: bit) return boolean is : le mot réservé function est suivi du nom donné à la fonction. Les paramètres d’appel –ici un seul- sont listés avec leur type par défaut les paramètres d’appel acceptés peuvent être des constantes ou des signaux. GRARI K. 158 I. Description de fonctions • • • En cas de restriction de type d’objet peut apparaitre explicitement, par exemple (signal A : bit) pour exclure les constantes. Enfin le type du résultat retourné est indiqué Begin : marque la fin de la partie déclarative de variables internes de la fonction ici vide Les fonction sont des constructions séquentielles, utilisant les instructions de cette catégorie. Toutefois, contrairement aux processus, les fonctions ne sont pas synchronisé c’est-à-dire pas de signaux d’horloge la logique synthétisé sera du type combinatoire GRARI K. 159 II. Ou déclarer la fonction Package CONVERSION is Function BIT_BOL (A : bit) return boolean; --autre fonction de conversion -End CONVERSION; Package body CONVERSION is Function BIT_BOL (A : bit) return boolean is Begin If A=‘1’ then return (TRUE); Else return (FALSE); End if; End BIT_BOOL; --description des autres fonctions -End CONVERSION; GRARI K. 160 III. Appel de fonction • Les fonctions s’appellent de manière classique, en s’assurant que les opérandes d’entrée sont listés dans l’ordre correct, et sont du type requis C <= BIT_BOOL(D); • Le paquetage contenant la fonction doit avoir fait au préalable l’objet d’une déclaration d’utilisation, via la clause use, par exemple: Use work.CONVERSION.all; GRARI K. 161 CHAPITRE 8 : Modularité GRARI K. 162 I. Modularité Un description est modulaire si elle est partitionnée en plusieurs sous-ensembles. VHDL supporte et encourage la conception modulaire qui offre de nombreux avantages • Les descriptions sont plus simple • Les durées de simulation est de mise au point sont raccourcies • La fiabilité est améliorée du fait de sa simplicité, chaque sous ensemble peut être testé seul • Les sous-ensembles sont réutilisables. Et plus un module est simple, plus grande est chance d’être réutilisé GRARI K. 163 I. Modularité • Exemple : pour illustrer l’intérêt des composants et des paquetages par un exemple progressif : on prend l’exemple d’un comparateur 4 bits en respectant sa forme structurelle constituée de 4 composants xnor2 et d’un composant and4 A B 4 4 C GRARI K. 164 I. Modularité • Exemple : l’entité du comparateur s’écrit: Entity comp4 is port( A , B : in bit_vector(3 downto 0); C : out bit) ; End comp4; GRARI K. 165 II. Description à plat • Une description à plat ou schéma à plat est une représentation sans hiérarchie. La description de notre comparateur s’effectue en deux étapes : 1) Description des éléments de base, à savoir l’élément xnor2 et l’élément and4 2) Description du comparateur en utilisant les éléments préalablement décrits (xnor2 et and4) GRARI K. 166 II. Description à plat • Le fichier VHDL obtenu est le suivant: • Description de l’élément xnor2 Entity xnor2 is port( X,Y : in bit; XN : out bit); End xnor2; Architecture archxnor2 of xnor2 is Begin XN <= not (X xor Y); End archxnor2; GRARI K. 167 II. Description à plat • Description de l’élément and4 Entity and4 is port( D, E, F, G : in bit; H : out bit); End and4; Architecture archand4 of and4 is Begin H <= D and E and F and G; End archand4; GRARI K. 168 II. Description à plat • Description du comparateur Entity comparateur4 is port( A,B: bit_vector ( 3 downto 0 ); C : out bit); End comparateur4; Architecture archcomp of comparateur4 is Signal I : bit_vector ( 3 downto 0); Begin Premièr_xnor : xnor2 port map (A(0), B(0), I(0)); Deuxième_xnor : xnor2 port map (A(1), B(1), I(1)); Troisième_xnor : xnor2 port map (A(2), B(2), I(2)); Quatrieme_xnor : xnor2 port map (A(3), B(3), I(3)); And_des_quatre : and4 port map (I(0), I(1), I(2), I(3), C); End archcomp; GRARI K. 169 II. Description à plat • • • • NB : les trois descriptions c’est le même fichier VHDL de description du comparateur La portée des descriptions xnor2 et and4 est limitée à l’entité/architecture comparateur4 D’autres fonction qui souhaiteraient utiliser également xnor2 et and4 devraient à leur tour recompiler ces fonctions Pertes de temps et manque de souplesse GRARI K. 170 II. Description à plat • EXEMPLE : faite une description à plat A B 4 4 C GRARI K. 171 III. Description modulaire sans package • Elle permet de rendre les descriptions xnor2 et and4 accessible à qui le veut c.à.d. modulaire On décrit xnor2 et and4 hors de la description globale et en les déclarant dans comparateur4 comme component Comme les signaux internes, les composants sont listés dans la partie déclarative de l’ architecture: • • – – Le nom du composant est celui de l’entité à laquelle il est associé La liste des signaux est elle aussi identique à celle de l’entité associée GRARI K. 172 III. Description modulaire sans package • • • Elle est possible ainsi de séparer la compilation des descriptions xnor2 et and4 de celle de comparateur4 Apres compilation, xnor2 et and4 sont stockés dans la bibliothèque work Lors de la compilation de comparateur4, les déclarations de composants autoriseront l’aces aux éléments souhaités GRARI K. 173 III. Description modulaire sans package • Les deux fichiers VHDL obtenus sont les suivants : – Description des composants: Entity xnor2 is port(X,Y : in bit; XN : out bit); End xnor2; Architecture archxnor2 of xnor2 is Begin XN <= not (X xor Y); End archxnor2; Entity and4 is port(D, E, F, G : in bit;H : out bit); End and4; Architecture archand4 of and4 is Begin H <= D and E and F and G; End archand4; GRARI K. 174 III. Description modulaire sans package – Description des composants: Entity comparateur4 is port( A,B: bit_vector ( 3 downto 0 ); C : out bit); End comparateur4; Architecture archcomp of comparateur4 is Signal I : bit_vector ( 3 downto 0); Component xnor2 port (X,Y : in bit; XN : out bit); Component and4 port (D, E, F, G : in bit; H : out bit); Begin Premièr_xnor : xnor2 port map (A(0), B(0), I(0)); Deuxième_xnor : xnor2 port map (A(1), B(1), I(1)); Troisième_xnor : xnor2 port map (A(2), B(2), I(2)); Quatrieme_xnor : xnor2 port map (A(3), B(3), I(3)); And_des_quatre : and4 port map (I(0), I(1), I(2), I(3), C); End archcomp; GRARI K. 175 III. Description modulaire sans package • • N.B. la description du compteur4 est maintenant modulaire, cependant si elle utilise une cinquantaine de composants externes alors une cinquantaine de déclaration ce qui rendra la description de l’architecture plus difficile D’où la nécessité d’une description modulaire avec package GRARI K. 176 III. Description modulaire sans package • EXEMPLE : faite une description à plat A B 4 4 C GRARI K. 177 IV. Description modulaire avec package • • • On regroupe les composants pour y accéder plus facilement ce regroupement est le package Les déclarations de component sont sortie de l’architecture appelante, et regroupées dans un paquetage, pour notre exemple on appel portes La déclaration de chaque composant dans l’architecture utilisatrice est remplacé par une déclaration globale d’utilisation du paquetage portes en tète de cette même architecture: Use work.portes.all; GRARI K. 178 IV. D.M. avec package -- description package portes Package portes is Component xnor2 port (X,Y : in bit; XN : out : bit); End component; Component and4 port (D, E, F, G : in bit; H : out bit); End component; End portes; -- description xnor2 Entity xnor2 is port(X,Y : in bit; XN : out bit); End xnor2; Architecture archxnor2 of xnor2 is Begin XN <= not (X xor Y); End archxnor2; -- Description and4 Entity and4 is port(D, E, F, G : in bit; H : out bit); End and4; Architecture archand4 of and4 is Begin H <= D and E and F and G; End archand4; GRARI K. 179 IV. Description modulaire avec package Entity comparateur4 is port( A,B: bit_vector ( 3 downto 0 ); C : out bit); End comparateur4; Use work.portes.all; -- declaration d’acces au package portes Architecture archcomp of comparateur4 is Signal I : bit_vector ( 3 downto 0); Begin Premièr_xnor : xnor2 port map (A(0), B(0), I(0)); Deuxième_xnor : xnor2 port map (A(1), B(1), I(1)); Troisième_xnor : xnor2 port map (A(2), B(2), I(2)); Quatrieme_xnor : xnor2 port map (A(3), B(3), I(3)); And_des_quatre : and4 port map (I(0), I(1), I(2), I(3), C); End archcomp; GRARI K. 180 IV. Description modulaire avec package • Package : – Une fois un package est constitué, compilé et archivé dans une bibliothèque, un paquetage peut être accéder par quiconque à l’aide de la directive : Use nom_library.nom_package.all – – Un paquetage peut contenir un nombre quelconque d’élément Une description peut faire appel à plusieurs paquetages : il lui suffit de lister autant de use qu’il ya de paquetage GRARI K. 181 IV. Description modulaire avec package • Component : port map – Permet d’associer les signaux de l’architecture appelante à ceux du composant Entity xor2 is port (I1, I2 : in bit; O1 : out bit); U0 : xor2 port map (A, B, INT); -- A relié a I1,B à I2 -- INT à O1 – Ou : U0 : xor2 port map (I2=>B, I1=>A, O1=>INT); A I1 O1 B I2 GRARI K. INT 182