====== 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 = ‘1’ THEN q <= 0; ELSIF clk’event AND clk = ‘1’ THEN 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 = ‘1’ THEN 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 = ‘0’ THEN 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 = ‘1’ THEN 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 [[http://fr.wikipedia.org/wiki/VHDL|Wikipédia]], publiée sous licence [[http://www.gnu.org/copyleft/fdl.html|GNU FDL]]. La liste complète des auteurs est disponible sur [[http://fr.wikipedia.org/w/index.php?title=Very_High_Speed_Integrated_Circuit_Hardware_Description_Language&action=history|cette page]]. Bibliographie: [[http://eig.unige.ch/~sitbon/SYS_LOG/systemes_logiques/PLD/VHDL/VHDL.PDF|Introduction à la Synthèse logique VHDL]], [[http://www.librecours.org/documents/11/1106.pdf|Langage VHDL et conception de circuits]]