VHDL

VHDL est un conçu pour représenter le comportement mais aussi l'architecture d'un dispositif électronique numérique. Son nom complet est VHSIC Hardware Description Language.



Catégories :

Conception électronique - Électronique - Langage informatique

Page(s) en rapport avec ce sujet :

  • Le langage de description de matériel VHDL est : - un langage moderne, lisible, ... correspondant à une spécification d'entité, une architecture, une... (source : carg2.epfl)
  • Description de l'architecture. En VHDL le comportement du composant est décrit... La compilation qui se nomme "analyse"en VHDL, est effectuée par défaut... (source : comelec.enst)
  • VHDL. Une description VHDL constituée dʼun couple entité/ architecture peut être figée dans un... VHDL est un langage particulièrement riche (trop peut-être) qui permet... (source : ief.u-psud)

VHDL est un conçu pour représenter le comportement mais aussi l'architecture d'un dispositif électronique numérique. Son nom complet est VHSIC[1] Hardware Description Language.

L'intérêt d'une telle description réside dans son caractère exécutable : une spécification décrite en VHDL peut être vérifiée par simulation, avant que la conception détaillée ne soit terminée. En outre, les outils de conception assistée par ordinateur servant à passer directement d'une description fonctionnelle en VHDL à un schéma en porte logique ont révolutionné les méthodes de conception des circuits numériques, ASIC ou FPGA.

Historique

Le langage VHDL a été commandé par le Département de la Défense des États-Unis dans le cadre de l'initiative VHSIC[2]. Dans un effort de rationalisation, le VHDL reprend la même syntaxe que celle utilisée par le langage Ada (ce dernier étant aussi développé par le département de la défense).

La version d'origine de VHDL, standard IEEE 1076-1987, incluait un large éventail de types de données, numériques (entiers, réels), logiques (bits, booléens), caractères, temps, plus les tableaux de bits et chaînes de caractères.

L'un des principaux problèmes concernait le type bit. Ce dernier ne pouvant prendre que 2 valeurs (0, 1), il était impossible de représenter les signaux de valeur inconnue ou encore les signaux en haute impédance, mais aussi la «force» d'un signal (faible, forte ou nulle). La norme IEEE 1164 définit le type std_logic avec 9 états envisageables. Ceci a été adopté dans le VHDL-93 (seconde version de la norme IEEE 1076).

Pour répondre aux divers problèmes de l'électronique, la norme VHDL a dû évoluer. L'IEEE Design Automation Standards Committee (DASC) a créé la norme IEEE 1076.1 (1999), ou VHDL-AMS (VHDL-Analog & Mixed Systems). Cette nouvelle norme est une extension de la norme IEEE 1076-1987 déjà existante. Elle permet la description et la simulation de circuits analogiques, numériques, et mixtes (analogique et numérique). Pour cela elle utilise en complément des instructions séquentielles et concurrentes un nouveau type d'instructions, dites «simultanées», et qui ont valeur d'équations. En pratique, de plus en plus de simulateurs implémentent cette extension. Par contre, les outils de synthèse analogique associés n'en sont toujours qu'à leurs balbutiements[3].

Positionnement comparé au Verilog

Le langage Verilog, quoique particulièrement différent du point de vue syntaxique, répondait à des besoins identiques. Il existe de fait une quasi équivalence entre les deux langages, d'où l'existence de nombreux scripts de traduction de l'un vers l'autre. Le langage VHDL est désormais le langage de description matérielle surtout utilisé par les entreprises européennes tandis que Verilog est fréquemment préféré de l'autre côté de l'Atlantique.

Introduction au VHDL

Simulation et synthèse

L'objectif d'un tel que le VHDL est de favoriser le développement d'un circuit numérique en fournissant une méthode rigoureuse de description du fonctionnement et de l'architecture du circuit désirée. L'idée est de ne pas avoir à réaliser (fondre) un composant réel, en utilisant à la place des outils de développement servant à vérifier le fonctionnement attendu. Ce langage permet en effet d'utiliser des simulateurs, dont le rôle est de tester le fonctionnement décrit par le concepteur.

L'étape suivante consiste à synthétiser cette description matérielle pour obtenir un composant réalisant les fonctions désirées, avec éléments logiques concrets (portes logiques, bascules ou registres). Ceux-ci seront implémentés, selon la technologie utilisée, soit directement en transistors (dans le cas d'un ASIC), ou en se basant sur les éléments programmables des FPGA. Après la synthèse viennent les phases de :

Ces deux opérations doivent prendre en compte les ressources disponibles sur l'ASIC (surface) ou dans le FPGA (unités programmables).

Le VHDL ayant une double fonction (simulation et synthèse), une partie uniquement du VHDL est synthétisable, l'autre existant seulement pour favoriser la simulation (écriture de modèles comportementaux et de test benches). Selon le support matériel et le logiciel de synthèse utilisés, cette partie pourra être plus ou moins étendue. De façon à obtenir du VHDL synthétisable et portable, il est par conséquent indispensable de se limiter à des constructions simples, dont la transcription en portes et bascules est simple à réaliser. La norme 1076.6 a été initiée pour tenter de définir un sous-ensemble de VHDL «de synthèse».

Le langage

La syntaxe du VHDL est tirée du langage Ada, dont les mots clefs ont été adaptés à la conception matérielle. L'une des particularités du VHDL provient du fait qu'il est envisageable d'exprimer aisément le parallélisme présent à l'intérieur d'un circuit.

En VHDL, tout composant (dans le sens logiciel) est décrit sous deux aspects :

C'est par conséquent l'ARCHITECTURE qui contient la description de la fonction matérielle désirée :

Dans ce dernier cas, la description peut faire usage d'instructions concurrentes, utilisant essentiellement des affectations définitives (A <= B; qui se lit A reçoit B mais correspond à une connexion permanente du signal B vers le signal A) conditionnelles (qui signifie : A reçoit B si la condition est vrai, C sinon, mais toute modification de B, C ou de la condition à un effet immédiat) et sélective (version concurrente du sélecteur switch-case du langage C). Comme leur nom l'indique, les instructions concurrentes simulent le parallélisme des circuits décrits. L'ordre des instructions concurrentes n'a aucun impact sur le circuit décrit.

Cependant, quand une fonction logique est trop complexe pour être décrite par une instruction concurrente, on peut lui substituer une description algorithmique nommée process. Au sein de ces process, les instructions utilisées sont , cette fois-ci, séquentielles. Il s'agit des structures de contrôle classiques des langages de programmation (if-else, case-when, for/while-loop) qui offrent la possibilité de mettre en œuvre n'importe quel algorithme, du moins en simulation.

Lors de la simulation, un process n'est exécuté que sur un déclenchement explicite, autrement il est inactif. Du point de vue matériel, un process est une «boîte noire» dont seul le comportement est décrit mais pas la structure. D'un point de vue logiciel un process se comporte comme une boucle illimitée, dont chaque itération est déclenchée par une activité d'un de ses signaux d'entrée (inclus dans sa liste de sensibilité). Ainsi, les instructions for et while ne sont pas utiles pour décrire des compteurs, contrairement aux croyances habituelles des débutants en VHDL.

Deux difficultés

Double sens du mot «séquentiel»

Instruction «séquentielle» dans un process, s'oppose à instruction «concurrente» (hors d'un process) et non à combinatoire (pour la logique décrite), ce qui forme une source de confusion particulièrement fréquente chez les débutants. En effet, on peut décrire un dispositif combinatoire par un algorithme séquentiel (correspond à une porte ET) comme on peut décrire un circuit séquentiel par une instruction concurrente ('). Seuls les circuits séquentiels synchrones (sensibles aux fronts du signal d'horloge) ne peuvent être décrit qu'avec un algorithme activé sur le front de l'horloge.

Un signal n'est pas une variable

Dans un process, on peut trouver des affectations de signaux ou de variables. Contrairement aux variables, l'affectation du signal n'a pas un effet immédiat. On ne peut modifier que la valeur future du signal. Par défaut, c'est la valeur que prendra ce signal au prochain pas de simulation qui est affectée, valeur qui ne deviendra effective qu'après la fin du process. Ainsi, dans un process, après cinq instructions A <= A+1;, le signal A n'est pas augmenté de 5 mais uniquement de 1. Il faut lire A. futur <= A.présent +1; de sorte que A. présent n'est jamais modifié.

Différences avec un langage de programmation

Le VHDL a deux aspects qui peuvent être contradictoires. Quand il s'agit d'écrire un modèle comportemental qui sera simplement simulé, le langage est compilé puis exécuté par le simulateur. Par contre quand il s'agit de décrire un circuit qui sera créé par un syhthétiseur, la philosophie est sensiblement différente. L'outil de synthèse, devant transformer la totalité du code apporté en une implémentation à base de portes logiques, est conçu pour fonctionner de manière particulièrement cadrée. Il est indispensable de pouvoir lui apporter une description claire (dont la synthèse correspond à l'architecture recherchée) tout en étant le moins spécifique envisageable (pour permettre à l'outil d'optimiser au maximum le circuit généré).

A titre d'exemple, si on désire générer une fonction de logique combinatoire (indépendante de toute horloge), il faudra affecter la totalité des sorties à chaque appel du process, sans quoi l'outil de synthèse, considérant que les sorties non assignées conservent leur ancienne valeur, placera des bascules D en sortie de chaque sortie non affectée. Cette solution est alors particulièrement mauvaise, dans la mesure où elle transforme la fonction en une fonction de logique séquentielle, par conséquent dépendant d'une horloge (qui de plus est spécifiée par l'outil de synthèse, hors de contrôle du concepteur).

Cette différence implique un grand travail en amont et en aval du codage, le circuit décrit doit avoir déjà été pensé avant d'être codé et il doit être vérifié après conception, en termes de nombre de portes et de caractéristiques d'implantation, pour s'assurer qu'aucune erreur de description n'est présente. Ces contraintes particulièrement fortes sur le programmeur entrainent l'adoption de guides de conduites et de méthodes de codage particulièrement strictes.

Ces grandes différences avec un langage de programmation comme le C font du VHDL un langage à part, plus proche de l'électronique que de l'informatique. Il n'est d'ailleurs pas rare de voir implémenté sur des FPGA des architectures de micro-contrôleurs, eux-mêmes programmés en assembleur ou en C dans la suite du projet.

Logiciels pour débuter en VHDL

Environnement de développement intégré

Les principaux fabricants de circuits logiques programmables proposent une version gratuite mais limitée de leurs outils.

Éditeur Produit Licence Synthétiseur Simulateur Remarques
Xilinx ISE Webpack[4] Propriétaire, gratuite, infini Oui Oui Simulateur ModelSim XE Starter gratuit
Altera Quartus II Web Edition[5] Propriétaire, gratuite, 6 mois renouvelable Oui Oui Simulateur ModelSim Altera Edition gratuit
Lattice ispLever starter[6] Propriétaire, gratuite, 6 mois renouvelable Oui Non
Actel Libero[7] Propriétaire, gratuite, 1 an renouvelable Oui Oui Synthétiseur : Synplify Actel Edition (gratuit), Simulateur ModelSim Actel Edition gratuit
Simulateurs seulement
Active-HDL Student Edition[8] Propriétaire, gratuite, 1 an Tiers partie Oui
ModelSim PE Student Edition[9] Propriétaire, gratuite Non Oui
Dolphin Integration SMASH[10] Propriétaire, gratuite Non Oui Simulateur SMASH Discovery gratuit (avec exemples en VHDL)

Éditeur de texte

Edition de VHDL avec Vim

Les environnements de développement mentionnés auparavant permettent tous la saisie d'un fichier VHDL, cependant certains éditeurs de texte proposent des fonctionnalités avancées comme la coloration syntaxique, le totalement automatique, le pliage de code ou encore des macro-commandes. C'est le cas des logiciels libres suivants :

  • Emacs
  • Notepad++
  • Vim
  • Smultron (Mac OSX)
  • Scite
  • gedit (Unix)
  • kwrite (Unix)

Hello World

Certains concepts, comme les fichiers ou l'échelle de temps, n'ont de sens que pour la modélisation d'un composant électronique et ne sont pas accessibles au composant lui-même. L'affichage d'une chaîne de caractères sur la sortie standard étant aussi un concept abstrait, elle n'est envisageable qu'en simulation.

-- Déclaration de l'entité
entity hello_world is
end entity hello_world;
 
-- Déclaration de l'architecture
architecture wiki of hello_world is
begin
  -- Process affiche_texte
  affiche_texte: process is
  begin
    -- Afficher la chaine de caractère "Hello world !" sur la sortie standard du simulateur
    report "Hello world !";
    -- Suspendre l'exécution du process
    wait;
  end process affiche_texte;
end architecture wiki;

Clignotant

Il existe plusieurs descriptions envisageables d'un composant dont l'une de ses sorties change d'état après un temps déterminé.

Un multiplexeur 3 vers 1 (trois architectures concurrentes différentes)

En VHDL, il faut distinguer le contenant du contenu, appelés respectivement entité et architecture.

Le fichier VHDL

Un fichier VHDL doit toujours porter le nom de l'entité qu'il contient (ceci est une règle d'utilisation qui aide à la clarté, elle est même obligatoire avec certains logiciels). Son extension standard est «. vhd», quoiqu'on écrive quelquefois «. vhdl». Avant toute chose, il faut commencer par déclarer l'utilisation des bibliothèques nécessaires au projet :

 -- En VHDL : une ligne de commentaires commence avec deux "-"
 
 -- Il préférable de commencer par importer les bibliothèques VHDL standards normalisées par l'IEEE,
 -- car elles sont nécessaires dans une grande partie des cas.
 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;

Les bibliothèques std_logic_arith, std_logic_signed et std_logic_unsigned, malgré leur nom, ne sont pas normalisées par l'IEEE et leur utilisation est fortement déconseillée. En effet, il est préférable de préciser explicitement le type de chaque vecteur sur lequel on fait une opération (SIGNED ou UNSIGNED) de façon à spécifier son traitement arithmétique. Le comportement des opérations sur les types STD_LOGIC_VECTOR sera différent selon la bibliothèque nommée, ce qui rend leur utilisation hasardeuse.

L'entité

Nous décrivons en premier lieu l'interface (l'entité) d'un composant multiplexeur, entité qui nous servira pour les trois exemples d'architectures concurrentes servant à réaliser un multiplexeur.

 -- Voici un exemple d’entité, décrivant les E/S utilisées
 -- par les trois exemples d’architectures purement concurrentes :
 -- 
 -- ATTENTION, avec certains outils de CAO, l'entité doit avoir le même nom que le fichier (logique_3_vers_1.vhd)
 ENTITY logique_3_vers_1 IS 
 
   PORT
   (
     a   : IN STD_LOGIC;
     b   : IN STD_LOGIC;
     c   : IN STD_LOGIC;
     adr : IN STD_LOGIC_VECTOR (1 downto 0);
     s   : OUT STD_LOGIC
   );
 
 END logique_3_vers_1;

Première Architecture

La première architecture servant à décrire ce multiplexeur utilise directement une formulation booléenne, en particulier adaptée aux équations simples. Cette méthode est particulièrement souple et permet d'écrire toute fonction combinatoire. En contrepartie, elle est peu lisible pour les équations complexes.

 -- Première architecture concurrente décrivant un mux :
 ARCHITECTURE mux_3_vers_1 OF logique_3_vers_1 IS
 
 BEGIN
 
   s <= ( a AND NOT adr(1) AND NOT adr(0) )
     OR ( b AND NOT adr(1) AND     adr(0) )
     OR ( c AND adr(1)     AND NOT adr(0) );
  -- OR ('0'AND adr(1)     AND     adr(0) );  -- Cette dernière ligne est implicite dans l'équation du dessus
 
 END mux_3_vers_1;

Deuxième Architecture

La seconde architecture servant à décrire ce multiplexeur est limitée aux fonctions dont le nombre d'entrées est fixée (n). Elle offre une grande clarté de lecture. Cependant, si on veut que le signal s soit piloté correctement, il est indispensable de prévoir la totalité des états envisageables (9ˆn, car le type std_logic peut prendre 9 valeurs). Cela est fait grâce au cas others. Le comportement en simulation d'un tel multiplexeur sera subtilement différent du premier car les nuances des différentes valeurs de STD_LOGIC ne sont pas traitées. Toute valeur autre que 1 ou 0 mène à un X (conflit).

-- Deuxième architecture concurrente décrivant un mux :
ARCHITECTURE mux_3_vers_1 OF porte_3_vers_1 IS
 
BEGIN
 
  WITH adr SELECT
    s <=  a  WHEN "00",
          b  WHEN "01",
          c  WHEN "10",
         '0' WHEN "11",
         'X' WHEN others;
 
END mux_3_vers_1;

La dernière ligne sert à regrouper l'ensemble des cas non explicitement traités en une seule ligne.

Troisième Architecture

La troisième architecture servant à décrire ce multiplexeur est elle aussi limitée aux fonctions dont le nombre d'entrées est fixée (n) pour lesquelles elle est tout spécifiquement adaptée. Cependant, avec cette méthode il n'est pas obligatoire de lister la totalité des états envisageable, puisque la dernière ligne permet d'appliquer un traitement par défaut. Ici encore, le comportement sera légérement différent puisqu'on ne crée plus d'état'X'mais qu'on ne gère pas non plus les nuances d'états comme le font les opérateurs booléens.

-- Troisième architecture concurrente décrivant un mux :
ARCHITECTURE mux_3_vers_1 OF porte_3_vers_1 IS
 
BEGIN
 
  s <= a  WHEN adr = "00" ELSE
       b  WHEN adr = "01" ELSE
       c  WHEN adr = "10" ELSE
      '0';
 
END mux_3_vers_1;

Architecture séquentielle - une bascule D

La description d'une architecture séquentielle, c'est-à-dire avec l'aide d'une fonction dépendante du temps (ie. de l'horloge) passe par l'utilisation de process.

-- Architecture séquentielle pour une bascule D :
ARCHITECTURE comport OF bascule_d IS
 
BEGIN
 
  bascule : PROCESS (clk, reset)
  BEGIN
    IF reset = '1' THEN
      q <= 0;
    ELSE
      IF clk'event AND clk = '1' THEN        -- équivalent à : IF rising_edge(clk) THEN 
        q <= d;
      END IF;
    END IF;
  END bascule;
 
END comport;

Notes

  1. VHSIC veut dire Very High Speed Integrated Circuit
  2. (en) Peeter Ellervee, Kalle Tammemäe VHDL - VHSIC Hardware Description Language[pdf], Tallinn University of Technology - Department of Computer Engineering, visité le 24 septembre 2008
  3. http ://www. univ-bpclermont. fr/FORMATIONS/Master/meam/cme/cme02. pdf [pdf] p.  30-47
  4. Xilinx : ISE WebPACK
  5. Quartus II Web Edition Software Version 7.2
  6. ispLEVER Starter
  7. Libero
  8. Students - Active-HDL Student Edition
  9. ModelSim - Technical Resources : ModelSim PE Student Edition Overview
  10. SMASH

Voir aussi

Liens externes

Présentations :

Recherche sur Amazon (livres) :



Ce texte est issu de l'encyclopédie Wikipedia. Vous pouvez consulter sa version originale dans cette encyclopédie à l'adresse http://fr.wikipedia.org/wiki/VHDL.
Voir la liste des contributeurs.
La version présentée ici à été extraite depuis cette source le 07/04/2010.
Ce texte est disponible sous les termes de la licence de documentation libre GNU (GFDL).
La liste des définitions proposées en tête de page est une sélection parmi les résultats obtenus à l'aide de la commande "define:" de Google.
Cette page fait partie du projet Wikibis.
Accueil Recherche Aller au contenuDébut page
ContactContact ImprimerImprimer liens d'évitement et raccourcis clavierAccessibilité
Aller au menu