Conception avancée de circuits numériques (VHDL) Hakim ZIMOUCHE LIEN UHP (Hakim.Zimouche@lien.uhp-nancy.fr)
Introduction Objectif Prérequis Rappeler les notions essentielles de la conception de circuits numériques en particulier les méthodes de synthèse et de modélisation des systèmes séquentiels. Concevoir des circuits à partir d'une description en VHDL préparer à la conception des systèmes hiérarchiques Prérequis Connaissance des technologies de circuits numériques et de la conception des circuits combinatoires et séquentiels
Bibliographie "Logique combinatoire et technologie" par Marcel GINDRE et Denis ROUX 1987 (Mc GRAW-HILL) "Circuits numériques et synthèse logique " J. WEBER, M. MEAUDRE, 1995 (MASSON) "Logique programmable" Laurent Dutrieux, Didier DEMIGNY 1997(Eyrolles) "Digital System Design with VHDL" M. Zwolinski, 2000 (Prentice Hall) "Spécification et conception des ASICS" J.-P. Calvez, 1993 (MASSON) "VHDL du langage à la modélisation" R. AIRIAU, J. M. BERGE, V. OLIVE, J. ROUILLARD, 1990 (Presse Polytechniques et Universitaires Romandes) "Arithmétique des ordinateurs" MULLER, (MASSON)
PLAN Logique Combinatoire Conception séquentielle synchrone Représentations Description VHDL Macro-fonctions Conception séquentielle synchrone Modèles machines d ’état Méthodes d ’analyse et de synthèse Description VHDL des machines d ’état
VHDL VHDL : VHSIC Hardware Description Language (VHSIC : Very High Speed Integrated Circuit) 1981 Étude de l'armée américaine sur un moyen de réaliser des documentations techniques sans ambiguïtés et facilement interprétables. 1987 Standard IEEE 1076-1987 1993 révision IEEE 1134-1993 Utilisé pour : décrire le comportement de fonctions synthétiser un circuit modéliser un circuit (modèle logique et technologique) simuler une description ( description des signaux d'entrée)
Description VHDL Trame principale -- Library Clause LIBRARY ieee; -- Use Clause USE ieee.std_logic_1164.all; -- Package Declaration (optional) -- Package Body (optional) -- Entity Declaration -- Architecture Body Nom du répertoire dans lequel se trouve std_logic_1164 Entité et Architecture sont les parties principales d'une description Description VHDL
Entité Description des entrées et des sorties de la structure en explicitant pour chacune d'entre elles le nom, la direction (IN, OUT et INOUT) et le type. ENTITY _entity_name IS GENERIC( _parameter_name : string := _default_value ; _parameter_name : integer:= _default_value ); PORT( _input_name, _input_name : IN STD_LOGIC; _input_vector_name : IN STD_LOGIC_VECTOR(high downto low); _bidir_name, __bidir_name : IN OUT STD_LOGIC; _output_name, __output_name : OUT STD_LOGIC ); END __entity_name ; Exemple : entity XOU is port (E1, E2 : in bit; S : out bit); end XOU; E1 E2 S XOU Description VHDL
Types Types utilisés en électronique numérique Les signaux, variables et constantes ont obligatoirement un type qui définit l’ensemble auquel ils appartiennent. Définition d'un type entier pour le signal A : A INTEGER RANGE 255 DOWNTO 0 (0to255) Description VHDL
Différence entre rangement ascendant et descendant : Vecteurs Vecteurs pour la manipulation de bus Assigner une valeur à un des éléments d'un bus: B(3) <= '1 ’ Déclaration de trois signaux correspondant à des bus (un vecteur de signaux) comportant 8 signaux A(0), A(1) ,..., A(7) et B(0), B(1) , ..., B(7) ainsi que S(0), S(1) , ..., S(7). rangement descendant A : in bit_vector (7 downto 0); rangement ascendant B : in bit_vector (0 to 7); S : out bit_vector (7 downto 0); Différence entre rangement ascendant et descendant : si A <= "11110000" alors A(7) = '1' si B <= "11110000" alors B(7) = '0' Description VHDL
Vecteurs Assigner une valeur à l'ensemble du bus, plusieurs méthodes assigne 11001010 aux éléments S(7), S(6), ..., S(0). S <= (7 => '1', 6 => '1', 5 downto 4 => '0', 3 => '1', 2 => '0', 1 => '1', 0 => '0') ; assigne la valeur 11001010 aux éléments S(7), S(6), ..., S(0). S <= (7 | 6 | 3 | 1 => '1' , 5 | 4 | 2 | 0 => '0'); assigne la valeur 11001010 au vecteur S S <= (7 => '1', others => '0'); assigne la valeur 10000000 au vecteur S.
Architecture L'architecture décrit le comportement de l'entité. Il est possible de créer plusieurs architectures pour une même entité. Chacune de ces architectures décrira l'entité de façon différente. ARCHITECTURE _architecture_name OF _entity_name IS SIGNAL __signal_name : STD_LOGIC; BEGIN -- Process Statement -- Concurrent Signal Assignment -- Conditional Signal Assignment -- Selected Signal Assignment -- Component Instantiation Statement -- Generate Statement -- Concurrent Procedure Call END _architecture_name ; Description VHDL
Assignation concurrente de signaux Définitions Signal Le signal est vu dans toute l ’architecture. Il est synthétisé sous la forme d’un équipotentiel. L’assignation d’une valeur crée des connexions. Concurrence Lorsque l'on étudie une structure logique, il apparaît à l’évidence que les signaux qui la constituent évoluent de façon indépendante et parallèle. Exemple Assignation simple __signal <= __expression; exemple : c <= a and b ; Description VHDL
Assignation concurrente de signaux Exercice Réaliser la description des trois fonctions de base ENTITY fonc_de_base IS PORT (a, b : IN BIT; et, ou, non : OUT BIT); END fonc_de_base ; ARCHITECTURE ex OF fonc_de_base IS BEGIN et <= a AND b; ou <= a OR b; non <= not b ; END ex; 1 ou non 1 & b a et Description VHDL
Assignation conditionnelle _signal <= _expression WHEN _boolean_expression ELSE _expression WHEN _boolean_expression ELSE _expression ; Exemple : ENTITY ou IS PORT (a, b : IN bit; c : OUT bit); END ou ; ARCHITECTURE conditionnelle OF ou IS BEGIN c <= '0' WHEN (a = '0' AND b = '0' ) ELSE '1'; END conditionnelle; 1 c a b Description VHDL
Autre exemple LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY multiplexeur4 is PORT( entree : IN std_logic_VECTOR (3 DOWNTO 0); adresse : IN std_logic_VECTOR (1 DOWNTO 0); s : OUT std_logic); END; ARCHITECTURE concurrente OF multiplexeur4 IS BEGIN s <= entree(0) WHEN adresse = "00" ELSE entree(1) WHEN adresse = "01" ELSE entree(2) WHEN adresse = "10" ELSE entree(3) ;
Application à l’implémentation de tables de vérité Exercice : proposer une description pour la table de vérité ci-dessous Entrées Sortie 000 100 001 010 010 111 011 110 100 001 101 000 110 011 111 101
Assignation conditionnelle AUTRE Instruction conditionnelle : WITH … SELECT Contrairement à l’instruction conditionnelle when-else, with-select n’a pas de priorité LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY multiplexeur4 is PORT( entree : IN std_logic_VECTOR (3 DOWNTO 0); adresse : IN std_logic_VECTOR (1 DOWNTO 0); s : OUT std_logic); END; ARCHITECTURE with OF multiplexeur4 IS BEGIN WITH adresse SELECT s <= entree(0) WHEN "00", entree(1) WHEN "01", entree(2) WHEN "10", entree(3) WHEN OTHERS; mux entree(0) s adresse entree(1) entree(2) entree(3) Description VHDL
Description structurelle Entity add is port (A, B : in bit; Som, Ret : out bit); end add; architecture Arch_structurelle of add is component XOU port (E1, E2 : in bit; S : out bit); end component; component ET for U1 : XOU use entity work.XOU(Ar_XOU); for U2 : ET use entity work.ET(Ar_ET); begin U1 : XOU port map (A, B, Som); U2 : ET port map (A, B, Ret); end arch_structurelle; Déclaration du composant XOU Déclaration du composant ET. Spécification de l'entité et de l'architecture à utiliser pour les composants ET et XOU. Câblage (instanciation) des composants XOU et ET appelés U1 et U2. Description VHDL
Description structurelle Entity add is port (A, B : in bit; Som, Ret : out bit); end add; architecture Arch_structurelle of add is component XOU port (E1, E2 : in bit; S : out bit); end component; component ET for U1 : XOU use entity work.XOU(Ar_XOU); for U2 : ET use entity work.ET(Ar_ET); begin U1 : XOU port map (A, B, Som); U2 : ET port map (A, B, Ret); end arch_structurelle; U2 ET Ret U1 XOU B A Som E1 E2 Câblage (instanciation) des composants XOU et ET appelés U1 et U2. Description VHDL
Description comportementale Le process Le processus est une instruction concurrente définie à l ’aide d ’instructions séquentielles architecture Arch_comport of add is begin process (A, B) if (A = '0' and B = '0') then Som <= '0'; Ret <= '0'; end if; if (A = '0' and B = '1') then Som <= '1'; Ret <= '0'; end if; if (A = '1' and B = '0') then if (A = '1' and B = '1') then Som <= '1'; Ret <= '1'; end if; end process; end Arch_comport; Il est activé si un des signaux de la liste de sensibilité change d ’état Description du comportement de la fonction L'examen séquentiel des instructions a pour conséquence de rendre le dernier if prioritaire Description VHDL
Description comportementale Interprétation de If, then, elsif, ELSIF IF condition1 THEN instructions séquentielles; ELSIF condition2 THEN ELSIF condition3 THEN ELSE END IF;
Description comportementale Instruction CASE s'utilise dans un process CASE signal IS WHEN valeur1 => instructions séquentielles ; WHEN valeur2 => instructions séquentielles ; WHEN valeur3 => instructions séquentielles ; WHEN OTHERS => instructions séquentielles ; END CASE;
Description comportementale LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY combi4 IS PORT (c :IN INTEGER RANGE 0 TO 3; e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC ); END combi4; ARCHITECTURE archi OF combi4 IS BEGIN PROCESS(c) CASE c IS WHEN 0 => s<= e(0); WHEN 1 => s<= e(1); WHEN 2 => s<= e(2); WHEN 3 => s<= e(3); END CASE; END PROCESS; END archi; mux e(0) e(1) S c e(2) e(3)
Description comportementale Concurrence dans un process architecture Arch of Ent is begin Process (A, B) if (A = ’1’ and B = ’1’) then S1 <= ’1’; else S1 <= ’0’; end if; end process; Process (B, C) if (B = ’0’) then S2 <= A; elsif (C = ’1’) then S2 <= not(A); else S2 <= D; end if; end ; architecture Arch of Ent is begin S1 <= A and B; S2 <= A when B = ’0’ else S2 <= notA when C = ’1’ else S2 <= D; end Arch; Description VHDL
Description comportementale Instruction for loop Comme son nom l'indique l'instruction loop permet de répéter une opération de manière itérative en fonction d'un paramètre. FOR paramètre IN intervalle LOOP instructions séquentielles; END LOOP; Description VHDL
Description comportementale Exemple d'application de l'instruction for loop LIBRARY ieee;USE ieee.std_logic_1164.all; ENTITY adder4 IS PORT (a,b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); cin : IN STD_LOGIC; cout : OUT STD_LOGIC; sum : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END adder4 ; ARCHITECTURE compor OF adder4 IS signal c : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN PROCESS (a,b,cin,c) c(0) <= cin; FOR i IN 0 TO 3 LOOP sum(i) <= a(i) xor b(i) xor c(i); c(i+1) <= (a(i) and b(i)) or (c(i) and (a(i) or b(i))); END LOOP; cout <= c(4); END PROCESS; END compor; Description VHDL
Description comportementale Signaux, variables et constantes Ce sont les trois objets manipulés dans une description VHDL. Les trois objets sont nécessairement typés. Le signal est connu dans toute l'architecture où il est déclaré. Les ports sont des signaux. Les signaux ne sont pas mis à jour immédiatement dans un process. Dans un process la dernière assignation détermine la valeur attribuée au signal. (assignation : s <= a) (initialisation par s := '0') La variable ne peut être utilisé que dans un process où elle est locale. Elle est mise à jour instantanément. (assignation : i := '1') La constante peut être utilisée partout mais aucune assignation n'est possible. Seule l'initialisation est prévue exemple : CONSTANT PI : real := 3.1414 Description VHDL
Description comportementale Mauvaise utilisation d'un signal LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY mux_faux IS PORT (a, b :IN STD_LOGIC; e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC); END mux_faux; ARCHITECTURE archi OF mux_faux IS signal muxval : integer; BEGIN PROCESS(a, b, e) Description VHDL
Description comportementale Mauvaise utilisation d'un signal BEGIN muxval <= 0; if (a= '1') then muxval <= muxval + 1; end if; if (b= '1') then muxval <= muxval + 2; end if; CASE muxval IS WHEN 0 => s<= e(0); WHEN 1 => s<= e(1); WHEN 2 => s<= e(2); WHEN 3 => s<= e(3); WHEN OTHERS => null ; END CASE; END PROCESS; END archi; Pour muxval, il s'agit d'une assignation multiple dans un process. En conséquence, c'est la dernière ligne qui définit la valeur de muxval Description VHDL
Description comportementale PROCESS(a, b, e) variable muxval : integer; BEGIN muxval := 0; if (a= '1') then muxval := muxval + 1; end if ; if (b= '1') then muxval := muxval + 2; end if ; CASE muxval IS WHEN 0 => s<= e(0); WHEN 1 => s<= e(1); WHEN 2 => s<= e(2); WHEN 3 => s<= e(3); WHEN others => null; END CASE; END PROCESS; END archi; Correction : La variable étant mise à jour instantanément, la description est correctement interprétée Description VHDL
Erreur fréquente dans les processus Exemple : conception d'un décodeur 3 vers 8 binaire library IEEE; use IEEE.std_logic_arith.all ; use IEEE.std_logic_1164.ALL; ENTITY dec3vers8 IS PORT ( sel : IN BIT_VECTOR (2 DOWNTO 0); en : IN STD_LOGIC; Y : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END dec3vers8; ARCHITECTURE numero1 OF dec3vers8 IS BEGIN
Erreur fréquente dans les processus PROCESS(sel, en) BEGIN IF (en='1') THEN CASE sel IS WHEN "000" => Y(0)<= '1'; WHEN "001" => Y(1)<= '1'; WHEN "010" => Y(2)<= '1' ; WHEN "011" => Y(3)<= '1' ; WHEN "100" => Y(4)<= '1' ; WHEN "101" => Y(5)<= '1' ; WHEN "110" => Y(6)<= '1' ; WHEN "111" => Y(7)<= '1' ; END CASE; END IF; END PROCESS; END numero1; L'erreur fréquente dans les processus est d'oublier d'attribuer une valeur par défaut. Dans l'exemple lorsque en=‘0’, alors Y n'est pas attribuée. Le synthétiseur affecte dans ce cas un latch à chaque sortie Y
Erreur fréquente dans les processus PROCESS(sel, en) BEGIN Y <= "0000 0000"; -- valeur par défaut IF (en='1') THEN CASE sel IS WHEN "000" => Y(0)<= '1'; WHEN "001" => Y(1)<= '1'; WHEN "010" => Y(2)<= '1' ; WHEN "011" => Y(3)<= '1' ; WHEN "100" => Y(4)<= '1' ; WHEN "101" => Y(5)<= '1' ; WHEN "110" => Y(6)<= '1' ; WHEN "111" => Y(7)<= '1' ; END CASE; END IF; END PROCESS; END numero1;
Systèmes séquentiels Principes fondamentaux Bascule D Process (clk) Pour des raisons de reproductibilité et de robustesse par rapport aux aléas des fonctions combinatoires, seules les fonctions séquentielles synchrones sont recommandées! Bascule D Process (clk) Begin IF clk'event AND clk='1' THEN Q <= D; END IF; END Process; Attribut 'event vrai lorsque le signal associé subit une variation d'état Systèmes Séquentiels
Bascule D avec reset Avec Reset asynchrone Process (clk, reset) Begin IF reset = '0' THEN Q <= '0'; ELSIF clk'event AND clk='1' THEN Q <= D; END IF; END Process; La condition sur le reset est prioritaire Systèmes Séquentiels
Bascule D avec reset Avec Reset synchrone Process (clk) Begin IF clk'event AND clk='1' THEN IF reset = '0' then Q <= '0'; ELSE Q <= D; END IF; END Process; La condition sur le reset n’est pas prioritaire Systèmes Séquentiels
Bascule D avec Enable Process (clk, EN) BEGIN IF EN = '0' THEN Q <= Q ; ELSIF clk'event AND clk='1' THEN Q <= D; END IF; END Process; Question : La commande Enable est-elle synchrone ou asynchrone ? Systèmes Séquentiels
Compteurs Problèmes posés par les compteurs Les compteurs sont des machines d'état soit de MOORE soit de MEALY. Réaliser un compteur ou tout circuit d'incrémentation se traduit par une opération d'addition du type : Q <= Q + 1 ; Cette expression révèle deux problèmes : - Le port de sortie Q est utilisé comme entrée, ce qui n'est pas compatible avec son mode "out". - L'incrémentation de la valeur Q du type bit_vector, n'est pas possible avec l'opérateur arithmétique " + ". Systèmes Séquentiels
Compteurs Solution pour le problème de type: Utiliser un convertisseur de type exemple : CONV_STD_LOGIC_VECTOR ENTITY adder IS PORT (op1, op2 : IN UNSIGNED(7 DOWNTO 0); result : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END adder; ARCHITECTURE archi OF adder IS BEGIN result <= CONV_STD_LOGIC_VECTOR(op1 + op2, 8 ); END archi; conv_std_logic_vector (x,n) pour convertir un integer, unsigned ou signed x en un std_logic_vector de n bits Systèmes Séquentiels
Compteurs Solution au problème de port : ENTITY cpt3 IS PORT(e: IN INTEGER RANGE 255 DOWNTO 0; h, prepn, razn : IN STD_LOGIC; S: OUT INTEGER RANGE 0 TO 255 ); END cpt3; ARCHITECTURE archi OF cpt3 IS SIGNAL test : INTEGER RANGE 0 TO 255; BEGIN PROCESS(razn,h,prepn) IF razn = '0' THEN test<= 0; ELSIF (h'EVENT AND h ='1') THEN IF prepn='0' THEN test<=e; ELSE test<=test+1; END IF; ELSE test <= test; END IF; END PROCESS; S <= test; END archi; Solution au problème de port : Utiliser un signal ou une variable pour effectuer les opérations puis mettre la sortie à jour à la fin. Systèmes Séquentiels
Machines d'état (FSM) Machine de Moore Systèmes Séquentiels
Machines d'état (FSM) Machine de Mealy Systèmes Séquentiels
Type énuméré Énumération Création personnalisée d’un type correspondant à une énumération d’éléments explicites. Très utile pour identifier les états d'une machine d'états. Exemple : TYPE libelle_instruction IS (MOVE, ADD, JNE, BRS, RTS) ; SIGNAL Instruction : libelle_instruction ; Description VHDL
Machines d'état (FSM) Description VHDL Les FSM sont composées de trois parties, deux fonctions combinatoires et un registre. Chacune de ces parties peut être décrite séparément ou de manière composée avec une autre . Les états peuvent être identifiés explicitement à l'aide d'un type énuméré approprié ! Exemple : TYPE state IS (lecture, incrément, décode, exécute) ; Systèmes Séquentiels
Machines d'état (FSM) Description à trois parties ps : process(etat) ARCHITECTURE FSM3p of exemple IS TYPE state IS (lecture, incrément, décode, exécute) ; signal etat, etat_futur : state ; BEGIN Pr : process(horloge) ..... IF horloge'event .... ...... etat <= etat_futur ; ps : process(etat) ..... S <= .... pe : process(E, etat) ...... etat_futur <= ... Systèmes Séquentiels
Exemple de machine d'état Commande d'essuie glace On considère un essuie glace avec pompe de lavage. Le maintien de la commande E active le moteur M de balayage simultanément au moteur de pompe P. La libération de E arrête la pompe P. Le moteur M reste activé pendant deux cycles complet de balayage. Le système est équipé d'un contact de fin de course F. Représenter le graphe de la machine d'état du dispositif. Décrire la machine en VHDL. Systèmes Séquentiels
Exemple de machine d'état Commande d'essuie glace cyc_2 M , !P cyc_1 M, !P lavage M, P repos !M, !P ! F F E !E Systèmes Séquentiels
Exemple de machine d'état Type state is (repos, lavage, cyc_1, cyc_2) signal etat, etat_f : state; P1 : process(clk) begin if clk'event and clk='1' then etat <= etat_f; end if; end process P1; P2 : process(etat) if etat= repos then M <= '0'; P <= '0'; elsif etat = lavage then M <= '1'; P <= '1'; else M <= '1'; P <= '0'; end process P2; Description des sorties Registre Systèmes Séquentiels
Exemple de machine d'état P3 : process(F, E, etat) begin case etat is when repos => if E='1' then etat_f <= lavage ; else etat_f <= etat; end if; when lavage => if E = '0' then etat_f <= cyc_1 ; when cyc_1 => if E ='1' then elsif F= '1' then etat_f <= cyc_2 ; else etat_f <= cyc_1; end if; when cyc_2 => if E = '1' then elsif F= '1' then etat_f <= repos ; end process P3; Circuit d'excitation Systèmes Séquentiels
Machine d'état Simplification de l'écriture Il est possible de regrouper les parties combinatoires dans un processus, ce qui allège l'écriture au détriment de la lisibilité. Systèmes Séquentiels
Machine d'état Pour l'exemple cela donne : Type state is (repos, lavage, cyc_1, cyc_2) signal etat, etat_f : state; reg : process(clk) begin if clk'event and clk='1' then etat <= etat_f; end if; end process reg ; Systèmes Séquentiels
Machine d'état Etats de sorties Etat futur P3 : process(F, E, etat) begin case etat is when repos => M <= '0'; P <= '0' if E='1' then etat_f <= lavage ; else etat_f <= etat; end if; when lavage => M <= '1'; P <= '1'; if E = '0' then etat_f <= cyc_1 ; when cyc_1 => M <= '1'; P <= '0'; if E ='1' then etat_f <= lavage ; elsif F= '1' then etat_f <= cyc_2 ; when cyc_2 => M <= '1'; P <= '0'; if E = '1' then etat_f <= lavage ; elsif F= '1' then etat_f <= repos ; end process P3; Etats de sorties Etat futur Systèmes Séquentiels
Machine d'état autre simplification Créer un registre à la fin du circuit d’excitation Pour l'exemple cela donne : Type state is (repos, lavage, cyc_1, cyc_2) signal etat : state; -- pas de process registre P2 : process(etat) begin if etat= repos then M <= '0'; P <= '0'; elsif etat = lavage then M <= '1'; P <= '1'; else M <= '1'; P <= '0'; end if; end process P2; Etats de sorties Systèmes Séquentiels
Machine d'état autre simplification P3 : process(F, E, etat) Begin if clk'event and clk='1' then case etat is when repos => if E='1' then etat <= lavage ; else etat <= etat; end if; when lavage => if E = '0' then etat <= cyc_1 ; when cyc_1 => if E ='1' then etat <= lavage ; elsif F= '1' then etat <= cyc_2 ; when cyc_2 => if E = '1' then etat <= lavage ; elsif F= '1' then etat <= repos ; end case; end process P3; Description du registre d’état Systèmes Séquentiels
Méthodes de conception Flot de conception VHDL-RTL
Flot de Conception Conception Vérification Spécification Layout manuelle Analyse du problème Description comportementale Simulation comport. Raffinement architectural Description VHDL-RTL Conception Vérification Synthèse Netlist logique indépendante Synthèse technologique Netlist logique technologique Placement routage Simulation logique Layout
Instructions avancées Generate Generate est une instruction qui simplifie de manière très sensible l'écriture de descriptions structurelles complexes. L'instruction permet de répliquer automatiquement des composants en incrémentation les indices de bus. __generate_label : FOR __index_variable IN _plage GENERATE instruction; _instruction; END GENERATE; Description VHDL
Generate : exemple réalisation d'un registre à décalage Use work.std_logic_1164.all; Entity decalage is port (a, clk : in std_logic; b : out std_logic); end decalage; Architecture gen_decal of decalage is component D_basc port (d, clk : In std_logic; q : out std_logic); end component; signal z : std_logic_vector(0 to 4) Description VHDL
Generate : exemple suite Begin z(0) <= a ; instance : For i In 0 to 3 generate Dx : D_basc port MAP( z(i), clk, z(i+1)); End Generate; b <= z(4) ; End gen_decal; (d, clk : In std_logic; q : out std_logic); D clk Q Z(0) a Z(1) Z(2) Z(3) b Z(4) D_basc(0) D_basc(1) D_basc(2) D_basc(3) Description VHDL
Instructions avancées Generic Il est possible de rajouter une déclaration de GENERIC correspondant à des paramètres. Ces paramètres pourront, par la suite, être modifiés lors de l'utilisation de la description en temps que composant. Generic est utilisé pour deux applications principales : définition de paramètres de délai Paramétrage de la taille des bus GENERIC( _parameter_name : string := __default_value; _parameter_name : integer:= __default_value); Description VHDL
Generic : exemple Dans ces premiers exemples TP est une constante de type time. L'attribut after modélise le délai pour la fonction réalisée. Entity ET is GENERIC (TP : time := 0 ns); port (E1, E2 : in bit; S1 : out bit); end ET; architecture ET of ET is begin S1 <= E1 and E2 after TP; Entity OU is GENERIC (TP : time := 20 ns); port (E1, E2 : in bit; S1 : out bit); end OU; architecture OU of OU is begin S1 <= E1 or E2 after TP; Description VHDL
Generic suite de l'exemple Entity ET_OU is port (A, B : in bit; X, Y : out bit); end ET_OU; architecture ET_OU of ET_OU is component OU generic (TP : time); port (E1, E2 : in bit; S1 : out bit); end component; component ET for U1 : OU use entity work.OU(OU); for U2 : ET use entity work.ET(ET); begin U1 : OU generic map ( TP => 5 ns ) port map (A, B, X); U2 : ET generic map ( TP => 15 ns ) port map (A, B, Y); end ET_OU; Description VHDL
Packages regroupement de données, variables, fonctions, procédures, etc., que l'on souhaite pouvoir utiliser ou appeler à partir d'architectures. Au sein d'un projet contenant plusieurs entités, les packages permettent d ’utiliser des ressources (constantes, variables particulières, fonctions...) identiques. Deux unités pour les paquetages : La déclaration de paquetage (PACKAGE nom IS) Le corps de paquetage (PACKAGE BODY nom IS)qui contient les valeurs déclarées et la description des sous-programmes (procedure et fonction) PACKAGE __package_name IS -- Type Subtype Declaration -- Constant Declaration -- Signal Declaration -- Component Declaration -- procedure, fonction Declaration END __package_name; Non supporté par certains compilateurs Description VHDL
Exemple d ’application du paquetage Package exemple is constant delai : time; end exemple ; package body ex_bod of exemple is constant delai : time := 27ns; end ex_bod; Déclaration de la constante de type time Initialisation de la constante à 27ns Use work.exemple.all entity A is .......; end A; architecture arch_X of A is begin ......; S <= E after delai ; end arch_X; entity B is end B; architecture arch_X of B is Sb <= Ex after delai ; Utilisation de la même constante de temps dans deux entités A et B Description VHDL
Conception avancée Fonction Le langage VHDL permet l'utilisation et la création de fonctions ou de procédures que l'on peut appeler à partir d'une architecture. A la différence de la procédure la fonction renvoie une valeur unique. FUNCTION nom de la fonction ( liste des paramètres de la fonction avec leur type ) RETURN type du paramètre de retour IS zone de déclaration des variables ; BEGIN ...........; instructions séquentielles ; RETURN nom de la variable de retour ou valeur de retour; END; Description VHDL
Conception avancée Exemple 1 : FUNCTION bool_vers_bit (X : boolean) RETURN bit IS BEGIN if X then RETURN '1'; else RETURN '0'; end if; END; Description VHDL
Conception avancée Exemple 2 : fonction au sein d'un package Package outil is function xor3 (a,b,c : bit) return bit ; end outil; package body outil is function xor3 (a,b,c : bit) return bit is begin return (a xor b xor c) ; end xor3 ; end outil; library work ; use work.outil.all ; entity exemple2 is port (a,b,c : in bit; sum : out bit); end exemple2 architecture RTL of exemple2 is sum <= xor3(a, b, c) ; end RTL; Description VHDL
Conception avancée Procédure Les procédures diffèrent des fonctions par le fait qu'elles acceptent des paramètres dont la direction peut être IN, INOUT et OUT. Une procédure ne possède donc pas un ensemble de paramètres d'entrées et un paramètre de sortie mais un ensemble de paramètres d'entrées-sorties Exemple : PROCEDURE RS (signal A, B : IN bit; signal Q, Qb : INOUT bit) IS BEGIN Q <= not (A or Qb); Qb <= not (B or Q); END; Description VHDL
Macrofonctions combinatoires Décodeur binaire Fonction qui convertit des données codées en binaire en bits pondérés décimal. Ainsi toutes les valeurs sur n bits d'entrée sont représentées sur 2n sorties. Exercice : réaliser la description VHDL d'un décodeur 2 vers 4. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY decodeur IS PORT ( a :IN STD_LOGIC_VECTOR(1 DOWNTO 0); S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END decodeur; ARCHITECTURE archi OF decodeur IS BEGIN s <= "0001" when a = "00" else "0010" when a = "01" else "0100" when a = "10" else "1000" when a = "11" ; END archi; Macrofonctions combinatoires
Macrofonctions Exercice Réaliser un décodeur BCD-7segments library IEEE; use IEEE.std_logic_arith.all; use IEEE.std_logic_1164.ALL; ENTITY dec7seg IS PORT ( n : IN INTEGER RANGE 0 TO 15; segments : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END dec7seg; Macrofonctions combinatoires
Macrofonctions ARCHITECTURE numero1 OF dec7seg IS BEGIN PROCESS(n) CASE n IS WHEN 0 =>segments <= "1111110"; WHEN 1 =>segments <= "0110000" ; WHEN 2 =>segments <= "1101101" ; WHEN 3 =>segments <= "1111001" ; WHEN 4 =>segments <= "0110011" ; WHEN 5 =>segments <= "1011011" ; WHEN 6 =>segments <= "1011111" ; WHEN 7 =>segments <= "1110000" ; WHEN 8 =>segments <= "1111111"; WHEN 9 =>segments <= "1111011" ; WHEN others =>segments <= "0000001" ; END CASE; END PROCESS; END numero1; Macrofonctions combinatoires
Encodeur L'encodeur binaire réalise la fonction inverse du décodeur. Les 2n entrées sont pondérées décimal. L'entrée active de plus fort poids est codée en binaire sur n bits. Réaliser un encodeur à 4 entrées en utilisant when else LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY encodeur1 IS PORT ( a :IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)); END encodeur1; ARCHITECTURE archi OF encodeur1 IS BEGIN s <= "11" when a(3) = '1' else "10" when a(2) = '1' else "01" when a(1) = '1' else "00" when a(0) = '1' ; END archi; Macrofonctions combinatoires
Encodeur Réaliser un encodeur à 4 entrées en utilisant If then else LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY encodeur2 IS PORT (a :IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)); END encodeur2; ARCHITECTURE archi OF encodeur2 IS BEGIN PROCESS (a) IF a(3) = '1' THEN s<= "11" ; ELSIF a(2) = '1' THEN s<= "10"; ELSIF a(1) = '1' THEN s<= "01"; ELSE s<= "00"; END IF; END PROCESS ; END archi; Macrofonctions combinatoires
Encodeur Variante de l'encodeur utilisant trois instructions IF LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY encodeur3 IS PORT (a :IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)); END encodeur3; ARCHITECTURE archi OF encodeur3 IS BEGIN PROCESS (a) S<= "00"; IF a(1) = '1' THEN s<= "01"; END IF; IF a(2) = '1' THEN s<= "10"; END IF; IF a(3) = '1' THEN s<= "11"; END IF; END PROCESS ; END archi; Assignation multiple qui n'est possible que parce qu'elle est faite dans un process : la dernière est conservée Macrofonctions combinatoires
Multiplexeur Un multiplexeur permet d'aiguiller une donnée parmi N entrées vers une seule sortie. (cf exemple ch. assignation conditionnelle). Exercice : décrire un mux à n bits d'entrée en utilisant une affectation de type : S <= e(sel) Macrofonctions combinatoires
Multiplexeur LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux_n IS GENERIC(n : integer:= 4); PORT (e: IN bit_vector((2**n-1) downto 0) ; sel : IN integer range (2**n-1) downto 0 ; S : OUT bit); END mux_n; ARCHITECTURE RTL OF mux_n IS BEGIN S <= e(sel); END RTL; Macrofonctions combinatoires
Macrofonction de la bibliothèque Utilisation des macrofonctions LPM (Altera) LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; LIBRARY lpm; USE lpm.lpm_components.ALL; ENTITY cpt2 IS PORT( e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); h, prepn, razn : IN STD_LOGIC; s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cpt2; Déclaration des bibliothèques Systèmes Séquentiels
Macrofonction de la bibliothèque ARCHITECTURE archi OF cpt2 IS SIGNAL raz, prep : STD_LOGIC; BEGIN mon_compteur : lpm_counter GENERIC MAP ( LPM_WIDTH => 4, LPM_DIRECTION => "UP") PORT MAP (data => e(3 DOWNTO 0), clock => h, sload => prep, aclr => raz, q => s(3 DOWNTO 0)); razn <= NOT raz; prepn <= NOT prep; END archi; Instanciation de la macrofonction Déclaration des paramètres Connexion des ports Systèmes Séquentiels
ANNEXE
Types Types utilisés en électronique numérique Les signaux, variables et constantes ont obligatoirement un type qui définit l ’ensemble auquel ils appartiennent. Définition d'un type entier pour le signal A : A INTEGER RANGE 255 DOWNTO 0 (0to255) Description VHDL
Différence entre rangement ascendant et descendant : Vecteurs Vecteurs pour la manipulation de bus Assigner une valeur à un des éléments d'un bus: B(3) <= '1 ’ Assigner une valeur à l'ensemble du bus, plusieurs méthodes Déclaration de trois signaux correspondant à des bus (un vecteur de signaux) comportant 8 signaux A(0), A(1) ,..., A(7) et B(0), B(1) , ..., B(7) ainsi que S(0), S(1) , ..., S(7). rangement descendant A : in bit_vector (7 downto 0); rangement ascendant B : in bit_vector (0 to 7); S : out bit_vector (7 downto 0); Différence entre rangement ascendant et descendant : si A <= "11110000" alors A(7) = '1' si B <= "11110000" alors B(7) = '0' Description VHDL
Types std_logic et std_ulogic Le type bit est insuffisant à définir des états haute impédance ou indéfinis! Le standard IEEE de 1993 ( std_logic_1164) remédie à ce problème en définissant les types std_ulogic et std_logic le standard std_logic est résolu (des affectations multiples sont prévues) std_logic_vector et std_ulogic_vector sont des bus de type std. 'U' = Non initialisé, ’W’ = inconnu forçage faible, ’X ' = inconnu forçage fort, ’L’ = forçage faible, (bas) ’0’ = forçage fort, (bas) ’H’ = forçage faible, ’1’ = forçage fort, (haut) ’-’ = quelconque. (haut) ’Z ' = haute impédance, Description VHDL
Types std_logic et std_ulogic Le type bit est insuffisant à définir des états haute impédance ou indéfinis! Le standard IEEE de 1993 ( std_logic_1164) remédie à ce problème en définissant les types std_ulogic et std_logic le standard std_logic est résolu (des affectations multiples sont prévues) std_logic_vector et std_ulogic_vector sont des bus de type std. Seuls ces quatres états ont une signification pour la synthèse ’1’ = forçage fort, (haut) ’0’ = forçage fort, (bas) ’Z ' = haute impédance, ’-’ = quelconque. (haut) Description VHDL
Type énuméré et tableau Énumération Création personnalisée d ’un type correspondant à une énumération d ’éléments explicites. Exemple : TYPE libelle_instruction IS (MOVE, ADD, JNE, BRS, RTS) ; SIGNAL Instruction : libelle_instruction ; Tableau définition de tableau de valeurs de type quelconque. TYPE Tableau_4x8xbit IS ARRAY (3 downto 0, 7 downto 0) OF bit ; ou bien encore TYPE Tableau_8xbit IS ARRAY (7 downto 0) OF bit ; TYPE Tableau_4x8xbit IS ARRAY (3 downto 0) OF Tableau_8xbit ; Description VHDL
Type Record Type composé de plusieurs éléments différents et juxtaposés . L ’utilisation du ‘ . ’ permet ensuite d ’accéder à l ’élément souhaité. Exemple de type : TYPE Bus_micro IS RECORD Nbr_bit_adresse : integer ; Nbr_bit_donnee : integer ; Vitesse : time ; END RECORD ; Exemple d ’assignation sur ce type : Bus_micro.Nbr_bit_adresse <= 24 ; Bus_micro.Nbr_bit_donnee <= 16 ; Bus_micro.vitesse <= 10us ; Description VHDL
Conversion de type Nécessité Certains opérateurs peuvent être prévus uniquement sur un type fixé (ex : integer). L'utilisation de cet opérateur sur d'autres types (ex : std_logic_vector) nécessite une conversion de type. Ces convertisseurs sont parfois spécifiques au package utilisé. LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY adder IS PORT (op1, op2 : IN UNSIGNED(7 DOWNTO 0); result : OUT INTEGER); END adder; ARCHITECTURE maxpld OF adder IS BEGIN result <= CONV_INTEGER(op1 + op2); END maxpld; Description VHDL
Bibliothèques standard Bibliothèques du standard IEEE IEEE.std_logic_1164 : contient les types STD_logic et std_logic_vector ainsi que les opérateurs logiques : and, nand, or, nor, xor, xnor, not IEEE.std_logic_arith : contient un groupe d'opérateurs arithmétiques : "+", "-", "abs", "*", "<", ">", "<=", ">=", "/=", "=", shr, shl, conv_integer etc.. std_logic_signed : contient des opérateurs sur nombres entiers signés. std_logic_unsigned : contient des opérateurs sur nombres entiers non signés. Description VHDL
Opérateurs + , - , *, **, / valides sur entiers et flottants & : concaténation ex : a et b sur 2bits c<=a&b : sur 4 bits notation des bases : base#nombre# (la base est écrite en décimal) exemple : 16#A8# = 10#24# = 2#11000# Description VHDL