La Bnbox !

Créateur de sourires...

Mon compte

S'inscrire

Recherche

Vous êtes ici : Accueil » Atelier Webmaster » Liste des articles

Atelier Webmaster

Mémo de VHDL

document/atelier/circuitImprime.jpg

VHDL est un acronyme signifiant VHSIC Hardware Description Language, où VHSIC est lui-même l'acronyme de Very High Speed Integrated Circuits, et en français, on pourrait dire : Langage de modélisation de design de circuits logiques digitaux. Bref, en VHDL, on programme des circuits intégrés afin qu'ils exécutent une action. Par exemple, on peut programmer un afficheur 7 segments (le même que celui de votre montre digitale) pour qu'il affiche le chiffre 1, puis le 2, le 3, etc.

Si vous pensiez apprendre le VHDL dans ce tutoriel, je vais devoir vous décevoir. En effet, je ne maitrise pas encore assez ce langage pour me lancer dans une telle aventure. Par contre, un mémo de VHDL, un tutoriel qui rappelle toutes les bases de ce langage rapidement et de manière concise, ça c'est de mon ressort !
Je vous souhaite une bonne lecture mini_bn

Sommaire



Le langage VHDL


Remonter Navigation rapide : Sommaire

Le langage VHDL

Le but de ce mémo est de rappeler de manière concise tout ce qu'il est utile de savoir pour programmer en VHDL. N'hésitez pas à préciser en commentaire les oublis ou les points qui vous semblerez inutiles ou au contraire pas assez détaillés. Bonne lecture bn_big_smile

Types d'objets


Le VHDL admet de nombreux types d'objets et permet la définition de types nouveaux. Voici quelques types existants :


STD_LOGIC

Le type STD_LOGIC : objets représentés sur 1 bit, sur lesquels on peut appliquer toutes les opérations logiques : AND, NAND, OR, NOR, XOR, XNOR, NOT ...
Exemple d'affectation :
Code :
PORT(
    E : IN STD_LOGIC;
    S : IN STD_LOGIC;
);


Valeurs admises pour un STD_LOGIC

Valeur Signification
0 ou L niveau bas
1 ou H niveau haut
Z tri-state = haute impédance
U non initialisé
X initialisé à l'état indéterminé
- sans importance



STD_LOGIC_VECTOR

Le type STD_LOGIC_VECTOR : tableaux à une dimension d'objets de type STD_LOGIC.
Exemple d'affectation :
Code :
PORT(
    E : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
    S : IN STD_LOGIC;
);

On a alors un tableau E : E(0), E(1), E(2) et E(3) de type STD_LOGIC.


INTEGER

Le type INTEGER : objets sur lesquels seront appliqués les opérations arithmétiques élémentaires.
Exemple d'affectation :
Code :
PORT(
    E : IN INTEGER RANGE 0 TO 3;
    S : IN STD_LOGIC;
);

Le domaine de définition d'un INTEGER est en général \mathbb{[} 0,3 \mathbb{]} par défaut.

Opérateurs


Opérateur Opération
+ Addition
- Soustraction
* Multiplication
/ Division
MOD Modulo
REM Reste
= Égalité
/= Différence
< Strictement inférieur
<= Inférieur
> Strictement supérieur
>= Supérieur
& Concaténation
NOT Complément logique
AND ET logique
NAND NON ET logique
OR OU inclusif logique
NOR NON OU inclusif logique
XOR OU exclusif logique
XNOR NON OU exclusif logique
SLL Décalage logique gauche
SRL Décalage logique droite
SLA Décalage arithmétique gauche
SRA Décalage arithmétique droite
ROL Rotation par la gauche
ROR Rotation par la droite

Structure d'une description


Une description est le code décrivant le design, ou fonctionnement, d'un circuit logique (que ce soit une bascule, un afficheur 7 segments, ou je ne sais !).

Structure générale

Une description est toujours articulée autour de 3 rubriques :
  • LIBRARY : énumère les bibliothèques définissant, entre autre, les types d'objets utilisés.
  • ENTITY : définit l'entrée et la sortie du composant.
  • ARCHITECTURE : définit ce que fait le composant (cette définition peut être structurelle ou comportementale).


On insère un commentaire dans le code, c'est-à-dire du texte utile à la compréhension du code mais qui ne sera pas compilé, à l'aide de deux tirets :
Code :
-- Ceci est un commentaire dans le code
Ceci est du code
-- Ceci est un autre commentaire


On peut donc définir un structure générale pour une description
Code :
LIBRARY ieee;   -- Bibliothèque contenant la définition des types STD_LOGIC et STD_LOGIC_VECTOR.
USE ieee.std_logic_1164.ALL;


ENTITY nom_fichier IS    -- Interface du design
PORT(
    <Définition des entrées et des sorties>
    );
END nom_fichier;


ARCHITECTURE archi OF nom_fichier IS    -- Description du design

   <Appel d'un composant déjà créé avec COMPONENT, ou définition de variables intermédiaires avec SIGNAL>

BEGIN

    <Instructions avec éventuellement des PROCESS, et des conditions>

END archi;


Structure de descriptions par l'exemple

L'exemple de description suivant ne fait rien en particulier et comportera certainement des erreurs à la compilation, son but est simplement de référencer toutes les commandes réalisables dans une description.

Code :
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;


ENTITY nom_fichier IS                         -- Fichier nom_fichier.vhdl
PORT(
    E1, E2, E3, E4 : IN STD_LOGIC;            -- Flux entrant
    E5 : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
    E6, E7 : IN INTEGER RANGE 0 TO 3;
    S1, S2, S3, S4, S5, S6 : OUT STD_LOGIC;   -- Flux sortant.
    S7 : OUT INTEGER RANGE 0 TO 6     -- /!\ La dernière ligne du PORT ne finit pas par ; /!\
    );
END nom_fichier;


ARCHITECTURE archi OF nom_fichier IS

COMPONENT nom_fichier_composant   -- Fichier nom_fichier_composant.vhdl préalablement créé
PORT(
    A, B : IN STD_LOGIC;
    RM, SM : OUT STD_LOGIC
    );
END COMPONENT;

SIGNAL N0, NS0, N1, NS1 : STD_LOGIC;           -- Objets intermédiaires
SIGNAL N3, N4 : INTEGER RANGE 0 TO 5;
SIGNAL N5, N6 : STD_LOGIC_VECTOR (4 DOWNTO 0);
SIGNAL sig : STD_LOGIC;      -- Déclaration obligatoire pour travailler sur la sortie

BEGIN

  -- Assignation classique à la sortie
    S0 <= '1';                                 -- On assigne 1 à la sortie S0

  -- Utilisation d'un COMPONENT
    M0:nom_fichier_composant                   -- Première instance du module nom_fichier_composant.vhdl
    PORT MAP (A =>
E1, B => E2, RM => N0, SM => NS0);
    M1:nom_fichier_composant                   -- Deuxième instance du module...
    PORT MAP (A => E3, B => E4, RM => N1, SM => NS1);
    S1 <= N0 OR N1;

  -- Descriptions comportementales
    S2 <= '1' WHEN (E1='1' OR E2='1') ELSE '0';

    PROCESS (E6)  -- Tout ce qui est testé par des IF, ELSE, CASE se trouve dans un PROCESS
    BEGIN
        IF (E6=0) THEN S3 <= E5(0);
        ELSIF (E6=1) THEN S3 <= E5(1);
        ELSIF (E6=2) THEN S3 <= E5(2);
        ELSE S3 <= E5(3);
        END IF;
    END PROCESS;

    PROCESS (E6) -- Même structure que précédement, mais avec if, then, else et non if, then, elsif, else.
    BEGIN
        IF (E6=0) THEN S3 <= E5(0);
        ELSE
            IF (E6=1) THEN S3 <= E5(1);
            ELSE
                IF (E6=2) THEN S3 <= E5(2);
                ELSE S3 <= E5(3);
                END IF;
            END IF;
        END IF;
    END PROCESS;
   
    PROCESS (E6)
    BEGIN
        CASE E6 IS
          WHEN 0 =>
S4 <= E5(0);
          WHEN 1 =>
S4 <= E5(1);
          WHEN 2 =>
S4 <= E5(2);
          WHEN 3 =>
S4 <= E5(3);
          WHEN OTHERS =>
S4 <= "1";     -- Tous les autres cas (facultatif).
        END CASE;
    END PROCESS;

    PROCESS (E5)
    VARIABLE compteur : INTEGER;        -- Objet gérant le comptage de bits à 1
    BEGIN
        compteur:=0;
        FOR I IN 0 TO 3 LOOP            -- I ne doit pas être déclaré


          IF (E5(I)='1') THEN compteur:=compteur + 1;
          END IF;
        END LOOP;
    END PROCESS;

    PROCESS (E6, E7)
    BEGIN
        S5 <= E6 + E7;
    END PROCESS;

    PROCESS(E3, E4)
    BEGIN
        IF E4='1' THEN sig <= E3;        -- La sortie prend l'état de E3
        ELSE sig <= sig                   -- La sortie reste inchangée
        END IF;
    END PROCESS;
    S6 <= sig;

    PROCESS                              -- Ce PROCESS réagira à tous les signaux
    BEGIN
        WAIT UNTIL E4='1';
        sig <= E5;
    END PROCESS;
    S6 <= sig;

    PROCESS (E4)
    BEGIN
        IF E4 'EVENT AND E4='1' THEN sig <= E5;  -- Voir "A ne pas oublier"
        ELSE sig <= sig;
        END IF;
    END PROCESS;
    S6 <= sig;

END archi;


A ne pas oublier

  • Ne jamais mettre de point virgule ( ; ) à la fin de la dernière ligne d'un PORT.
  • Utiliser un PROCESS (A, B) quand A et B (appelés sensibilités du PROCESS) sont testés avec des conditions IF THEN ELSEIF THEN ELSE END IF ou CASE WHEN, ou qu'il y a un calcul arithmétique (ex : A+B).
  • Pour un IF THEN ELSEIF THEN ELSE END IF ou un CASE WHEN, tous les cas possibles doivent être envisagés. Sinon il y aura création d'une fonction registre perturbatrice.
  • cmd 'EVENT AND cmd='1' pour détecter un front montant. cmd 'EVENT AND cmd='0' pour détecter un front descendant.


Et voilà, ce mémo de VHDL est terminé ! Rédiger un mémo c'est assez sympa car c'est plutôt rapide et pas trop prise de tête, mais une question reste tout de même en suspend : est-ce aussi facile à lire ? J'ose espérer que ce modeste résumé vous aura tout de même été utile.

Remonter Navigation rapide : Sommaire
Ce mémo de VHDL se termine ici ! Pour l'instant, je prévoie simplement d'ajouter un chapitre donnant des détails sur les outils permettant de programmer en VHDL, mais il n'y a pas de cours plus conséquent prévu à l'ordre du jour.

Si vous souhaitez aller plus loin, voici quelques liens qui pourront vous aider :


Ceci dit, comme pour tous les langages informatiques, le meilleur tutoriel du monde ne remplacera jamais l'expérience acquise au fil d'heures de codage ! Amusez-vous bien bn_big_smile


  • Auteur : Bnmaster
  • Créé le : 12/11/2008
  • Modifié le : 15/11/2008

Mini-tchat

?

Bnmaster Quelqu'un vient-il de devenir fou en testant le nouveau mode "recherche instantanée" de Google ? C'est des fous... Le 08 septembre, 21h06 via Accueil

Bnmaster Tiens tiens, c'est la fête de l'Avare en ce moment ou bien ?

Scout > En Suède ??? Pk pas bn_heureux Moi je suis encore en stage et je reprend les cours bientôt, sauf que je fais un master 2 "Systèmes embarqués" en plus de ma dernière année d'école d'ingé. ça devrait être fun bn_tongue
Le 07 septembre, 19h13 via Accueil

lily Hello Le 07 septembre, 16h08 via Résumé : L'Avare

sminou Salut Le 06 septembre, 15h53 via Résumé : L'Avare

hghghg QQN peut'il m-aider ??!!

Le 28 août, 12h35 via Starcraft - Patch 1.16.1 no...

hghghg Putin j'arrive pas à faire marcher starcraft

Le 28 août, 12h35 via Starcraft - Patch 1.16.1 no...

theo Bonjour

Le 26 août, 15h51 via La sémantique du XHTML

hahaha 2nd2 de jean-michel en force !!!!!!!!!!!!!!! Le 25 août, 14h43 via Accueil

ViamLiiCiiouS ... Le 25 août, 0h19

Viamlicious Pk c'est de la merde ce livre ? --' Le 24 août, 23h26 via Elle ronge le fer, mord l'a...

bella Hiu

Le 24 août, 23h25 via Elle ronge le fer, mord l'a...

Scoutone Moi ça va.

Je suis en Suède pour faire un semestre d'étude là-bas. Les cours ne commencent pas tout de suite donc j'ai pas mal de temps libre bn_wink



Et toi, tjs en vacances ?
Le 21 août, 9h17 via Accueil

Bnmaster @Scoutone ça roule ! et toi ? Le 18 août, 20h03 via Accueil

nupur Salut a tous Le 18 août, 16h56 via Résumé : Le Tartuffe de Mol...

Scoutone Salut BN, comment ça va ? Le 18 août, 8h07 via Accueil

mugwortt Salut ! Le 17 août, 15h04

bnpro Slt nini Le 10 août, 11h01 via Accueil

nini J aimai les diddl. Le 08 août, 18h40 via Accueil

bnpro Slt a tous Le 08 août, 13h46 via Accueil

Bnmaster Salut Flo ! Le 07 août, 19h15 via Accueil

florian Il y a quel qun

Le 07 août, 19h13 via Apprendre le Morse

florian Bonjour a tous Le 07 août, 19h11 via Apprendre le Morse

Bnmaster Hé, c'est les vacs, faut laisser les gens se reposer bnpro bn_tongue Le 07 août, 14h32 via Accueil

bnpro Enfin kelkun ki répon Le 06 août, 22h09 via Accueil

Bnmaster Salut à tous ! Enfin un peu de vacances ! Yaha bn_big_smile Le 06 août, 19h06 via Accueil

bnpro Slt yéléna Le 04 août, 19h23 via Accueil

yéléna Ia pas de délire ici?? Le 04 août, 5h33 via Résumé : Andromaque

yéléna Salut sa va?

Le 04 août, 5h32 via Résumé : Andromaque

yann69 ...

Le 04 août, 0h15 via Diablo 2 - Patch 1.12a no-c...

bnpro Slt cynthia Le 29 juillet, 22h01 via Accueil

bnpro Ta kel age cynthia Le 29 juillet, 16h31 via Accueil

bnpro Slt cintia ,moi et bnmaster Le 29 juillet, 11h15 via Accueil

Cynthia ... Le 29 juillet, 5h23 via Français

Bnmaster A cette heure là y avait personne, mais maintenant, y a du monde bn_heureux Le 28 juillet, 19h05 via Accueil

Moi Ya kelkun ? Le 27 juillet, 5h18 via Résumé : L'Avare

Moi Ya kelkun ? Le 27 juillet, 5h18 via Résumé : L'Avare

Moi Coucou Le 27 juillet, 5h17 via Résumé : L'Avare

bnpro Slt les gars

Le 26 juillet, 20h56 via Accueil

kikoo Bonjour Le 26 juillet, 15h41

joey Bonjour

Le 26 juillet, 14h20 via Ecrire sans crayon

bnpro Es ke kelkun koné un site ou on peut tchaté.mieu ke ce lui la Le 21 juillet, 21h11 via Accueil

bnpro Cc melilu Le 20 juillet, 7h51 via Accueil

melilu Il y a quelle qu'un ? Le 16 juillet, 22h39 via Accueil

melilu Coucou Le 16 juillet, 22h38 via Apprendre le Morse

AgO Quelqu'un ? Le 15 juillet, 21h09 via Accueil

bnpro Cc yatil dé fille ici

Le 12 juillet, 8h59 via Accueil

crocro Qqn connait des chansons sympa hors celle du site et des traditionnelles tante du maroc? Le 02 juillet, 22h19 via Petits jeux

Yanis B0NNE CHANCE A TOUS ! Le 30 juin, 6h34 via Dates historiques important...

mopomo 5+2 Le 29 juin, 22h39 via Dates historiques important...

HistoryGirl Demain Histoire, Qui se pend? Le 29 juin, 22h11 via Dates historiques important...

Publicité

©Bnbox (Infos) - Cahier de l'élèves - Atelier webmaster - Boîte à Nuts - Bar à Nougat - Valide XHTML 1.0, CSS 2, RSS 2.0
Flux RSS