1.1k likes | 1.69k Views
Le VHDL : SOMMAIRE. I Introduction II Éléments généraux du langage III Architecture du langage IV Exemples d’application. I INTRODUCTION. Le VHDL. De nos jours, les circuits numériques de haute performance sont habituellement créés à partir de descriptions en langages de haut niveau.
E N D
Le VHDL : SOMMAIRE I Introduction II Éléments généraux du langage III Architecture du langage IV Exemples d’application
Le VHDL De nos jours, les circuits numériques de haute performance sont habituellement créés à partir de descriptions en langages de haut niveau. Nous allons maintenant parler de l’un de ces langages, le VHDL
Le VHDL: Qu’est-ce que c’est, et à quoi cela sert-il? • VHDL: VHSIC Hardware Description Language • VHSIC: Very High Speed Integrated Circuit (projet de grande envergure du DoD (Departement of Defense) Américain, mis en place dans les années ’80 • Principe de base: Définir un langage de description de matériel qui puisse être utilisé pour simuler du matériel numérique • Extension: Utilisation du même langage pour la synthèse automatique de circuits
VHDL: Est-ce le seul HDL? • Il existe plusieurs autres langages de description de matériel, entre autres: • Verilog (Très populaire aux États-Unis, utilisé aussi en Europe, au Japon et au Canada) • UDL/1 (Utilisé à un certain moment au Japon) • Estérel (langage académique – Français) • HardwareC (langage académique – Stanford) • Verilog est plus simple que le VHDL, mais est un peu moins utilisé
Pourquoi utiliser des langages HDL? • Pour accélérer la conception de circuits (raisons économiques) • Pour permettre la conception de circuits très complexes (1 milliard de portes logiques d’ici 5 ans) • Pour pouvoir représenter les systèmes numériques selon différents axes d’abstraction • Pour utiliser et/ou améliorer le code pour des systèmes futures
I LES CLASSES D’OBJETS Le langage vhdl comporte quatre classes d’objets utilisés dans les zones de déclaration des programmes: Les signaux Les variables Les constantes Les fichiers (ne sont pas synthétisables)
a b s1 s2 s3 s4 z 2 4 6 8 10 12 Temps (ns) II NOTION DE SIGNAL Un signal correspond à la représentation matérielle du support de l’information en VHDL. L’affectation de signal (a <= ‘0’) permet de faire évoluer au cours du temps les valeurs présentes sur le signal.
Exemple d’affectation de signal (utile pour la simulation) a b s1 s2 s3 s4 z 2 4 6 8 10 12 Temps (ns) a<=1 after 4ns,0 after 8ns,1 after 12ns; Attention : Les expressions doivent être ordonnées selon un ordre croissant des délais. Exercice : Écrire b, S1, S2 ,z.
Propriétés des signaux Chaque signal a trois propriétés : son type, sa valeur et sa valeur antérieure. Les signaux sont déclarés dans les entités et la partie déclarative des architectures. Attention, on ne peut pas les déclarer dans un process Les signaux ne reçoivent leur assignation définitive que lorsque le process a fini son exécution.
III Les variables Les variables se déclarent dans le domaine séquentiel d’un PROCESS, d’une PROCEDURE ou d’une FONCTION. On peut leur donner une valeur initiale. Cette valeur initiale est attribuée à chaque appel de la PROCEDURE ou de la FONCTION. Elles servent à manipuler des variables temporaires/intermédiaires pour faciliter le développement d'un algorithme séquentiel. Une affectation de variable est immédiate dans un process. Syntaxe :VARIABLE var_name {, var_name} : type [:= value]; Exemple :VARIABLE i : INTEGER RANGE 0 TO 3; -- valeur intiale 0VARIABLE x : std_ulogic; -- valeur intiale 'U'Assignation de variable: i:=3; x:=0;
IV Les constantes Les constantes sont utilisées pour référencer une valeur ou un type spécifique. Elles permettent une meilleur lecture et maintenance d'une source. De tous types, elles sont utilisées dans les architectures ou les package. Syntaxe CONSTANT const_name {, const_name} : type := value; Exemple constant BUS_WIDTH : integer := 8;
V La déclaration Generic La section GENERIC_DECLARATIONS dans l'entête ENTITY permet de définir des paramètres exploitables dans l'architecture.Cette méthode d'écriture permet une maintenance plus aisée. Exemple ENTITY entity_name IS GENERIC(TP : time := 30ns); Port( déclarations); END [entity_name];
VII TYPAGE DES OBJETS Le typage des objets permet en premier lieu de protéger les affectations d’objets en restreignant les possibilités d’affectations aux objets de même type.
1 Les TYPES prédéfinis Les types prédéfinis reconnaissent six objets scalaires ayant une valeur unique à chaque instant: Std_logic : représente un élément binaire avec les valeurs '0' , '1' et ‘Z’ (haute impédance); Std_logic_vector : représente un tableau d'éléments binaires ; Boolean : représente une donnée pouvant être TRUE ou FALSE ; Integer : est un entier pouvant aller de –2E32 à (2E32-1), pouvant être comprise entre 2 valeurs limites par la déclaration : integer range mini to maxi. Character : représente un caractère ASCII;
2 Le TYPE énuméré (Machine à états) TYPE permet de définir un type utilisateur auquel on peut assigner un objet. Tous les objets doivent être assignés à un type. Chaque TYPE déclaré doit être unique. Syntaxe TYPE identifier IS (enumeration_type_literals); Exemple TYPE couleur IS (rouge, orange,vert); TYPE op_type IS (opadd, opor, opand, opxor); Il devient alors possible d’utiliser un signal de ce type en le déclarant par : Signal feu1, feu2 : couleur;
3 Le TYPE tableau Le type tableau est un groupement de types identiques. Les tableaux peuvent être multidimentionels. Il existe deux sortes de tableaux : Les tableaux avec contrainte (Constrained Array) Ces tableaux sont définis avec des dimensions figées (rangées colonnes). Les tableaux sans contrainte (Unconstrained Array) Ces tableaux sont définis sans préciser les dimensions. Le tableau est donc dynamique. Syntaxe TYPE identifier IS ARRAY [unconstrained_array_definition]; [constrained_array_definition]; Exemple TYPE data_bus IS ARRAY (0 to 31) OF bit; -- tableau de 32 bit TYPE 4x8 IS ARRAY (3 downto 0) OF std_logic_vector (7 downto 0); --tableau de 4 mots de 8 bits TYPE string IS ARRAY (positive RANGE <>) OF character; TYPE bit_vector IS ARRAY (natural RANGE <>) OF bit; TYPE dim2 IS ARRAY (0 TO 7, 0 TO 7) OF bit; -- tableau à deux dimensions
4 Le TYPE physique Cette définition de type représente une quantité physique. La base des unités doit être spécifiée. Les valeurs sont calculées à partir de cette base. Syntaxe TYPE identifier IS RANGE implementation_defined; UNITS base_unit_declaration[secondary_unit_declaration] END UNITS; Exemple TYPE time IS RANGE implementation_defined; UNITS fs;ps = 1000fs;ns = 1000ps;us = 1000ns;ms = 1000us;sec = 1000ms;min = 60sec;hr = 60min; END UNITS;
5Le TYPE fichier Pour écrire et/ou lire dans un fichier externe, il faut : Insérer la bibliothèque textio : Library std; Use std.textio.all; Déclarer le fichier en précisant son type et le mode d’ouverture (entrée et/ou sortie) : File FILE_R : text is in ’’données.dat’’; File FILE_W : text is out ’’résultats.dat’’; Déclarer une variable ligne de type LINE : Variable L : LINE; Pour lire une ligne dans le fichier, il faut d'abord lire la ligne dans le fichier puis lire la valeur d'une variable R dans la ligne (la valeur lue est convertie automatiquement dans le type de la variable R) : readline(FILE_R, L); read(L, R); Pour écrire, c'est le même procédé, sauf qu'on écrit d'abord la valeur R dans la ligne, puis la ligne dans le fichier : write (L, R); writeline(FILE_W, L); Il existe une fonction endfile(…) qui retourne vrai lorsque le fichier est terminé, et faux sinon. Pour stopper le test_bench, on peut envoyer un message du type : assert FALSE report "fin de fichier" severity failure
6 Le TYPE pointeur Ils ne sont pas synthétisables du fait de leur caractère dynamique. Ils sont strictement réservés au domaine fréquentiel, et peuvent être associés soit à une constante soit à une variable, mais pas aux signaux. Syntaxe : TYPEpointeurIS ACCESStypeobjet; Exemple: Variable pt : pointeur; Pt :=NEWtypeobjet; -- allocation dynamique d’un objet en mémoire. La libération du pointeur se fait avecdeallocate(pt)
7 Le TYPE structure Les structures permettent de regrouper un ou plusieurs champs de type différents et fournissent un accès au champ par leur nom. Un type record peut être associé à une variable comme à un signal. Exemple: TYPEdataIS RECORD Bus1,bus2 : bit; durée : time; Données :integer range0to255; End record; Signal enregistrement1 : data; Enregistrement1.bus1<=‘1’; Enregistrement1 <= (‘0’,’1’,durée,données);
8 Les sous-type :SUBTYPE SUBTYPE est une restriction d’un type à un sous domaine de ce type. Exemple TYPEcolorsIS(red, yellow, blue, green, black);SUBTYPEprimaryIScolorsRANGEredTOblue;TYPEintegerIS RANGE-2147483647 TO 2147483647;SUBTYPEabsoluISinteger 0TO2147483647;TYPEareaIS ARRAY(naturalRANGE <>, naturalRANGE <>) OFbit; SUBTYPEsmall_areaISarea (0TO10, 0TO10);
III) Structure d’une description VHDL simple. Une description VHDL est composée de 2 parties indissociables à savoir : - L’entité(ENTITY), elle définit les entrées et sorties. - L’architecture(ARCHITECTURE), elle contient les instructions VHDL permettant de réaliser le fonctionnement attendu.
III.1) Déclaration des bibliothèques. Toute description VHDL utilisée pour la synthèse a besoin de bibliothèques.L’IEEE(Institut of Electrical and Electronics Engineers) les a normalisées et plus particulièrement la bibliothèque IEEE1164. Elles contiennent les définitions des types de signaux électroniques, des fonctions et sous programmes permettant de réaliser des opérations arithmétiques et logiques,... Libraryieee; Useieee.std_logic_1164.all; Useieee.numeric_std.all; Useieee.std_logic_unsigned.all; La directiveUsepermet de sélectionner les bibliothèques à utiliser.
III.2) Déclaration de l’entité et des entrées / sorties (I/O). Elle permet de définir le NOM de la description VHDL ainsi que les entrées et sorties utilisées, l’instruction qui les définit c’est port : Syntaxe: entity NOM_DE_L_ENTITE is port ( Description des signaux d’entrées /sorties …); end NOM_DE_L_ENTITE; Exemple : entity SEQUENCEMENT is port( CLOCK : in std_logic; RESET : in std_logic; Q : out std_logic_vector(1 downto 0) ); end SEQUENCEMENT; Remarque :Après la dernière définition de signal de l’instruction port il ne faut jamais mettre de point virgule. L’instruction port. Syntaxe: NOM_DU_SIGNAL : sens type; Exemple: CLOCK: in std_logic; BUS : out std_logic_vector(7 downto 0); On doit définir pour chaque signal : le NOM_DU_SIGNAL, le sens et le type.
III.2.1) Le NOM et le SENS du SIGNAL. Le NOM du signal. Il est composé de caractères, le premier caractère doit être une lettre, sa longueur est quelconque, mais elle ne doit pas dépasser une ligne de code. VHDL n’est pas sensible à la « casse », c’est à dire qu’il ne fait pas la distinction entre les majuscules et les minuscules. Le SENS du signal. - in: pour un signal en entrée. - out : pour un signal en sortie. - inout: pour un signal en entrée sortie - buffer: pour un signal en sortie mais utilisé comme entrée dans la description.
III.3) Déclaration de l’architecture correspondante à l’entité : description du fonctionnement. L’architecture décrit le fonctionnement souhaité pour un circuit ou une partie du circuit. En effet le fonctionnement d’un circuit est généralement décrit par plusieurs modulesVHDL. Il faut comprendre par module le couple ENTITE/ARCHITECTURE. Dans le cas de simples PLDs on trouve souvent un seul module. L’architecture établit à travers les instructions les relations entre les entrées et les sorties. On peut avoir un fonctionnement purement combinatoire, séquentiel voire les deux séquentiel et combinatoire. Exemples : -- Opérateurs logiques de base entityPORTESis port (A,B :in std_logic; Y1,Y2,Y3,Y4,Y5,Y6,Y7:out std_logic); end PORTES; architectureDESCRIPTIONofPORTESis begin Y1 <= A and B; Y2 <= A or B; Y3 <= A xor B; Y4 <= not A; Y5 <= A nand B; Y6 <= A nor B; Y7 <= not(A xor B); endDESCRIPTION;
IV) Les instructions de base (mode « concurrent »), logique combinatoire. Qu’est ce que le mode « concurrent » ? Pour une description VHDL toutes les instructions sont évaluées et affectent les signaux de sortie en même temps. L’ordre dans lequel elles sont écrites n’a aucune importance. En effet la description génère des structures électroniques, c’est la grande différence entre une description VHDL et un langage informatique classique. Dans un système à microprocesseur, les instructions sont exécutées les unes à la suite des autres. Avec VHDL il faut essayer de penser à la structure qui va être générée par le synthétiseur pour écrire une bonne description, cela n’est pas toujours évident.
Exemple : Pour le décodeur 2 vers 4 de la page 5, l’ordre dans lequel seront écrites les instructions n’a aucune importance. architecture DESCRIPTION of DEMUX2_4 is begin D0 <= (not(IN1) and not(IN0)); -- première instruction D1 <= (not(IN1) and IN0); -- deuxième instruction D2 <= (IN1 and not(IN0)); -- troisième instruction D3 <= (IN1 and IN0); -- quatrième instruction end DESCRIPTION; L’architecture ci dessous est équivalente : architecture DESCRIPTION of DEMUX2_4 is begin D1 <= (not(IN1) and IN0); -- deuxième instruction D2 <= (IN1 and not(IN0)); -- troisième instruction D0 <= (not(IN1) AND not(IN0)); -- première instruction D3 <= (IN1 AND IN0); -- quatrième instruction end DESCRIPTION;
IV.1) Les opérateurs. • IV.1.1) L’affectation simple : <= • Dans une description VHDL, c’est certainement l’opérateur le plus utilisé. En effet il • permet de modifier l’état d’un signal en fonction d’autres signaux et/ou d’autres opérateurs. • Exemple avec des portes logiques : S1 <= E2 and E1 ; • Les valeurs numériques que l’on peut affecter à un signal sont les suivantes : • - ‘1’ ou ‘H’ pour un niveau hautavec un signal de 1 bit. • - ‘0’ ou ‘L’ pour un niveau basavec un signal de 1 bit. • - ‘Z’ pour un état haute impédance avec un signal de 1 bit. • ‘-’ pour un état quelconque, c’est à dire ‘0’ ou ‘1’. Cette valeur est très utilisée avec les instructions : when … else et with …. Select …. • - Pour les signauxcomposés de plusieurs bits on utilise les guillemets • " … " , voir les exemples ci dessous : • - Les bases numériques utilisées pour les bus peuvent être : • BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en décimal • HEXA, exemple : BUS <= X"9" ; -- BUS = 9 en décimal • OCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal • Remarque : La base décimale ne peut pas être utilisée lors de l’affectation de signaux. On peut seulement l’utiliser avec certains opérateurs, comme + et – pour réaliser des compteurs
Exemple: Library ieee; Use ieee.std_logic_1164.all; entity AFFEC is port ( E1,E2 :in std_logic; BUS1,BUS2,BUS3 :out std_logic_vector(3 downto 0); S1,S2,S3,S4 :out std_logic); end AFFEC; architecture DESCRIPTION of AFFEC is begin S1 <= '1'; -- S1 = 1 S2 <= '0'; -- S2 = 0 S3 <= E1; -- S3 = E1 S4 <= '1' when (E2 ='1') else 'Z'; -- S4 = 1 si E1=1 sinon S4 prend la valeur haute impédance BUS1 <= "1000"; -- BUS1 = "1000" BUS2 <= E1 & E2 & "10"; -- BUS2 = E1 & E2 & 10 BUS3 <= x"A"; -- valeur en HEXA -> BUS3 = 10(déc) end DESCRIPTION;
IV.1.2) Opérateur de concaténation : &. Cet opérateur permet de joindre des signaux entre eux . Exemple : -- Soit A et B de type 3 bits et S1 de type 8 bits -- A = "001" et B ="110" S1 <= A & B & "01" ; -- S1 prendra la valeur suivante après cette affectation -- S1 = "001110 01" IV.1.3) Opérateurs logiques. Exemples : S1 <= A sll 2 ; -- S1 = A décalé de 2 bits à gauche. S2 <= A rol 3 ; -- S2 = A avec une rotation de 3 bits à gauche S3 <= not (R); -- S3 = R Remarque : Pour réaliser des décalages logiques en synthèse logique, il est préférable d’utiliser les instructions suivantes : Décalage à droite : -- Si A est de type std_logic_vector(7 downto 0) S1 <= ‘0’ & A(7 downto 1); -- décalage d’un bit à droite S1 <= "000" & A(7 downto 3); -- décalage de trois bits à droite Décalage à gauche : -- Si A est de type std_logic_vector(7 downto 0) S1 <= A(6 downto 0) & ‘0’; -- décalage d’un bit à gauche S1 <= A(4 downto 0) & "000"; -- décalage de trois bits à gauche Valeur de A Valeur de B "001“ "110“
IV.1.4) Opérateurs arithmétiques. Remarque N°1 : Pour pouvoir utiliser les opérateurs ci-dessus il faut rajouter les bibliothèques suivantes au début du fichier VHDL: Use ieee.numeric_std.all ; Use ieee.std_logic_arith.all ; Exemples : S1 <= A – 3 ; -- S1 = A – 3 -- On soustrait 3 à la valeur de l’entrée / signal A S1 <= S1 + 1 ; -- On incrémente de 1 le signal S1 Remarque N°2 : Attention l’utilisation de ces opérateurs avec des signaux comportant un nombre de bits important peut générer de grandes structures électroniques. Exemples : S1 <= A * B ;-- S1 = A multiplié par B : A et B sont codés sur 4 bits S2 <= A / B ;-- S2 = A divisé par B : A et B sont codés sur 4 bits
VI.1.5) Opérateurs relationnels. Ils permettent de modifier l’état d’un signal ou de signaux suivant le résultat d’un test ou d’une condition. En logique combinatoire ils sont souvent utilisés avec les instructions : - when … else … - with …. Select ….
IV.2) Les instructions du mode « concurrent ». IV.2.1) Affectation conditionnelle : Cette instruction modifie l’état d’un signal suivant le résultat d’une condition logique entre un ou des signaux, valeurs, constantes. SIGNAL <= expression when condition [else expression when condition] [else expression]; Remarque : l’instruction [else expression] n’est pas obligatoire mais elle fortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la condition n’est pas remplie. Exemple N°1 : -- S1 prend la valeur de E2 quand E1=’1’ sinon S1 prend la -- valeur ‘0’ S1 <= E2 when ( E1= ‘1’) else ‘0’; Schéma correspondant :
Exemple N°2 : -- Structure évoluée d’un multiplexeur 4 vers 1 S2 <= E1 when (SEL="00" ) else E2 when (SEL="01" ) else E3 when (SEL="10" ) else E4 when (SEL="11" ) else ‘0’;
Exemple de systèmes : additionneur 1-bit s1 Demi-additionneur HA1 Demi-additionneur HA2 In1 In2 s2 C_in Demi-additionneur Somme s3 C_out OR1
Exemple d’architecture du demi-additionneur library IEEE; use IEEE.std_logic_1164.all; entity demi_add is port(a, b: in bit; som, ret: out bit); end demi_add; architecture comportement_concurrent of demi_add is begin som <= (a xor b) ; ret <= (a and b) ; end comportement_concurrent;
IV.2.2) Affectation sélective : Cette instruction permet d’affecter différentes valeurs à un signal, selon les valeurs prises par un signal dit de sélection. with SIGNAL_DE_SELECTION select SIGNAL <= expression when valeur_de_selection, [expression when valeur_de_selection,] [expression when others]; Remarque: l’instruction [expression when others] n’est pas obligatoire mais fortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la condition n’est pas remplie. Exemple N°1 : -- Multiplexeur 4 vers 1 with SEL select S2 <= E1 when "00", E2 when "01", E3 when "10", E4 when "11", '0' when others; Remarque: when others est nécessaire car il faut toujours définir les autres cas du signal de sélection pour prendre en compte toutes les valeurs possibles de celui-ci.
Schéma correspondant après synthèse: En conclusion, les descriptions précédentes donnent le même schéma, ce qui est rassurant. L’étude des deux instructions montre toute la puissance du langage VHDL pour décrire un circuit électronique, en effet si on avait été obligé d’écrire les équations avec des opérateurs de base pour chaque sortie, on aurait eu les instructions suivantes : S2 <= (E1 and not(SEL(1)) and not(SEL(0))) or (E2 and not SEL(1) and (SEL(0)) or (E3 and SEL(1) and not(SEL(0))) or (E4 and SEL(1) and SEL(0)); L’équation logique ci-dessus donne aussi le même schéma, mais elle est peu compréhensible, c’est pourquoi on préfère des descriptions de plus haut niveau en utilisant les instructions VHDL évoluées.
Exemple : mémoire morte library IEEE; use IEEE.std_logic_1164.all; entity memoire_morte is port (addr1 : in std_logic_vector (2 downto 0); reg0, reg1, reg2, reg3,reg4 :in std_logic_vector (31 downto 0); mem1: out std_logic_vector (31 downto 0)); end memoire_morte; architecture comportemental of memoire_morte is begin with addr1 select mem1 <= reg0 when ‘‘000’’, reg1 when ‘‘001’’, reg2 when ‘‘010’’, reg3 when ‘‘011’’, reg4 whenothers; end comportemental;
V) Les instructions du mode séquentiel. V.1) Définition d’un PROCESS. Un process est une partie de la description d’un circuit dans laquelle les instructions sont exécutées séquentiellement c’est à dire les unes à la suite des autres. Il permet d’effectuer des opérations sur les signaux en utilisant les instructions standard de la programmation structurée comme dans les systèmes à microprocesseurs. L’exécution d’un process est déclenchée par un ou des changements d’états de signaux logiques. Le nom de ces signaux est défini dans la liste de sensibilité lors de la déclaration du process. [Nom_du_process :] process(Liste_de_sensibilité_nom_des_signaux) Begin -- instructions du process end process [Nom_du_process] ; Remarque: Le nom du process entre crochet est facultatif, mais il peut être très utile pour repérer un process parmi d’autres lors de phases de mise au point ou de simulations.
Règles de fonctionnement d’un process : 1) L’exécution d’un process a lieu à chaque changement d’état d’un signal de la liste de sensibilité. 2) Les instructions du process s’exécutent séquentiellement. 3) Les changements d’état des signaux par les instructions du process sont pris en compte à la fin du process.
Les processus: exemple d’un compteur simple de 8 bits LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY compt IS PORT ( h: IN STD_LOGIC; q: OUT INTEGER RANGE 0 TO 7 ); END compt; ARCHITECTURE archi OF compt IS SIGNAL test: INTEGER RANGE 0 TO 7; BEGIN PROCESS BEGIN WAIT UNTIL h='1'; test <= test+ 1; END PROCESS; q <= test; END archi;
V.2) Les deux principales structures utilisées dans un process. L’assignation conditionnelle if condition then instructions [elsif condition then instructions] [else instructions] end if ; Exemple: if (RESET=’1’) then SORTIE <= ”0000”; L’assignation sélective case signal_de_slection is when valeur_de_sélection => instructions [when others => instructions] end case; Exemple: case SEL is when “000” => S1 <= E1; when “001” => S1 <= ‘0’; when “010” | “011” => S1 <=’1’; -- La barre | permet de réaliser -- un ou logique entre les deux -- valeurs “010” et “011” when others => S1 <= ‘0’; end case; Remarque: ne pas confondre => (implique) et <= (affecte).
library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_ARITH.all;use IEEE.STD_LOGIC_UNSIGNED.all;ENTITY dec_7seg ISPORT(hex_digit : IN STD_LOGIC_VECTOR(3 downto 0);segment_a, segment_b, segment_c, segment_d, segment_e, segment_f, segment_g : out std_logic);END dec_7seg;ARCHITECTURE a OF dec_7seg ISSIGNAL segment_data : STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS (Hex_digit)-- HEX to 7 Segment Decoder for LED DisplayBEGINCASE Hex_digit ISWHEN "0000" => segment_data <= "1111110";WHEN "0001" => segment_data <= "0110000";WHEN "0010" => segment_data <= "1101101";WHEN "0011" => segment_data <= "1111001";WHEN "0100" => segment_data <= "0110011";WHEN "0101" => segment_data <= "1011011";WHEN "0110" => segment_data <= "1011111"; Exemple : Un décodeur 7 segments WHEN "0111" => segment_data <= "1110000"; WHEN "1000" => segment_data <= "1111111"; WHEN "1001" => segment_data <= "1111011"; WHEN "1010" => segment_data <= "1110111"; WHEN "1011" => segment_data <= "0011111"; WHEN "1100" => segment_data <= "1001110"; WHEN "1101" => segment_data <= "0111101"; WHEN "1110" => segment_data <= "1001111"; WHEN "1111" => segment_data <= "1000111"; WHEN OTHERS => segment_data <= "0111110"; END CASE; END PROCESS; -- extract segment data and LED driver is inverted segment_a <= NOT segment_data(6); segment_b <= NOT segment_data(5); segment_c <= NOT segment_data(4); segment_d <= NOT segment_data(3); segment_e <= NOT segment_data(2); segment_f <= NOT segment_data(1); segment_g <= NOT segment_data(0); END a;
Exemple : MEMOIRE de 2 mots -- Process for memory write operation PROCESS BEGIN WAITUNTIL clock'event and clock='1'; IF (reset = '1') THEN -- initial values for memory (optional) mem0 <= "01010101"; mem1 <= "10101010"; ELSE -- Write to memory? -- use a flip-flop with an enable for memory IF memwrite = '1' THEN CASE write_address IS WHEN "000" => mem0 <= write_data; WHEN "001" => mem1 <= write_data; -- unimplemented memory locations WHEN OTHERS => NULL; END CASE; END IF; END IF; END PROCESS; END behavior; -- Les adresses 0 et 1 sont accessibles en lectures et en écritures LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; ENTITY memory IS PORT(read_data : OUT std_logic_vector(7 DOWNTO 0); read_address : IN std_logic_vector(2 DOWNTO 0); write_data : IN std_logic_vector(7 DOWNTO 0); write_address : IN std_logic_vector(2 DOWNTO 0); Memwrite : IN std_logic; clock,reset : IN std_logic); END memory; ARCHITECTURE behavior OF memory IS SIGNAL mem0, mem1 : std_logic_vector(7 DOWNTO 0); BEGIN -- Process for memory read operation PROCESS (read_address, mem0, mem1) BEGIN CASE read_address IS WHEN "000" => read_data <= mem0; WHEN "001" => read_data <= mem1; -- unimplemented memory locations WHENOTHERS => read_data <= "11111111"; END CASE; END PROCESS;