WikiElectronique

Wiki sur l'électronique et l'informatique

Outils pour utilisateurs

Outils du site


vhdl

VHDL

Le Very High Speed Integrated Circuit Hardware Description Language (abrégé en VHDL, qui est lui-même une abréviation de VHSIC HDL) est un langage de description du matériel, destiné à décrire le comportement et/ou l'architecture d’un « module » de logique matérielle, c'est-à-dire une fonction combinatoire et/ou séquentielle.

Détails techniques

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é du VHDL provient du fait qu'il est possible d'exprimer facilement le parallélisme présent à l'intérieur d'un circuit.

Le but d'un tel langage de description du matériel est de faciliter 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é. L'idée est de ne pas avoir à réaliser (fondre) un composant réel, en utilisant à la place des outils de développement permettant de 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, à l'aide d'éléments logiques concrets (portes logiques, bascules ou registres). Ceux-ci seront implémentés, selon la technologie utilisée, soit en transistors (dans le cas d'un ASIC), ou plus couramment en se basant sur les éléments programmables des FPGA. Pour ce dernier cas, il faut alors passer encore par des phases de placement et de routage qui consistent à placer les éléments synthétisés en fonction des ressources particulières disponibles dans les différentes puces FPGA.

Historique

Originellement commandé par le ministère de la défense américain, celui-ci lui a finalement préféré le langage Verilog HDL, très similaire. 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 maintenant principalement utilisé par les entreprises européennes.

La version initiale 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. Celui-ci 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, ainsi que la “force” d'un signal (faible, forte ou nulle). La norme IEEE 1164 définit le type std_logic avec 9 états possibles. Ceci a été adopté dans le VHDL-93 (seconde version de la norme IEEE 1076).

Afin de répondre aux différents problèmes de l'électronique, la norme VHDL a du évoluer. L'IEEE Design Automation Standards Committee (DASC) a créé la norme IEEE 1076.1, ou VHDL-AMS (VHDL-Analog & Mixed Systems). Cette nouvelle norme est une extension de la norme IEEE 1076-1987 déjà existante. Elle supporte à présent la description et la simulation de circuits analogiques, numériques, et mixtes (analogique et numérique).

Structure d'une description VHDL

Les déclaration de bibliothèques

Ainsi qu'il a été expliqué plus haut, le VHDL ne connaît en standard que le type bit. Le type std_ulogic (et les autres types associés std_logic, std_ulogic_vector et std_logic_vector) sont définis dans un module externe (un package) contenu dans la bibliothèque normalisée ieee. Afin de pouvoir utiliser le type std_logic, il faut donc déclarer ce package. Toute description VHDL commence donc invariablement par cette déclaration.

library ieee;
use ieee.std_logic_1164.all;

Il est possible de définir ses propres packages et bibliothèques. On les déclare alors en même temps que la bibliothèque IEEE. Dans le cas où on définit un package qui ne doit servir que pour un projet donné, il sera compilé dans la bibliothèque de travail (work) qui n'a pas besoin d'être déclarée.

library ieee, ma_bibliotheque;
use ieee.std_logic_1164.all;
use ma_bibliotheque.mon_package.all;
use work.mon_autre_package.all

L'entity

C'est la définition des entrées/sorties d'une description VHDL.

entity Nom_de_l_entity is   
  generic (
    parametre_generique : type := valeur_par_defaut; -- la valeur par défaut est optionnelle
    ...
    dernier_parametre : type := valeur_par_defaut); -- noter la parenthèse, qui ferme la liste des paramètres
  port (
    nom_du_port : direction type;
    ...
    dernier_port : direction type); -- noter la parenthèse, qui ferme la liste des ports
end entity Nom_de_l_entity;

L'architecture

C'est la définition de la fonction réalisée par une description VHDL. Une architecture est toujours associée à une entity.

architecture nom_d_architecture of nom_de_l_entity is
  -- déclarations
begin
  -- code
end architecture nom_d_architecture;

FIXME

Le process

C'est une partie de code qui est exécutée séquentiellement à la manière d'un microcontrôleur. Un process est déclenché sur un changement d'état d'un signal.

Nom_du_process: process(signal_déclencheur)   
begin 
   -- code
end process Nom_du_process
Exemple: Une bascule D
ARCHITECTURE bascule_d OF xxx IS
 
BEGIN
 
  bascule : PROCESS (clk, reset)
    IF reset =1THEN
      q <= 0;
    ELSIF clk’event AND clk =1THEN
        q <= d;
    END IF;
  END bascule;
 
END bascule_d;
bascule : PROCESS (clk, reset)

Le process sera démarré à chaque changement de clk ou reset

IF clk’event AND clk =1THEN
        q <= d;

On recopie d sur q à chaque front montant sur clk. Si on avait voulu le faire sur front descendant on aurait écrit :

IF clk’event AND clk =0THEN

Le process s'exécute à chaque front d'horloge (puisque l'on est en logique synchrone).

Pour clore cette partie, voici deux morceaux de code équivalents:

IF clk’event AND clk =1THEN 
IF rising_edge(clk) THEN

Les signaux

Le signal permet de connecter les circuits implantés sous forme de processus.

Exemple: Une bascule T
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
 
entity BASCULET is
  port (
    D,CLK : in std_logic;
    S : out std_logic);
end BASCULET;
 
architecture DESCRIPTION of BASCULET is
signal S_INTERNE : std_logic; -- Signal interne
begin
  PRO_BASCULET : process (CLK)
  Begin
    if (CLK'event and CLK ='1') then
      if (D =1) then
        S_INTERNE <= not (S_INTERNE);
      end if;
    end if;
  end process PRO_BASCULET;
  S <= S_INTERNE;
end DESCRIPTION;

Divers exemples

Compteur 4 bits
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
 
entity CMP4BITS is
PORT (
  CLOCK : in std_logic;
  Q : inout unsigned(3 downto 0));
end CMP4BITS;
 
architecture DESCRIPTION of CMP4BITS is
begin
  process (CLOCK)
  begin
    if (CLOCK ='1' and CLOCK'event) then
       Q <= Q + 1;
    end if;
  end process;
end DESCRIPTION;
Compteur / Décompteur 4bits
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
 
entity CMP4BITSLUD is
PORT (
  RESET, CLOCK, LOAD, UP: in std_logic;
  DATA : in std_logic_vector (3 downto 0);
  Q : out std_logic_vector (3 downto 0));
end CMP4BITSLUD;
 
architecture DESCRIPTION of CMP4BITSLUD is
signal CMP: unsigned (3 downto 0);
begin
 
process (RESET,CLOCK)
begin
  if RESET ='1' then
    CMP <= "0000"; -- Remise à zero asynchrone du compteur
  elsif (CLOCK ='1' and CLOCK'event) then
if (LOAD =1) then
  CMP <= unsigned(DATA); -- Préchargement synchrone
  else
      if (UP =1) then
        CMP <= CMP + 1; -- Incrémentation synchrone
      else
        CMP <= CMP – 1; -- Décrémentattion synchrone
      end if;
    end if;
end if;
end process;
Q <= std_logic_vector(CMP);
end DESCRIPTION;

Une partie du contenu de cette page provient de Wikipédia, publiée sous licence GNU FDL. La liste complète des auteurs est disponible sur cette page. Bibliographie: Introduction à la Synthèse logique VHDL, Langage VHDL et conception de circuits

vhdl.txt · Dernière modification: 2017/12/06 16:13 (modification externe)