Décrire un circuit numérique avec VHDL Références: notes de cours, chap. 2, 4 et 10
(notes, section 10.1) Variables booléennes À la base des systèmes numériques on retrouve la logique booléenne. Dans un système numérique, tous les signaux sont effectivement des variables booléennes. Une variable booléenne peut prendre une seule de deux valeurs: vrai ou faux. On peut interpréter ces deux valeurs de différentes façons selon le contexte. valeur logique équivalent numérique ex. : lampe ex : tension ex : alarme vrai 1 allumée élevée activée faux éteinte basse désactivée
Fonctions booléennes, symboles et tables de vérité (notes, section 10.2) Fonctions booléennes, symboles et tables de vérité Il y a trois fonctions booléennes de base l’inversion le ET logique; et, le OU logique. Plusieurs fonctions peuvent être dérivées de ces trois fonctions de base, comme le NON-OU, le NON-ET, le OU-exclusif et l’équivalence.
Différentes portes logiques (notes, section 10.6) Différentes portes logiques
Un exemple de design Un comité composé de quatre personnes a besoin d’un mécanisme de vote secret pour les amendements sur la constitution du comité. Un amendement est approuvé si au moins 3 personnes votent pour. Concevoir un circuit logique qui accepte 4 entrées représentant les votes. La sortie du circuit doit indiquer si l’amendement est accepté.
Donner la table de vérité, l’équation et le circuit logique # vote1 (A) vote2 (B) vote3 (C) vote4 (D) amendement approuvé (F) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Équivalence entre les trois représentations
Langages de description matérielle (notes, section 2.1) Langages de description matérielle Pour décrire un circuit logique, les schémas sont peu adéquats. Les schémas sont limités aux circuits les plus simples. Il est difficile de dessiner un circuit complexe avec un schéma de portes logiques. Il est encore plus difficile de le modifier. Un simple changement dans une équation booléenne du circuit peut se répercuter par une grande quantité de connexions à corriger. Il est difficile, voire impossible, d’utiliser des variables en guise de paramètres d’un circuit représenté par un schéma. Les langages de description matérielle (Hardware Description Language – HDL) ont vu le jour au début des années 1980 lorsque la complexité des circuits à concevoir a rendu impossible l’utilisation exclusive de schémas. Les avantages des HDL par rapport aux schémas sont : les HDL permettent de décrire des systèmes complexes complets; les HDL favorisent la décomposition en modules paramétrables; les HDL facilitent l’établissement de spécifications et d’interfaces clairement définies; les HDL normalisent l’échange d’informations.
Langages de description matérielle (notes, section 2.1) Langages de description matérielle Les HDL peuvent servir à trois choses : la modélisation de circuits (surtout numériques); la description de circuits en vue de leur synthèse (i.e. leur réalisation matérielle); et, la documentation de circuits. Les deux HDL de loin les plus populaires sont Verilog et VHDL. Verilog ressemble un peu à C, et VHDL ressemble à ADA. Les deux langages sont relativement faciles à apprendre, mais difficiles à maîtriser. VHDL est plus vaste, bien que plusieurs des particularités pour lesquelles Verilog n’a pas d’équivalent soient rarement utilisées. Quand on connaît l’un des deux langages, il est relativement aisé de passer à l’autre. Un troisième langage, SystemC, est populaire pour la modélisation à plus haut niveau.
(notes, section 2.1) VHDL L’acronyme VHDL signifie Very High Speed Integrated Circuit (VHSIC) Hardware Description Language (HDL). VHDL est un langage de programmation complet. Le langage a été développé pour le compte du gouvernement américain pour documenter la conception d’ASIC. Il est fortement inspiré du langage ADA. Rapidement, des simulateurs de VHDL sont apparus, puis des synthétiseurs capables de traduire un programme VHDL en une liste d’interconnexions entre des portes logiques (netlist) pouvant être réalisée sur un ASIC. Le langage VHDL est normalisé par l’IEEE. La première norme remonte à 1987. Des mises à jour ont eu lieu en 1993, 2000, 2002 et 2008. La norme plus récente est présentement mal supportée par les outils de conception.
Circuit combinatoire en VHDL (notes, section 2.2) Circuit combinatoire en VHDL Entité: interface avec le monde extérieur Architecture: partie déclarative et corps Principe de la concurrence library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity add3bits is port ( Cin : in std_logic; X : in std_logic; Y : in std_logic; Cout : out std_logic; S : out std_logic ); end add3bits; architecture flotDeDonnees of add3bits is signal T1 : std_logic; signal T2 : std_logic; signal T3 : std_logic; begin S <= T1 xor Cin; Cout <= T3 or T2; T1 <= X xor Y; T2 <= X and Y; T3 <= Cin and T1; end flotDeDonnees;
Trois styles de description d’un circuit (notes, section 2.3) Trois styles de description d’un circuit Énoncés concurrents Style de description du circuit Assignations de signaux concurrentes, choisies et conditionnelles Par flot de données Instanciations de composantes Structurale Processus Comportementale
Description par flot de données (notes, section 2.3) Description par flot de données Le modèle d’un circuit numérique par flot de données décrit sa fonction sans nécessairement définir sa structure. En général, cela signifie que les valeurs des signaux et ports du circuit sont établies par des assignation concurrentes de valeurs (concurrent signal assignment). Pour les circuits combinatoires, les assignations concurrentes à des signaux utilisent souvent des opérateurs logiques qui sont des mots clés du langage: and, or, nand, nor, xor, xnor, not. On peut utiliser des parenthèses pour faire respecter la préséance requise dans les expressions.
Description par flot de données (notes, section 2.3) Description par flot de données library ieee; use ieee.std_logic_1164.all; entity combinatoire1 is port ( A : in std_logic; B : in std_logic; C : in std_logic; F : out std_logic ); end combinatoire1; architecture flotDeDonnees1 of combinatoire1 is begin F <= not(A and (B xor not(C))); end flotDeDonnees1; architecture flotDeDonnees2 of combinatoire1 is signal entree : std_logic_vector(2 downto 0); begin entree <= (A, B, C); with entree select F <= '1' when "000", '1' when "001", '1' when "010", '1' when "011", '0' when "100", '1' when "101", '1' when "110", '0' when "111", '0' when others; end flotDeDonnees2; architecture flotDeDonnees3 of combinatoire1 is begin F <= '1' when (A = '0' or B /= C) else '0'; end flotDeDonnees3;
Description structurale (notes, section 2.3) Description structurale Un circuit numérique peut être défini par sa structure, c'est-à-dire par un assemblage de blocs. Une description structurale correspond à une description par schéma, où les instanciations de composantes et leurs interconnexions sont énumérées avec du texte. Une description structurale est appropriée pour relier entre eux différents sous-systèmes d’un système numérique. En général, il est préférable d’utiliser un éditeur de schéma pour décrire un tel circuit, et laisser un outil générer automatiquement le code VHDL structural.
Description structurale (notes, section 2.3) Description structurale library ieee; use ieee.std_logic_1164.all; entity combinatoire1 is port ( A : in std_logic; B : in std_logic; C : in std_logic; F : out std_logic ); end combinatoire1; entity INV is port (I : in std_logic; O : out std_logic); end INV; architecture arch of INV is begin O <= not I; end arch; entity NAND2 is … entity XOR2 is architecture structurale of combinatoire1 is component INV -- inverseur port (I : in std_logic; O : out std_logic); end component; component NAND2 port (I0, I1 : in std_logic; O : out std_logic); component XOR2 port (I0 : in std_logic; I1 : in std_logic; O : out std_logic); signal NET18 : std_logic; signal NET37 : std_logic; begin U1 : NAND2 port map(I0 => NET37, I1 => A, O => F); U2 : XOR2 port map(I0 => NET18, I1 => B, O => NET37); U3 : INV port map(I => C, O => NET18); end architecture structurale;
Description comportementale (notes, section 2.3) Description comportementale En VHDL, la description comportementale d’un système numérique est faite à l’aide d’énoncés similaires à ceux d’un langage procédural comme C et Java, incluant les structures de condition et de répétition. La possibilité d’utiliser une description comportementale est un outil très puissant aux concepteurs de circuits numériques. En effet, il est alors possible d’abstraire le comportement du circuit à un très haut niveau, et donc de définir un système complexe en peu de temps, de façon concise, paramétrable et facilement modifiable. Cependant, comme une description comportementale peut prendre multiples formes, il faut garder en tête la nature du circuit désiré et l’inventaire de composantes matérielles disponibles pour s’assurer que la description puisse être synthétisée en un circuit de complexité acceptable. Les descriptions comportementales en VHDL se font à l’aide de l’énoncé process à l’intérieur d’une architecture. Un processus décrit une partie du circuit qui s’exécute de façon concurrente à d’autres processus et à des assignations concurrentes de signaux.
Description comportementale – porte ET, ex. 1 (notes, section 2.3) Description comportementale – porte ET, ex. 1 library ieee; use ieee.std_logic_1164.all; entity porteET4 is port ( I : in std_logic_vector(3 downto 0); F : out std_logic ); end porteET4; architecture flotDeDonnees of porteET4 is begin F <= I(3) and I(2) and I(1) and I(0); end flotDeDonnees; architecture comportementale of porteET4 is begin process (I) variable sortie : std_logic; sortie := '1'; for k in 3 downto 0 loop sortie := sortie and I(k); end loop; F <= sortie; end process; end comportementale;
Description comportementale – porte ET, ex. 2 (notes, section 2.3) Description comportementale – porte ET, ex. 2 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity porteET is generic ( W : positive := 8 -- le nombre d'entrées de la porte ET ); port ( I : in std_logic_vector(W - 1 downto 0); F : out std_logic end porteET; architecture comportementale of porteET is begin process (I) variable sortie : std_logic; sortie := '1'; for k in W - 1 downto 0 loop sortie := sortie and I(k); end loop; F <= sortie; end process; end comportementale;
VHDL: quelques détails Espaces, littéraux, commentaires (notes, section 2.5) VHDL: quelques détails Espaces, littéraux, commentaires Il n’y a pas de différence entre les espaces, tabulations et retours de chariot, présents seuls ou en groupe. Le langage n’est pas sensible à la casse. Littéraux: Un littéral composé d’un caractère unique est placé entre apostrophes : ‘a’, ‘5’. Un littéral composé d’une chaîne de caractères est placé entre guillemets : "bonjour", "123ABC". Un littéral numérique peut être spécifié avec sa base, avec le format base#chiffres[.chiffres]#[exposant], où les crochets indiquent des éléments facultatifs. La base doit être entre 2 et 16, inclusivement. Par exemple, les nombres suivants ont tous la même valeur : 10#33# = 10#3.3#E1 = 2#10001# = 16#21# = 7#45#. Un littéral composé de bits peut être exprimé en bases 2, 8 ou 16, avec les spécificateurs de base B, O et X, respectivement : B"11111111", O"377", X"FF". Tout texte placé après deux tirets et jusqu’à la fin d’une ligne est un commentaire, ce qui est semblable au ‘//’ de C. Il n’y a pas de commentaires en bloc (/* … */) en VHDL.
VHDL: quelques détails Objets (notes, section 2.5) VHDL: quelques détails Objets Ici, ‘objet’ n’a pas le même sens que dans un langage orienté objet. Il y a quatre catégories d’objets en VHDL : constant (et generic) : peut contenir une valeur unique qui ne change pas; un objet generic est une constante spéciale permettant d’appliquer un paramètre à une entité lors de son instanciation; variable: peut contenir une valeur temporaire; les objets variable sont utiles pour stocker des valeurs intérimaires dans les calculs; signal (et port) : peut contenir une liste de valeurs dans le temps; un objet signal correspond en général à un fil d’un circuit; un port d’une entité est implicitement un signal pour cette entité; file: un objet dans lequel on peut écrire et lire des valeurs, et qui correspond à un fichier du système d’exploitation. Lors de la déclaration d’un objet, on spécifie sa catégorie, son identificateur et son type. On peut aussi lui assigner une valeur initiale.
VHDL: quelques détails Identificateurs (notes, section 2.5) VHDL: quelques détails Identificateurs Un identificateur de base légal est composé de lettres, chiffres et/ou du soulignement. Le premier caractère doit être une lettre, le dernier ne peut pas être le soulignement, et on ne peut utiliser deux soulignements de suite. Un identificateur ne peut pas être l’un des mots réservés du langage.
VHDL: quelques détails Types prédéfinis (notes, section 2.5) VHDL: quelques détails Types prédéfinis catégorie type ou sous-type source de la définition valeurs scalaires boolean type prédéfini FALSE et TRUE bit ‘0’ et ‘1’ character 256 caractères de la norme ISO 8859- 1, avec des abréviations reconnues et certaines qui sont propres à VHDL Les 128 premiers sont les caractères ASCII. integer plage minimale de –231 + 1 à 231 – 1 natural sous-type prédéfini 0 à 231 – 1 positive 1 à 231 – 1 real typiquement –1.7014111E±308 à 1.7014111E±308 std_logic Package std_logic_1164 ‘U’ : valeur inconnue, pas initialisée ‘X’ : valeur inconnue forcée ‘0’ : 0 forcé ‘1’ : 1 forcé ‘Z’ : haute impédance (pas connecté) ‘W’ : inconnu faible ‘L’ : 0 faible ‘H’ : 1 faible ‘-‘ : peu importe (don’t care) composés bit_vector tableau de bit string tableau de character std_logic_vector tableau de std_logic unsigned numeric_std tableau de std_logic, interprété comme un nombre binaire non signé signed tableau de std_logic, interprété comme un nombre binaire signé en complément à deux
VHDL: quelques détails Opérateurs (notes, section 2.5) VHDL: quelques détails Opérateurs catégorie opérateurs type de l’opérande de gauche type de l’opérande de droite type de l’expression logique and, or, nand, nor, xor, xnor, not bit, boolean relation =, /=, <, <=, >, >= scalaire ou tableau boolean décalage sll (déc. logique gauche), srl (déc. logique droite), sla (déc. arithmétique gauche), sra (déc. arithmétique droit), rol (rotation gauche), ror (rotation droite) tableau de bit ou boolean integer comme l’opérande de gauche arithmétique +, -, *, /, abs (valeur absolue), mod (modulo), rem (reste) type numérique ** (exponentiation) concaténation & tableau ou type énuméré tableau
Flot de conception de circuits numériques (notes, section 4.2) Flot de conception de circuits numériques
Un exemple de design Un comité composé de quatre personnes a besoin d’un mécanisme de vote secret pour les amendements sur la constitution du comité. Un amendement est approuvé si au moins 3 personnes votent pour. Concevoir un circuit logique qui accepte 4 entrées représentant les votes. La sortie du circuit doit indiquer si l’amendement est accepté.
Donner la table de vérité, l’équation et le circuit logique # vote1 (A) vote2 (B) vote3 (C) vote4 (D) amendement approuvé (F) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Équivalence entre les trois représentations
Code VHDL une solution possible library IEEE; use IEEE.STD_LOGIC_1164.all; entity vote is port ( lesvotes: in std_logic_vector(3 downto 0); approbation : out std_logic ); end vote; -- table de vérité réduite architecture flotdonnees1 of vote is begin with lesvotes select approbation <= '1' when "0111", '1' when "1011", '1' when "1101", '1' when "1110", '1' when "1111", '0' when others; end flotdonnees1;
Résumé: VHDL de base Notions à retenir et maîtriser Importance relative 1. Expliquer l’utilité des HDL et les origines de VHDL 5 2. Expliquer le rôle d’une entité et d’une architecture en VHDL. 10 3. Décrire un module en VHDL par une description par flot de données, structurale et comportementale 20 4. Expliquer et utiliser le principe de la concurrence en VHDL. 15 5. Décrire une fonction logique à l’aide d’un processus 6. Décrire un module en VHDL en utilisant correctement la syntaxe de base du langage: commentaires, identificateurs, types prédéfinis, opérateurs 7. Illustrer par un schéma et décrire le flot de conception d’un circuit numérique Total 100