Vahid Meghdadi http://www.unilim.fr/pages_perso/vahid/ Cours Conception circuits numériques – 6x1h30 de cours + 1h30 exam – 17 HTP (5x3h + 2h !) Notation – Exam théorique – Evaluation TP – Exam pratique Formation VHDL Vahid MEGHDADI 1 Introduction aux conceptions numériques Formation VHDL Vahid MEGHDADI Une partie de ce cours a été emprunté de DSPedia développé par Dr. Bob Stewart à steepest ascent, Glasgow. 2 Chapitre : Introduction Implantation des circuits numériques •Avec des éléments discrets •Avec des microprocesseurs, micro contrôleurs, DSP •Avec des circuits à architecture programmable PAL, GAL, FPGA •Avec des circuits intégrés ASIC PLD : Programmable Logic Device, CPLD : Complex PLD, PAL: Programmable Array Logic, GAL: Generic Array Logic, FPGA : Field Programmable Gate Array, ASIC : application-specific integrated circuit Formation VHDL Introduction Vahid MEGHDADI 3 Circuit avec des éléments discrets •Circuit figé •Circuit imprimé difficile à modifier •Intégration limitée •Coût élevé •Justifié pour de petits circuits Formation VHDL Introduction Vahid MEGHDADI 4 Circuit à fonctionnement programmable •A base des microprocesseurs, Microcontrôleurs, DSP •En modifiant le programme on modifie la fonction •Plus souple que les circuits à éléments discrets •Vitesse limitée (mais qui augmente sans cesse) Microprocesseur •Parallélisme compliqué (mais faisable) •Intégration encore limitée Mémoire Pér iph éri que •Adapté à des opérations séquentielles Formation VHDL Introduction Vahid MEGHDADI 5 Circuit à architecture programmable •Une quantité importante de portes logiques •Des matrices d'interconnections programmables •Modification du fonctionnement sur le circuit (ISP: In-System Programming) •Souplesse assurée •Coût de fabrication faible (pour un nombre limité) •Intégration forte •Adapté à des applications gourmandes en logique •Temps de développement dépend de l'application • Compliqué pour implanter des algorithmes complexes Formation VHDL Introduction Vahid MEGHDADI 6 Les ASIC Application Specific Integrated Circuit • Coût très bas uniquement pour de gros tirages • Temps de développement important • Pas de modifications une fois fabriqué • Nécessitant un fondeur pour la fabrication Formation VHDL Introduction Vahid MEGHDADI 7 ASIC ou FPGA ? ASICs FPGAs High performance Low development cost Low power Short time to market Low cost in high volumes Formation VHDL Reconfigurability Introduction Vahid MEGHDADI 8 Evolution : Méthodes de CAO Conception physique (layout) Conception structurelle TTL Conception logique Conception fonctionnelle RTL Programmation Verilog/VHDL Synthèse comportemental Formation VHDL Introduction Vahid MEGHDADI 9 Démonstrateurs Circuit de développement Nexys3 Formation VHDL Introduction Vahid MEGHDADI 10 Exemple Une carte polyvalente et reconfigurable Connecteur d’extension VGA Formation VHDL Introduction Vahid MEGHDADI 11 Logique (FPGA) ou software (µP et DSP) ? • Vitesse • Possibilité de parallélisme (calcul dans l’espace ou dans le temps) • Exemple y=Ax²+Bx+C FPGA DSP Formation VHDL Introduction Vahid MEGHDADI 12 Intérêt de la logique par rapport à µP • Jeu d’instruction peut ne pas contenir l’opération voulue • Processeur peut contenir des circuits qui ne servent à rien dans notre application (Par exemple URAT) • Processeur a besoin de la mémoire pour garder le programme et les valeurs intermédiaires • Le nombre de bits pour présenter les données peut être trop ou peu • Parallélisme très limité par software Formation VHDL Introduction Vahid MEGHDADI 13 Architecture des FPGA Feild Programmable Gate Array CLB= Configurable Logic Block Formation VHDL CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB CLB Introduction Vahid MEGHDADI 14 FPGA architecture interne BLE= Basic Logic Element Inputs Programmable IO K LUT Out D FF Clock Programmable Logic (CLB) BLE #1 N Outputs I I Inputs N BLE #N Clock Programmable Routing Formation VHDL Introduction Vahid MEGHDADI 15 Architecture simplifiée de CLB Inputs Look-Up Table (LUT) Out Out = f (in0, in1, in2, in3) State Clock Enable Formation VHDL Introduction Vahid MEGHDADI 16 FPGA Xilinx Xilinx a été fondée en 1984 pour fabriquer des circuits à logique programmable. Plusieurs familles de FPGA •Série 4000 (les années 90) •Spartan (1998) •Spartan (II, III, VI) (depuis 2000) (Spartan 6 depuis 2009)(spartan7 2017) •Virtex (II, IV, V, VI, VII) (depuis 2001) •Artix (2010) •Kintex (2010) •Zynq (SoC) (2011) Formation VHDL Introduction Vahid MEGHDADI 17 Remarque Spartan (depuis 1998) Le nombre de broches I/O, le nombre de CLB différentie les FPGA de la famille. Formation VHDL Introduction Vahid MEGHDADI 18 Remarque Spartan II Ajout de la RAM Formation VHDL Introduction Vahid MEGHDADI 19 Remarque Formation VHDL La famille Spartan II Introduction Vahid MEGHDADI 20 Remarque Formation VHDL Spartan 3 Vahid MEGHDADI 21 Remarque La famille Virtex •Les LUT transformables en registre à décalage •Plus de CLB, plus de mémoire, plus de slices par CLB •Plus de I/O •Multiplieurs câblés à partir de Virtex II •DSP slices •Microprocesseur embarqué (PowerPC) Formation VHDL Introduction Vahid MEGHDADI 22 Remarque Formation VHDL La famille Virtex Introduction Vahid MEGHDADI 23 Remarque Formation VHDL La famille Virtex-II pro Introduction Vahid MEGHDADI 24 Remarque Virtex 5 et le LUT LUT à 6 entrées et 2 sorties: permettant de construire des logiques plus sophistiques dans un seul slice. Formation VHDL Vahid MEGHDADI 25 Remarque Formation VHDL Virtex 5 et les blocs DSP Vahid MEGHDADI 26 Remarque Formation VHDL Série 7 (depuis 2010) Vahid MEGHDADI 27 Outil de développement L’IDE (Integrated development environment) - jusqu’en 2012 : ISE - Depuis 2012 VIVADO - La dernière version d’ISE : 14.7 En TP on utilise ISE qui supporte spartan 6. Pour la série 7, on doit utiliser Vivado Formation VHDL Vahid MEGHDADI 28 Conception circuit o o EPROM o Les blocs reconfigurables Structure régulière de “logic cells”, connectée par un réseau d’interconnexions La configuration est stocké dans un SRAM, qui doit être chargé au démérrage Formation VHDL Introduction Vahid MEGHDADI 29 Design flow HDL (VHDL / Verilog) Synthesize Hardware design is traditionally done by modeling the system in a hardware description language o An FPGA “compiler” (synthesis tool) generates a netlist, o Netlist Map Place Route which is then mapped to the FPGA technology, o the inferred components are placed on the chip, o and the connecting signals are routed through the interconnection network. o Bitstream Formation VHDL Introduction Vahid MEGHDADI 30 Synthèse HDL HDL (VHDL / Verilog) process(clk, reset) begin if reset = ‚1‘ then output <= ‚0‘; elsif rising_edge(clk) then output <= a XOR b; end if; Synthesize Netlist end process; Map Place Route Register a b ⊕ D clk Bitstream Q output clear reset Formation VHDL Introduction Vahid MEGHDADI 31 Technology Mapping HDL (VHDL / Verilog) Register a b ⊕ D clk Synthesize Q output clear reset Netlist Map Place Route Bitstream Formation VHDL Introduction Vahid MEGHDADI 32 Placement & Routage HDL (VHDL / Verilog) Synthesize Netlist Map Place Route Bitstream Formation VHDL Introduction Vahid MEGHDADI 33 Système embarqué traditionnel Ethernet MAC Audio Codec Power Supply CLK CLK Interrupt Controller GP I/O Address Decode Unit CPU UART (uP / DSP) CLK SRAM Memory Controller SRAM SRAM SDRAM Timer CoProc. SDRAM custom IF-logic L C Display Controller Images by H.Walder Formation VHDL Introduction Vahid MEGHDADI 34 Système embarqué traditionnel Ethernet MAC Audio FPGA Codec Power Supply CLK CLK Interrupt Controller GP I/O Address Decode Unit CPU UART (uP / DSP) CLK SRAM Memory Controller SRAM SRAM SDRAM Timer CoProc. SDRAM custom IF-logic L C Display Controller Images by H.Walder Formation VHDL Introduction Vahid MEGHDADI 35 System on Chip Configurable (CSoC) Audio Codec EPROM Power Supply L C SRAM SRAM SRAM SDRAM SDRAM Images by H.Walder Formation VHDL Introduction Vahid MEGHDADI 36 Avantages Moins de composantes physiques Cycle de conception plus rapide Programmable sur le circuit (Mise à jour, modification...) Plus performant grâce à l’intégration Horloge peut être plus rapide dans la puce que sur le circuit imprimé Optimisation entre modules possible Formation VHDL Introduction Vahid MEGHDADI 37 Chapitre : Introduction A VHDL Introduction au langage VHDL Formation VHDL Introduction A VHDL Vahid MEGHDADI 38 VHDL V H D L Formation VHDL VHSIC (Very High Speed Integradted Circuit) Hardware Description Language Introduction A VHDL Vahid MEGHDADI 39 Remarque Un peu d’histoire •Début des années 80 •la nécessité d’un langage non ambigu des systèmes matériels pour intégration à grande échelle •normalisation pour être indépendant du fournisseur •Norme définitive adoptée en 1987 : IEEE Std 1076 •La norme a été revue en 93, 2000 et 2002 •Les premiers outils de synthèse en 1995 Formation VHDL Introduction A VHDL Vahid MEGHDADI 40 Qu’est ce que on attend de VHDL • VHDL est utilisé pour • Décrire des circuits numériques • Décrire des machines à états • Préparer des signaux de test pour simuler cette écriture • Le langage concurrent : Verilog Formation VHDL Introduction A VHDL Vahid MEGHDADI 41 Qu’est ce que on attend des outils de synthèse •Une fois le programme en VHDL est écrit, il faut maintenant le réaliser •Synthèse logique : générer des fonctions logiques à partir du programme •Implémentation : adapter la logique synthétisée à la cible (FPGA, CPLD) •Génération : Générer un fichier binaire à télé-charger sur le « device » Formation VHDL Introduction A VHDL Vahid MEGHDADI 42 Niveau d’abstraction Synthèse comportemental Synthèse logique Placement routage Comportemental RTL VHDL Logique Layout Formation VHDL Introduction A VHDL Vahid MEGHDADI 43 Chapitre : Structure du VHDL Il existe 5 catégories d’unité de conception Circuit principal •L’entité (mot clé entity) Décrit un système vu extérieur (boîte noire) •L’architecture (mot clé architecture) Décrit l’intérieur (le fonctionnement) d’une boîte noire. •La configuration (mot clé configuration) Package (librairie) Formation VHDL •La déclaration de paquetage (mot clé package) •Le corps de paquetage (mot clé package body) Structure du VHDL Vahid MEGHDADI 44 Minimum design en VHDL Deux unités obligatoires • une entité • une architecture Un circuit décrit en VHDL Déclaration d’entité Architecture Formation VHDL Vahid MEGHDADI 45 Exemple simple: entité L’entité déclare la vue externe du circuit : les ports d’entréesorties et leur type. Elle peut aussi déclarer des paramètres. Exemple: L’entité du circuit ci-contre qu’on appellera « AOI» entity AOI is Port( A,B,C,D: in std_logic; F : out std_logic); end AOI; Formation VHDL AOI Vahid MEGHDADI 46 Entité décortiquée Entity name Port names Port type ENTITY nand_gate IS PORT( a : IN STD_LOGIC; b : IN STD_LOGIC; z : OUT STD_LOGIC ); END nand_gate; Reserved words Semicolon No Semicolon after last port Port modes (data flow directions) Même chose mais en moins lisible, non recommandée !! ENTITY nand_gate IS PORT(a,b: IN STD_LOGIC;z : OUT STD_LOGIC );END nand_gate; Formation VHDL Entité Vahid MEGHDADI 47 Remarque std_logic définit un type plus que binaire. En fait, un objet de type std_logic peut recevoir des valeurs ‘0’ et ‘1’ mais aussi autres valeurs comme par exemple « haute impédance ». On verra les types bien tôt. On remarque aussi les modes des signaux: in, out. Il y en a d’autres: buffer, inout. Formation VHDL Vahid MEGHDADI 48 Exemple simple: architecture L’architecture définit le fonctionnement du circuit. architecture v1 of AOI is -- les déclarations begin F <= not((A and B) or (C and D)); end v1; Formation VHDL Vahid MEGHDADI 49 Remarque On remarque l’opérateur d’affectation <= Les opérateurs logiques "and", "or", "nor", "nand" et "not" font parti des opérateurs connus du langage. On remarque aussi que -- est utilisé pour des commentaires. Il existe deux parties dans l’architecture - avant begin : zone des déclarations - Après begin : la partie "exécutable". Formation VHDL Vahid MEGHDADI 50 Exemple simple: architecture bis architecture v2 of AOIis signal I1,I2,I3: std_logic; begin I1 <= A and B; I2 <= C and D; I3 <= I1 or I2; F <= not I3; end v2; Formation VHDL I1, I2 et I3 sont des signaux internes. Vahid MEGHDADI 51 Principe de concurrence Tous les mêmes ! architecture v2 of AOI is signal I1,I2,I3: std_logic; begin I1 <= A and B; F <= not I3; I2 <= C and D; I3 <= I1 or I2; end v2; Formation VHDL architecture v3 of AOI is signal I1,I2,I3: std_logic; begin I1 <= A and B; I2 <= C and D; I3 <= I1 or I2; F <= not I3; end v3; architecture v4 of AOI is signal I1,I2,I3: std_logic; begin F <= not I3; I3 <= I1 or I2; I2 <= C and D; I1 <= A and B; end v4; Vahid MEGHDADI 52 Remarque Dans une architecture, toutes les instructions sont exécutées en parallèle : elles sont concurrentes et non pas « séquentielles ». La partie après "begin" dans une architecture est une zone concurrente. Formation VHDL Vahid MEGHDADI 53 Décrire des délais Dans des circuits réels, les portes logiques présentent des délais. On pourra aussi les décrire. Formation VHDL Vahid MEGHDADI 54 Délai dans les affectations - Une affectation sera déclenchée quand un évènement arrive - Un évènement est un changement de valeur d’un signal - Pour l’instruction ci-dessous, cet évènement est le passage de A de 0 à 1. - Cependant, l’affectation se concrétise après 2 ns. Formation VHDL Vahid MEGHDADI 55 TRES IMPORTANT Attention: l’instruction d’affectation retardé est importante en simulation, par contre n’a aucun effet en synthèse. L‘outil de synthèse ignore « after »: Pour la synthèse : I1 <= A and B after 2 ns; ≡ I1 <= A and B; Le circuit qui sera réalisé présentera un délai qui dépendra de la technologie utilisé, longueur des câblage, etc. Formation VHDL Vahid MEGHDADI 56 Résultat obtenu en simulation Formation VHDL Vahid MEGHDADI 57 Exemple A Demiadditionneur B A SUM B C Formation VHDL Architecture SUM C A B SUM C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 Vahid MEGHDADI 58 Programme VHDL correspondant entity DEMI_ADD is port (A,B: in std_logic; SUM,C: out std_logic); end DEMI_ADD; architecture COMPORT of DEMI_ADD is begin SUM <= A xor B; --instruction concurrente C <= A and B; --instruction concurrente end COMPORT; Formation VHDL Architecture Vahid MEGHDADI 59 Hiérarchisation en VHDL Formation VHDL Vahid MEGHDADI 60 Hiérarchie in VHDL - Un bloc conçu, testé, et fonctionnel peut être réutilisé. On l’appelle component. - Dans un design qui utilise ce component - On déclare entité du component - On instancie un exemplaire de ce component dans la zone concurrente - On procède au câblage de ce component Formation VHDL Vahid MEGHDADI 61 Exemple : multiplexeur 2 voies Si SEL=‘0’, Y <=X1, et si SEL=‘1’, Y<=X2 Formation VHDL Vahid MEGHDADI 62 Déclaration de component Déclaration du component Formation VHDL Vahid MEGHDADI 63 Déclaration de signaux Formation VHDL Vahid MEGHDADI 64 Instanciation du component Instanciation du component Formation VHDL Vahid MEGHDADI 65 Instructions Concurrentes / séquentielles Formation VHDL Vahid MEGHDADI 66 Instructions concurrentes ou séquentielles En VHDL, il existe deux types d’instructions • Instructions concurrentes • à écrire dans la zone concurrente de l’architecture • elles sont exécutées simultanément • l’ordre de l’écriture n’a pas d’importance • Instruction séquentielles • à écrire dans les « process » • elles sont exécutées dans l’ordre Formation VHDL Vahid MEGHDADI 67 Exemple A B C Formation VHDL I S I <= A or B; S <= I and C S <= I and C I <= A or B; Zone concurrente Vahid MEGHDADI 68 Instruction concurrente conditionnelle Exemple d’instructions concurrentes: Affectation conditionnelle: when – else (équivalent de ifthen-else dans d’autre langages) Formation VHDL Vahid MEGHDADI 69 Instruction concurrente sélective • La condition se fait sur un seul objet (comme le signal sel ci-dessous) • Le mot clé others doit être utilisé pour couvrir les cas non spécifiés Formation VHDL Vahid MEGHDADI 70 Remarque L’affectation sélective produit très souvent un circuit plus simple (par rapport à l’affectation conditionnelle) parce qu’il n’y a pas de priorité dans différentes branches. De plus, la condition est à tester sur un seul objet. Exemple Formation VHDL Vahid MEGHDADI 71 Exemple instruction « with-select » Codeur sept-segment with HEX select LED<= "1111001" "0100100" "0110000" "0011001" "0010010" "0000010" "1111000" "0000000" "0010000" "0001000" "0000011" "1000110" "0100001" "0000110" "0001110" "1000000" Formation VHDL when when when when when when when when when when when when when when when when "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", others; --1 --2 --3 --4 --5 --6 --7 --8 --9 --A --b --C --d --E --F --0 Zone concurrente 7 Circuit combinatoire 4 Vahid MEGHDADI 72 Remarque Exemple ALU entity ADDER port (A,B SEL S : end ADDER; is :in std_logic_vector(7 downto 0); : in std_logic; out std_logic_vector(7 downto 0)); architecture COMPORT of ADDER is Begin with SEL select S <= A+B when '0', A-B when others; -- ou on peut utiliser when-else -S <= A+B when SEL=‘0’ else A-B; end COMPORT; Formation VHDL Zone concurrente Vahid MEGHDADI 73 Process Formation VHDL Vahid MEGHDADI 74 Process • Process est une instruction concurrente : donc à écrire dans une architecture (après begin), • Les différents process d'une architecture s'exécutent tous en parallèle •Process génère une zone séquentielle Formation VHDL Process Vahid MEGHDADI 75 Syntaxe de process •Syntaxe de process : label : -- optionnel process (liste de sensibilité) {partie déclarative} begin suite d’instructions séquentielles end process; •Notion très importante : Un process s'exécute (se réveille) quand un des signaux de la liste de sensibilité change de valeur. •Un fois on arrive à la fin du process, celui-ci rendort jusqu’à l’arrivée d’un évènement sur un des signaux de sa liste de sensibilité, Formation VHDL Process Vahid MEGHDADI 76 Instructions séquentielles •Ils s'écrivent uniquement dans une zone séquentielle: après le « begin » d’un process • instruction d'attente (wait) • instruction d'affectation (temporisée) • instruction conditionnelle (if) • instruction sélective (case) Formation VHDL Process Vahid MEGHDADI 77 Instructions wait L’exécution des lignes d’un process s’arrête quand on arrive à la commande « wait », on dit que le process est suspendu ! Le process pourra redémarrer suivant une condition. •Wait •wait until condition; •wait until A=‘ 1 ’; •wait until CLK’event and CLK=’1’; • wait for time expression; •wait for 5 ns; • wait on signal; •wait on A , B Formation VHDL Process Vahid MEGHDADI 78 Remarque La génération de l’horloge et en même temps d’un signal Reset. clock_gen: process begin CLK_TB <= '1'; Instructions wait for 5 ns; CLK_TB <= '0'; séquentielles wait for 5 ns; end process; --------------------------------------reset_gen: process begin RST_TB <= ‘0’; wait for 5ns; Instructions RST_TB <= ‘1’; wait for 15ns; séquentielles RST_TB <= ‘0’; wait; end process; --------------------------------------inst: counter port map ( CLK => CLK_TB, RST => RST_TB, Q => DATA_OUT ); Formation VHDL Instructions concurrentes Vahid MEGHDADI 79 Instructions conditionnelle if condition then sequential statements [elsif condition then sequential statements ] [elsif condition then sequential statements ] [else sequential statements ] end if; Formation VHDL Process Vahid MEGHDADI 80 Instruction sélective Permet de sélectionner une suite d’instructions à exécuter en fonction de la valeur d’une expression. case EXPRESSION is when VAL1 => when VAL2|VAL3|VAL4 => when VAL5 to VAL7 => when others => end case; suite d’instructions séquentielles suite d’instr séquentielles suite d’instr séquentielles suite d’instr séquentielles •L’ordre des branches n’a pas d’importance (sauf others) •La branche « others » est obligatoire si toutes les valeurs de l’expression ne sont pas énumérées. Formation VHDL Process Vahid MEGHDADI 81 Remarque Exemple Multiplexeur 4 voies S1 S0 A B C D Formation VHDL M U X 4 Process Z Vahid MEGHDADI 82 Remarque Exemple (avec if) entity MUX_4 is port (S1, S0, A, B, C, D: in std_logic; Z: out std_logic); end MUX_4; architecture behav_MUX_4 of MUX_4 is begin P1: process (S1, S0, A, B, C, D) - - la liste de sensibilité begin if (( not S1 and not S0 )=’1’) then Z <= A; elsif (( not S1 and S0) = ‘1’) then Z <=B; elsif ((S1 and not S0) =’1’) then Z <=C; else Z <=D; end if; end process P1; end behav_MUX_4; Formation VHDL Process Vahid MEGHDADI 83 Remarque Exemple (avec case) entity MUX_4 is port ( S : in std_logic_vector(1 downto 0); A, B, C, D: in std_logic; Z: out std_logic ); end MUX_4; architecture behav_MUX_4 of MUX_4 is begin P1: process (S, A, B, C, D) - - la liste de sensibilité begin case S is when "00" => Z <= A; when "01" => Z <= B; when "10" => Z <= C; when "11" => Z <= D; -- ou when others => Z <= D; end case; end process P1; end behav_MUX_4; Formation VHDL Process Vahid MEGHDADI 84 Affectation séquentielle Attention : affectation d’une valeur à un signal dans un process n’est pas immédiate ! L’affectation se réalise quand le process est suspendu, ou quand on arrive à la fin du process. Dans un process tous les signaux sont constants, ils sont actualisés quand le process est suspendu (end de process, ou wait) Exemple: process(A) begin A <= ‘0’; B <= A; end process; Formation VHDL --ici le signal A ne recevra pas ‘0’ --ici donc, B recevra l’ancienne valeur de A mais --au moment où le process sera suspendu --c’est ici que A reçoit ‘0’ et B reçoit --l’ancienne valeur de A Vahid MEGHDADI 85 Remarque Attention ! Le process ci-dessous ne produira pas le signal cicontre SIG Process (x) begin SIG <= '0'; SIG <= '1'; SIG <= '0'; end process; Formation VHDL SIG Process Vahid MEGHDADI 86 Circuits séquentiels Trois types de circuit • Combinatoire • Séquentiel • Synchrone Formation VHDL Vahid MEGHDADI 87 process combinatoire Un process n’est plus combinatoire si au moins une des conditions suivantes est vérifiée : • la liste de sensibilité ne comprend pas tous les signaux lus • les signaux ne sont pas affectés quelle que soit la branche • une variable est lue avant d'être affectée Le circuit généré aura donc quelque part une mémoire ! Formation VHDL Circuits séquentiels Vahid MEGHDADI 88 Exemple: Verrou ou Latch Bascule à verrouillage entity L is port (D,EN : in std_logic; Q : out std_logic); end L; Formation VHDL architecture A of L is begin process (D,EN) begin if EN='1' then Q <= D; end if; end process; end A; Circuits séquentiels Ce qu’on préfère ! architecture A of L is begin process begin wait on D,EN; if EN='1' then Q <= D; end if; end process; end A; Vahid MEGHDADI 89 Registre (latch synchrone) Un circuit synchrone sur le front d’un signal (CLK) process (CLK) begin if CLK'event and CLK='1' then Q <= D; end if end process; process (CLK) begin if rising_edge(CLK) then Q <= D; end if end process; Formation VHDL D Q CLK Bascule D 8 D Q 8 CLK Registre de taille 8 dépendant du type de Q et D Circuits séquentiels Vahid MEGHDADI 90 Registre avec SET ou RESET entity R is port (D,CLK,SET: in std_logic; Q: out std_logic); end R; architecture A of R is begin -- set asynchrone process (SET,CLK) begin if SET = '1' then Q <= '1'; elsif CLK'event and CLK='1' then Q <= D; end if; end process; end A; Formation VHDL architecture A of R is begin -- set synchrone process (CLK) begin if CLK'event and CLK='1' then if SET = '1' then Q <= '1'; else Q <= D; end if; end if; end process; end A; Circuits séquentiels Vahid MEGHDADI 91 Exemple : compteur Création d’un compteur 3 bits: 000-001-010-011-100-101-110-111-000-001-… Supposons que le FPGA reçoit un signal CLK à l’entrée et qu’il sort 3 fils représentant les 3 bits du compteur. -- signal cmp: std_logic_vector(2 downto 0); process(CLK) begin if CLK’event and CLK=‘1’ then cmp <= cmp+1; end if; end process; Exercice: tracer les chronogrammes des signaux CLK et cmp. Formation VHDL Vahid MEGHDADI 92 Exemple Créer le signal “trig” à partir du signal d’horloge CLK CLK trig 0 1 2 3 0 1 2 3 0 1 2 /4 -- signal cmp: integer range 0 to ?; process(CLK) begin if CLK’event and CLK=‘1’ then trig <= ‘0’; cmp <= cmp + 1; if cmp = ? Then cmp <= 0; trig <= ‘1’; end if; end if; end process; Formation VHDL Vahid MEGHDADI 93 Objets en VHDL Formation VHDL Vahid MEGHDADI 94 Objets en VHDL En VHDL, il existe 3 classes d’objet pour garder ou représenter des data. - signal : représente des fils, des bus, des registres - variable : comme les variables dans d’autres langages - constant : dont la valeur ne change pas Tout objet est typé. Formation VHDL Vahid MEGHDADI 95 Constants Exemple: constant NUMBER_OF_BITS: integer :=0; C’est une valeur explicite constant PIN_CODE: bit_vector(3 downto 0) :="0110"; Utilisation des constants rend la modification du programme plus simple. Formation VHDL Vahid MEGHDADI 96 Variable variable current_bit: std_logic := ‘0’; Initialisation optionnelle • Les variables sont utilisées uniquement dans les process. • Elles sont déclarées dans le process avant le mot clé « begin » (c’est le begin du process). • Contrairement aux signaux, les variables sont affectées tout de suite, on n’a pas besoin d’attendre la suspension du process. • Affectation se fait par ":=" et non pas par "<=" : • Formation VHDL current_bit := not current_bit; Vahid MEGHDADI 97 Signal signal carry_out : std_logic := '0'; Initialisation optionnel, souvent ignoré en synthèse donc utile seulement pour simulation - Les signaux sont comme les câbles (fils) dans un circuit - Ils sont utilisés pour connecter les éléments concurrents d’un circuit - L’affectation à un signal peut être retardé (uniquement en simulation, en synthèse le retard est imposé par le circuit !): carry_out <= '1' after 10ns; - Les signaux sont déclarés soit dans l’entité (les ports d’entrée – sortie), soit avant « begin » d’une architecture. Formation VHDL Vahid MEGHDADI 98 Signaux et variables Les signaux interconnectent les éléments concurrents Variables peuvent être utilisées à l’intérieur des process et ne sont pas visibles en dehors de process. Formation VHDL Vahid MEGHDADI 99 Remarque Variables: - Peuvent être utilisées dans le process où ils sont déclarées - Ne peuvent pas apparaitre dans la liste des sensibilités - Ne peuvent pas être retardées - affectation immédiate Signaux - Peuvent être utilisés pour relier des process - Peuvent apparaitre dans la liste des sensibilités des process - Peuvent être retardés Formation VHDL Vahid MEGHDADI 100 Types en VHDL Formation VHDL Vahid MEGHDADI 101 Types en VHDL VHDL est un langage très typés. - Tout élément doit être associé à un type - Conversion des types est possible moyennant des fonctions explicites - Il est possible de définir un sous-type qui héritera les contraintes du type d’origine 4 catégories de types - Type scalaire : integer, reals, physique, énuméré - Type composite: array, records - Type accès: comme des pointeurs - Type File Formation VHDL Vahid MEGHDADI 102 Type scalaire •énuméré type T_FEU is (ROUGE, ORANGE, VERT); signal FEU : T_FEU; •entier signal COMPT : integer range 0 to 15; •flottante signal MASSE : REAL; -- de -1e38 à 1e38 •physique qui est un entier avec l'unité correspondant type TIME is range … to … --64 bits units fs; ps=1000 fs; ns=1000 ps; … hr=60 min; end units; T <= 5 ns; Formation VHDL Types en VHDL Vahid MEGHDADI 103 Remarque type integer is range -2147483647 to 2147483647; type real is range -1.0E308 to 1.0E308; type time is range -2147483647 to 2147483647 units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units; subtype natural is integer range 0 to integer’high; subtype positive is integer range 1 to integer’high; Formation VHDL Vahid MEGHDADI 104 Type énuméré Les types ci-dessous sont des types prédéfinis type BOOLEAN is (FALSE, TRUE); type BIT is ('0' , '1'); type severity_level is (note, warning, error, failiure); type character is (…,’A’,’B’,…); On peut définir son propre type. On déclare toutes les valeurs qu'un objet de ce type peut prendre. type T_FEU is (ROUGE, ORANGE, VERT); signal FEU : T_FEU; type ETAT is (INIT, LECT, ECR, ATT); Formation VHDL Types en VHDL Vahid MEGHDADI 105 Type entier (scalaire) C'est un type prédéfini type integer is range -2_147_483_648 to 2_147_483_647 On peut définir un sous type : subtype nom_de_sous_type is type_de_base contraintes; Le type Natural existe dans le library standard: subtype NATURAL is INTEGER range 0 to INTEGER'high Formation VHDL Types en VHDL Vahid MEGHDADI 106 Logique à valeurs multiples (scalaire) •Il existe des signaux logiques à plusieurs états: 0, 1, mais aussi haute impédance, don’t care, non déterminé, … •Le type "std_logic" remplace le type "bit" pour permettre d’avoir 9 états différents •Utilisation de librairie IEEE.std_logic_1164 •exemple library IEEE; use IEEE.STD_LOGIC_1164.ALL; signal SORTIE, Q: std_logic; … SORTIE <= ‘Z’; -- haute impédance Q <= ‘1’; Formation VHDL Types en VHDL Vahid MEGHDADI 107 Le type std_logic ‘L’ Le type std_logic : ‘U’ non initialisé ‘X’ non connu ‘0’ logique 0 Strong drive ‘1’ logique 1 ‘Z’ haute impédance ‘W’ non connu ‘L’ logique 0 weak drive ‘H’ logique 1 ‘-’ don’t care Formation VHDL ‘H’ VDD ‘0’ ‘1’ ‘0’ Types en VHDL Vahid MEGHDADI 108 Haute impédance un type résolu Les signaux à trois état doivent être résolus. S’il est fixé à ‘0’ par un circuit et à ‘Z’ par un autre, le simulateur ne doit pas s’affoler mais doit savoir que le ‘0’ remporte sur ‘Z’. Formation VHDL Vahid MEGHDADI 109 Type composite Deux types sont considérés : tableau et record •Un tableau est un ensemble d’éléments du même type •Pour un ensemble de std_logic, nous avons le type prédéfini std_logic_vector : on définit la taille et l'ordre des éléments signal BUS1 : std_logic_vector (7 downto 0); -- type prédéfini signal REG : std_logic_vector (0 to 31); Formation VHDL Types en VHDL Vahid MEGHDADI 110 Accès aux éléments •Déclaration: A,B: std_logic_vector(15 downto 0); •Accès direct : A(3) <= ‘1’; B(15) <= ‘0’; •Accès par tranches A(15 downto 12) <= "1011"; B(0 to 2) <= "111" ; -- erreur A(10 downto 2) <= B(15 downto 7); Formation VHDL Types en VHDL Vahid MEGHDADI 111 Accès aux éléments de tableaux • Par agrégat • Notation positionnelle A(3 downto 1) <= ('0', '1', B(15)); B <= ('1','1',others => '0'); • Notation par nommage A <= (1 =>'1', 3 =>'1',others =>'0'); • Par concaténation signal A,B,C,D : std_logic; signal BYTE : std_logic_vector(7 downto 0); signal Z_BUS,A_BUS : std_logic_vector(3 downto 0); Z_BUS <= A & C & D & B; BYTE <= Z_BUS & A_BUS; Formation VHDL Types en VHDL Vahid MEGHDADI 112 Remarque Exemples SIGNAL a: STD_LOGIC; SIGNAL b: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL c: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL e: STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL f: STD_LOGIC_VECTOR(8 DOWNTO 0); ………. a <= ‘1’; b <= ”0000”; -- Base Binaire par défaut c <= B”0000”; -- Base Binaire explicite d <= ”0110_0111”; -- Utiliser ‘_’ pour augmenter la lisibilité e <= X”AF67”; -- Base Hexadecimale f <= O”723”; -- Base Octale Formation VHDL Types en VHDL Vahid MEGHDADI 113 Remarque Exemples •type MY_WORD is array (15 downto 0) of std_logic; •signal mem_addr : MY_WORD; •mem_addr(10 downto 5) <= "101010"; •type YOUR_WORD is array (0 to 15) of std_logic; •signal data_word : YOUR_WORD := “1101100101010110”; •type T_VAR is array (0 to 7) of integer; •constant setting : T_VAR := (2,4,6,8,10,12,14,16); •type T_MATRIX is array (0 to 3, 1 to 2) of natural; •variable data_arr : T_MATRIX :=((0,2), (1,3), (4,6), (5,7)); •data_arr(0,2) := 12; •type array_name is array (type range <>) of element_type;-- taille est -- définie quand on déclare l'objet •type MATRIX is array (integer range <>) of integer; •variable MATRIX8: MATRIX (2 downto -8) := (3, 5, 1, 4, 7, 9, 12, 14, 20, 18); Formation VHDL Types en VHDL Vahid MEGHDADI 114 Déclaration d’un objet de type array •On peut définir un type tableau d’éléments scalaire type real_vect is array (natural range <>) of real; signal temp : real_vect(0 to 4); Remarque: le type « real_vect » a été créé par vous. On peut aussi: type real_vect is array (2 to 7) of real; signal temp : real_vect; •On peut définir aussi un tableau de composites type MEMO is array (0 to 1023) of std_logic_vector(7 downto 0); signal A,B : MEMO; Formation VHDL Vahid MEGHDADI 115 Enregistrement (record) Ensemble d'éléments de types différents type NAME is record identifier : type_indication; : identifier : type_indication; end record; type PAQUET is record mot_unique : std_logic_vector (7 downto 0); data : std_logic_vector (23 downto 0); CRC : std_logic_vector( 5 downto 0); num : integer range 0 to 1023; end record; signal paq_rec : PAQUET; paq_rec.CRC <= "111000"; Formation VHDL Types en VHDL Vahid MEGHDADI 116 Opérateurs en VHDL Formation VHDL Vahid MEGHDADI 117 Les opérateurs Par ordre de priorité croissante •Opérateur logique : and, or, nand, nor, xor, xnor, sll, srl, sra, rol, ror •Opérateur de comparaison : =, /=, <, <=, >, >= •Opérateur d’addition : +, -, & •Opérateur mathématique : *, /, mod, rem •Opérateur de signe : •Opérateur divers : **, abs, not Formation VHDL Structure du VHDL Vahid MEGHDADI 118 Circuits combinatoires Formation VHDL Vahid MEGHDADI 119 Process combinatoire Un circuit combinatoire donne toujours les mêmes sorties pour les mêmes entrées Un process est combinatoire si les conditions suivantes sont toutes respectées : •le process comporte une liste de sensibilité •la liste de sensibilité comprend tous les signaux lus •tous les signaux doivent être affectés quelle que soit les entrées (Attention dans un "if-else" ou dans un "case") •toutes les variables doivent être affectées avant d'être lues Formation VHDL Vahid MEGHDADI 120 Circuits combinatoires : équation logique Architecture COMB1 of NONET is begin --équation logique S <= A nand B; end COMB1; Architecture COMB2 of NONET is begin --Traduction de la table --de vérité dans un process S <= '0' when A='1' and B='1' else '1'; end COMB2; Formation VHDL Architecture COMB3 of NONET is begin --Traduction de la table --de vérité dans un process process(A,B) begin if A='1' and B='1' then S <= '0'; else S <= '1'; end if; end process; end COMB3; Vahid MEGHDADI 121 Exemple Transcription d’une table de vérité A(2) 0 0 0 0 1 1 1 1 Formation VHDL A(1) 0 0 1 1 0 0 1 1 A(0) 0 1 0 1 0 1 0 1 S(2) 0 0 0 0 1 1 1 1 S(1) 0 0 1 1 1 1 0 0 S(0) 0 1 1 0 0 1 1 0 Vahid MEGHDADI 122 Affectation conditionnelle Dans une zone séquentielle (process) Architecture AVEC_IF of CIRCUIT signal A,S : std_logic_vector (2 downto 0); begin process(A) begin if A = "000" then S <= "000"; elsif A ="001" then S <= "001"; elsif ... end if; end process; end AVEC_IF; Formation VHDL Vahid MEGHDADI 123 Affectation sélective séquentielle Dans une zone séquentielle (process) Architecture AVEC_CASE of CIRCUIT signal A,S : std_logic_vector (2 downto 0); begin process(A) begin case A is when "000" => S <= "000" when "001" => S <= "001" when "011" => S <= "010" … end case end process; end AVEC_CASE; Formation VHDL Circuits combinatoires Vahid MEGHDADI 124 Remarque Affectation sélective concurrente Dans une zone concurrente (architecture) Architecture AVEC_WITH of CIRCUIT signal A,S : std_logic_vector (2 downto 0); begin with A select S <= "000" when "000" , "001" when "001" , "011" when "010" , "110" when "100" , … "000" when others; end AVEC_WITH; Formation VHDL Circuits combinatoires Vahid MEGHDADI 125 Remarque Affectation non conditionnelle Dans une zone concurrente (architecture) Architecture DIRECT of CIRCUIT signal A,S : std_logic_vector (2 downto 0); begin S(2) <= (A(2) and not A(1) and not A(0)) or (A(2) and not A(1) and A(0)) or (A(2) and A(1) and not A(0)) or (A(2) and A(1) and A(0)); S(1) <= (not A(2) and A(1) and not A(0)) or (not A(2) and A(1) and A(0)) or (A(2) and not A(1) and not A(0)) or (A(2) and not A(1) and A(0)); … Formation VHDL Circuits combinatoires Vahid MEGHDADI 126 Remarque Affectation conditionnelle concurrente Dans une zone concurrente (architecture) Architecture AVEC_WHEN of CIRCUIT signal A,S : std_logic_vector (2 downto 0); begin S <= "000" when A= "000" else "001" when A= "001" else "011" when A= "010" else "010" when A= "011" else "110" when A= "100" else "111" when A= "101" else "101" when A= "110" else "100" when A= "111" else "000"; end AVEC_WHEN; Formation VHDL Circuits combinatoires Vahid MEGHDADI 127 Remarque Exemple : ALU entity ALU is port(A : in std_logic_vector(7 downto 0); B : in std_logic_vector(7 downto 0); Sel: in std_logic_vector(1 downto 0); Res: out std_logic_vector(7 downto 0)); end ALU; -- Sel="00" => Addition -- Sel="01" => Soustraction -- Sel="00" => et logique bit à bit -- Sel="00" => ou logique bit à bit architecture behv of ALU is begin process(A,B,Sel) …. end process; end behv; Formation VHDL Vahid MEGHDADI 128 Remarque Exemple : ALU (suite) process(A,B,Sel) begin case Sel is when "00" => Res <= A + B; when "01" => Res <= A + (not B) + 1; -- ou A - B when "10" => Res <= A and B; when "11" => Res <= A or B; when others => Res <= "--"; end case; end process; Formation VHDL Vahid MEGHDADI 129 Remarque Exemple : Multiplieur Le but est de réaliser un multiplieur 4 bits fois 4 bits A 1001 B *1101 --------0000 1001 +0000 0000 +0010 0100 +0100 1000 ---------0111 0101 A 0 0 B(0) 4 0 4 4 B(1) 0 4 B(2) 5 0 4 res(0) (4 downto 1) res(1) B(3) 5 (4 downto 1) res(2) 5 (4 downto 1) res(7 downto 3) Formation VHDL Vahid MEGHDADI 130 Remarque Exemple : Multiplieur (suite) entity main is Port ( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); RES : out std_logic_vector(7 downto 0)); end main; architecture Behavioral of main is begin process (A,B) variable result : std_logic_vector(7 downto 0); begin result := (others => '0'); for I in 0 to 3 loop if B(I)='1' then result(I+4 downto I) := result(I+4 downto I) + ('0' & A); end if; end loop; RES <= result; end process; end Behavioral; Formation VHDL Vahid MEGHDADI 131 Chapitre : Machine à états finis •Toute information du passé est sauvegardée dans l’état actuel du circuit •L’état interne est préservé dans des registres (bascules). Une machine à états comporte au moins log bascules. •L’état prochain dépend de l’état actuel et des entrées •Le changement d’état se fait sur le front de l’horloge •Machine de Moore : les sorties ne dépendent que de l’état courant. •Machine de Mealy : les sorties dépendent de l’état courant mais aussi des entrées Formation VHDL Machine à états finis Vahid MEGHDADI 132 Présentation graphique •Les cercles présentent les états possibles d’une machine à états finis E1E2= "11" •Les flèches représentent les changements possible s0 E1E2= "10" •Les conditions sont présentées sur les flèches •Les changements d’état se réalisent sur le front de l’horloge E1E2="0-" s1 s2 •L’horloge est implicite E1E2= "1-" Formation VHDL Vahid MEGHDADI 133 Séparation des logiques Dans un automate synchrone il existe •une logique combinatoire permettant le calcul de l'état suivant •une logique combinatoire permettant le calcul des sorties •une partie séquentielle synchrone qui se charge du changement d'état du système au moment voulu. Deux types de réalisation •un seul process regroupant les parties combinatoire et séquentielle (adapté aux petites machines) •un process séquentielle synchrone pour changement d’état et deux process combinatoires (pour calculer l’état prochain et les sorties) Formation VHDL Machine à états finis Vahid MEGHDADI 134 Implantation par un seul process État courant type T_ETAT is (E1, E2, E3); signal etat : T_ETAT; D Q Logique ... combinatoire ENTREE Process(CLK) CLK begin CLK Registre if CLK'event and CLK='1‘ then d’états case etat is when E1 => -- mise à jour des sorties pour état E1 if <cond> then ETAT <= E3; end if; when E2 => -- mise à jour des sorties pour état E2 • Process n’est pas ETAT <= E3 combinatoire when E3 => -- mise à jour des sorties pour état E3 • Très simple à écrire if <cond> then ETAT <= E1; elsif <cond> then ETAT <= E2; • Ne convient pas aux end if; machines complexes end case; end if; end process; Formation VHDL Machine à états finis Vahid MEGHDADI 135 Implantation par des process séparés (plus robuste) E1 Moore Mealy Fonction combinatoire E2 S1 S2 F Fonction combinatoire G ETAT_FUTUR Registre d'états ETAT_COUR H RAZ Formation VHDL Machine à états finis Vahid MEGHDADI 136 Programmation logique séparée •Déclaration des signaux : signal E1,E2,S1,S2,H,RAZ : std_logic •Déclaration des états : type T_ETAT is (ETAT1, ETAT2, ETAT3); signal ETAT_COUR, ETAT_FUTUR : ETAT; •Avancement dans l’état (process synchrone) Formation VHDL REG : process (H, RAZ) begin if RAZ = ‘0’ then ETAT_COUR <= ETAT1; elsif H’event and H = ‘1’ then ETAT_COUR <= ETAT_FUTUR; end if; end process; Machine à états finis Vahid MEGHDADI 137 Programmation de la partie combinatoire G G : process (E1,E2,ETAT_COUR) -- Tous les signaux -- d’entrée sont dans la liste de sensibilité begin case ETAT_COUR is when ETAT1 => -- suivant la valeur de E1 et E2 on -- affecte à ETAT_FUTUR une valeur when ETAT2 => Attention aux -- suivant la valeur de E1 et E2 on conditions -- affecte à ETAT_FUTUR une valeur nécessaires pour when ETAT3 => qu’un process soit -- suivant la valeur de E1 et E2 on combinatoire ! -- affecte à ETAT_FUTUR une valeur end case; end process; Formation VHDL Machine à états finis Vahid MEGHDADI 138 Programmation de la partie combinatoire F F : process (E1,E2,ETAT_COUR) -- Tous les signaux -- d’entrée sont dans la liste de sensibilité begin case ETAT_COUR is when ETAT1 => -- suivant la valeur de E1 et E2 on -- affecte aux sorties les valeurs correspondantes when ETAT2 => -- suivant la valeur de E1 et E2 on -- affecte aux sorties les valeurs correspondantes when ETAT3 => -- suivant la valeur de E1 et E2 on -- affecte aux sorties les valeurs correspondantes end case; end process; Peut être intégré dans G ! Formation VHDL Machine à états finis Vahid MEGHDADI 139 Remarque Rappels généraux (1) •Les fonctions F et G peuvent être décrites dans le même process •Si le process est synthétisé par un circuit séquentiel synchronisé sur front d’horloge, il ne doit comporter dans la liste de sensibilité que l’horloge et éventuellement une RAZ synchrone ou asynchrone et rien d'autre : process(CLK,RESET) -- avec un Reset Asynchrone begin if RESET='0' then …………….. elsif CLK'event and CLK='1' then………………………. end if; end process, Formation VHDL Machine à états finis Vahid MEGHDADI 140 Remarque Rappels généraux (2) •Si le process est synthétisé pour un circuit combinatoire, il doit comporter dans la liste de sensibilité tous les signaux lus. •S’il y a un test (if ou case) pour un signal dans un process combinatoire, ce test doit couvrir toues les possibilités (ne pas oublier le else), et toutes les sorties doivent être affectées dans toutes les branches du test. Formation VHDL Machine à états finis Vahid MEGHDADI 141 Remarque Exemple de la partie combinatoire F F : process (E1,E2,ETAT_COUR) -- Tous les signaux -- d’entrée sont dans la liste de sensibilité begin case ETAT_COUR is when ETAT1 => if E1 = '0' and E2 = '0' then S1 <= ‘0’; S2 <= ‘0’; elsif E1 = ’1 ’ then S1 <= ‘1’ ; S2 <= ‘0’; else S1 <= ‘0’; S2 <= ‘1’; end if; when ETAT2 => -- S1 et S2 <= …... when ETAT3 => -- S1 et S2 <= …... end case; end process; Formation VHDL Machine à états finis Vahid MEGHDADI 142 Remarque CLK Exemple écran VGA HS fclk=25MHz Formation VHDL Vahid MEGHDADI 143 Remarque Ecran VGA: Conception RTL HS <= '1' when etat_cour = PW else '0'; Formation VHDL Vahid MEGHDADI 144 Remarque Ecran VGA Programme VHDL FSM: process(etat_cour, count) begin case etat_cour is when PW => if count = 96 then etat_futur <= BP; else etat_futur <= PW; end if; when BP => if count = 144 then etat_futur <= DISP; else etat_futur <= BP; end if; when DISP => if count = 784 then etat_futur <= FP; else etat_futur <= DISP; end if; Formation VHDL when others => if count = 0 then etat_futur <= PW; else etat_futur <= FP; end if; end case; end process; type t_etat is (PW, BP, DISP, FP); signal etat_cour, etat_futur : t_etat:=PW; Vahid MEGHDADI 145 Techniques de programmation Formation VHDL Vahid MEGHDADI 146 Utilisation de « Clock Enable » E • Tous les évènements sont synchronisés sur le front (montant) de l’horloge. • Pour exécuter une partie du code à des fréquences moins rapides que l’horloge, on utilise les signaux « clock enable ». • Ce sont des impulsions dont la durée de ‘1’ est exactement une seule période d’horloge. • La répétition de ces impulsions donne la fréquence d’exécution du code. Formation VHDL S EN CLK CLK EN1 process(CLK) begin if CLK'event and CLK='1' then if EN = '1' then --suite d’instructions end if; end if; end process; Vahid MEGHDADI 147 Periodic Clock Enable Generation CLK T=10 ns EN1 T=80 ns EN2 T=210 ns EN1 CLK Timing generator EN2 process (CLK) begin if rising_edge(CLK) then EN1 <= ‘0’; EN2<=‘0’; cmp1 <= cmp1 + 1;cmp2 <= cmp2 + 1; if cmp1 = 7 then EN1 <= ‘1’; cmp1 <= 0; end if; if cmp2 = 20 then EN2 <= ‘1’; cmp2 <= 0; end if; end if; end process; Enable usage CLK T=10 ns EN T=80 ns To execute some lines at EN rate, use general CLK in conjunction with EN. CLK EN A process repeated every 80 ns process (CLK) begin if rising_edge(CLK) then if EN = ‘1’ then --- write the code here -end if; end if; end process; Example : Two-digit timer Create a hexa-decimal two-digit timer counting from 00 to FF Input CLK frequency = 1 MHz CLK Event that should make the counter to increment. CLK CLK Timing generator en 2-digit counter 8 process (CLK) begin if rising_edge(CLK) then en <= '0'; cmp <= cmp + 1; if cmp = 999_999 then en <= ‘1’; cmp <= 0; end if; end if; end process; en process (CLK) Begin if rising_edge(CLK) then if en = '1' then counter <= counter + 1; end if; end if; end process; Example : Traffic light Create a traffic light with Red: 14 sec, Green: 12 sec, and yellow 2 sec. Input CLK frequency = 1 MHz For this example we will use a state machine with three states : red, green and yellow. We use a timer counting from 0 to 27 as below: 0 1 2 red If timer=27, Next_state = red yellow Red 14 sec If timer=13, next-state = green green If timer=25 Next_state = yelllow 13 14 15 Green 12 sec process (CLK) begin if rising_edge(CLK) then if en = '1' then timer <= timer + 1; if timer = 27 then timer <= 0; end if; end if; end if; end process; 25 26 27 Yellow 2 sec Example : Traffic light (continue …) State machine creation -- type definition type traffic_light_T is (red, green, yellow); Signal state, next_state : traffic_light_T := red; -- state machine (combinatory) process(state, timer) begin case state is when red => if timer = 13 then next_state = green; else next_state = red; end if; when green => if timer = 25 then next_state = yellow; else next_state = yellow; end if; when others => if timer = 27 then next_state = red; else next_state = yellow; end if; end case; end process; process (CLK) begin if rising_edge(CLK) then if en = '1' then state <= next_state; end if; end if; end process; next_state EN State Register state CLK state Timer Comb next_state Example : Traffic light, timing diagram CLK en timer 12 13 14 15 state red red green green process (CLK) begin if rising_edge(CLK) then if en = '1' then state <= next_state; end if; end if; end process; R next_state red green green process(state, timer) begin case state is when red => if timer = 13 then next_state = green; else next_state = red; end if; . . . green CLK Traffic_light The entity Y G R <= '1' when state = red else '0'; Y <= '1' when state = yellow else '0'; G <= '1' when state = green else '0'; Exemples process(CLK) begin if CLK’event and CLK=‘1’ then REG <= REG(0) & REG(7 downto 1); -- rotate right REG <= ‘0’ & REG(7 downto 1); -- shift right logical REG <= REG(7) & REG(7 downto 1); end if; end process Les valeurs signées Z <= (X(7) & X(7 downto 0)) + (Y(7) & Y(7 downto 0)); Les valeurs non signées Z <= (‘0’ & X(7 downto 0)) + (‘0’ & Y(7 downto 0)); Formation VHDL Vahid MEGHDADI 154 Exemple 4, affichage multiplexé Formation VHDL Vahid MEGHDADI 155 Préparation de l’horloge Horloge de la carte est à 100 MHz Supposons qu’une horloge à approximativement 50 KHz est nécessaire: Une division par : 100 x 106 / 50 x 103 = 2000 CLK_EN_Gene : Process(CLK) Begin if CLK’event and CLK=‘1’ then CLK_EN <= ‘0’; cmp <= cmp + 1; if cmp = 1999 then CLK_EN <= ‘1’; cmp <= 0; end if; end if; End process; Programme VHDL CLK_EN CLK CLK CLK_EN CLK_EN_Gene cmp Formation VHDL Vahid MEGHDADI 156 Machine à états type T_ETAT is (SEG1, SEG2, SEG3, SEG4); signal etat : T_ETAT; process(CLK) begin if CLK’event and CLK=‘1’ then if CLK_EN = ‘1’ then case ETAT is when SEG1 => etat <= SEG2; when SEG2 => etat <= SEG3; when SEG3 => etat <= SEG4; when SEG4 => etat <= SEG1; when others => etat <= SEG1; end case; end if; end if; end process; Formation VHDL -- une autre alternative signal etat : integer range 0 to 3; process(CLK) begin if CLK’event and CLK=‘1’ then etat <= etat + 1; end if; end process; Vahid MEGHDADI 157 Circuit complet with etat select An <= "0111" when "1011" when "1101" when "1110" when SEG1, SEG2, SEG3, others; with etat select HEX <= "0001" when "1001" when "0100" when "0101" when SEG1, SEG2, SEG3, others; Formation VHDL with HEX select SEG<= "1111001" "0100100" "0110000" "0011001" "0010010" "0000010" "1111000" "0000000" "0010000" "0001000" "0000011" "1000110" "0100001" "0000110" "0001110" "1000000" when when when when when when when when when when when when when when when when "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", others; --1 --2 --3 --4 --5 --6 --7 --8 --9 --A --b --C --d --E --F --0 Vahid MEGHDADI 158 Remarque Exemple 7- CNA AD5541A Pour que le CNA produise une tension analogique à partir d’une donnée de 16 bits, il faudra respecter le timing donné par le constructeur. Formation VHDL Vahid MEGHDADI 159 Remarque Exemple 7- AD5541A Timing Diagram Générer une horloge à f=1/t1 DIN change sur le front descendant de SCLK Génération de CS Génération de LDAC La donnée est à envoyée en série (MSB d’abord) Formation VHDL Vahid MEGHDADI 160 Remarque Exemple 7- AD5541A contraintes de Timing Fclk=25MHz On fixe à 1/25MHz=40ns Formation VHDL Vahid MEGHDADI 161 Remarque Exemple 7- Interface CNA Le but est de créer l’interface CNA pour simplifier le dialogue avec le CAN. Ainsi, pour dialoguer avec l’interface, on n’aura qu’un bus de 16 bits et un signal STRB (Strobe). Formation VHDL Vahid MEGHDADI 162 Remarque Exemple 7- Conception Une machine à état - État repos (CS<=‘0’; DIN <= ‘Z’; LDAC <= ‘1’); - Dès qu’on détecte ‘1’ sur STRB - on envoie ‘1’ sur CS - État change en envoie - On envoie les 16 bits de DATA un par un (MSB d’abord) 16 bits envoyés, on attend une période d’horloge (état tempo) Etat fin pour finaliser (LDAC <= ‘1’) Formation VHDL Vahid MEGHDADI 163 Remarque Exemple 7- Programmation un seul process signal cmp : integer range 0 to 15; signal reg : std_logic_vector (15 downto 0); type T_etat is (repos, envoi, tempo, fin); signal etat : T_etat := repos; process(CLK) begin if CLK'event and CLK='0' then case etat is when repos => CS <= '1'; LDAC <= '1'; cmp <= 15; DIN <= 'Z'; if STRB = '1' then reg <= DATA; etat <= envoi; end if; Formation VHDL when envoi => CS <= '0'; DIN <= reg(cmp); cmp <= cmp - 1; if cmp = 0 then etat <= tempo; end if; when tempo => DIN <= 'Z'; CS <= '1'; etat <= fin; when others => -- etat = fin LDAC <= ‘0'; cmp <= 15; etat <= repos; end case; end if; end process; Vahid MEGHDADI 164 Remarque Formation VHDL Exemple 7- Conception robuste Vahid MEGHDADI 165 Remarque Exemple 7- Programme entity AD5541A is Port ( CLK : in STD_LOGIC; DATA : in STD_LOGIC_VECTOR (15 downto 0); STRB : in STD_LOGIC; CS : out STD_LOGIC; DIN : out STD_LOGIC; LDAC : out STD_LOGIC; SCLK : out STD_LOGIC); end AD5541A; architecture Behavioral of AD5541A is type t_etat is (repos, e_cs, envoie, tempo, e_ldac); signal etat_cour, etat_futur : t_etat:= repos; signal count : integer range 0 to 31:=0; signal raz : std_logic; signal reg : std_logic_vector(15 downto 0); Begin SCLK <= not CLK; DIN <= reg(16-count) when etat_cour = envoie else 'Z'; CS <= '1' when etat_cour = e_CS else '0'; LDAC <= '0' when etat_cour=e_ldac else '1'; Formation VHDL process(CLK) begin if CLK'event and CLK='1' then if STRB = '1' then reg <= DATA; end if; end if; end process; process(CLK) begin if CLK'event and CLK='1' then etat_cour <= etat_futur; end if; end process; process(CLK) begin if CLK'event and CLK='1' then if raz = '1' then count <= 0; else count <= count + 1; end if; end if; end process; Vahid MEGHDADI 166 Remarque Exemple 7- Programme process(etat_cour, count, STRB) begin etat_futur <= etat_cour; raz <= '0'; case etat_cour is when repos => raz <= '1'; if STRB = '1' then etat_futur <= e_cs; end if; when e_cs => if count = 0 then etat_futur <= envoie; end if; when envoie => if count = 16 then etat_futur <= tempo; end if; Formation VHDL when tempo => if count = 17 then etat_futur <= e_ldac; end if; when others => -- e_ldac if count = 18 then etat_futur <= repos; end if; end case; end process; end Behavioral; Vahid MEGHDADI 167 Remarque Formation VHDL Exemple 7- Résultat de simulation Vahid MEGHDADI 168 Technique de programmation Formation VHDL Vahid MEGHDADI 169 Attention ! Les instructions suivantes sont interdites dans une zone concurrente Architecture x of y is Begin A <= not A; CMPT <= CMPT + 1; REG <= REG (0) & REG(7 downto 1); …... end x; Formation VHDL +1 Vahid MEGHDADI 170 Correction D On utilise un process synchronisé sur un front CLK process (CLK) begin if rising_edge(CLK) then A <= not A; -CMPT <= CMPT + 1; -etc; end if; end process; Formation VHDL Q D Q +1 CLK Circuits Attention séquentiels ! Vahid MEGHDADI 171 Process synchrones! Dans un process synchrone il faut respecter un des deux canevas ci-dessous process(CLK) uniquement CLK dans la liste de sensibilité begin if CLK’event and CLK=‘1’ then process ne contient qu’un grand if -- suite d’instructions qui peut contenir d’autre if end if; tout de suite après : end process end process; process(CLK, RST) CLK et le signal reset dans la liste de sensibilité begin if RST = ‘1’ then process ne contient qu’un grand if-else -- suite d’instructions qui peut contenir d’autre if elsif CLK’event and CLK=‘1’ then -- suite d’instruction qui peut contenir d’autre if end if; tout de suite après : end process end process; Formation VHDL Vahid MEGHDADI 172 Les sous-programmes But des sous-programmes •Pour écrire des algorithmes réutilisables •Pour augmenter la lisibilité Deux classes des sous-programmes •Les procédures •Les fonctions Formation VHDL Les sous-programmes Vahid MEGHDADI 173 Procédure •Mot clé procedure •L'appel d'une procédure est une instruction concurrente ou séquentielle •Peut retourner plusieurs valeurs •Peut agir sur les signaux globaux •Peut se synchroniser (avec wait dedans) •Corps d'une procédure est une zone séquentielle Formation VHDL Les sous-programmes Vahid MEGHDADI 174 Fonction •Mot clé function •L'appel est à droite d'une affectation •L'appel peut se faire dans la zone concurrente ou séquentielle •Retourne une seule valeur •Rend immédiatement sa valeur •Corps d'une fonction est une zone séquentielle Formation VHDL Les sous-programmes Vahid MEGHDADI 175 Ecriture des sous-programmes Un sous-programme est constitué •D'une déclaration : interface •D'un corps : algorithme Syntaxe de la déclaration •procedure <nom> (liste des paramètre); •function <nom> (liste des paramètre) return type_du_résultat; Formation VHDL Les sous-programmes Vahid MEGHDADI 176 Déclaration des sous-programmes Liste_des_paramètre : {classe_d'objet} PARAM1 :{mode} type{:=valeur_par_défaut} •class_d'objet : signal, variable, constant •mode : in, out, inout Restriction •pas de paramètres out ou inout dans la déclaration d'une fonction •pas de variable transmise à une fonction •classe d'objet par défaut est "constant" pour les "in" et "variable" pour les "out" et "inout" Formation VHDL Les sous-programmes Vahid MEGHDADI 177 Corps de sous-programme Entête is -- function ou procedure {zone de déclarations} begin {partie instruction séquentielle} end {nom_de_sous-programme} Exemple function MIN (signal A,B : integer) return integer is begin if A < B then return A else return B end if; end MIN; Formation VHDL Les sous-programmes Vahid MEGHDADI 178 Appel de sous-programme Différentes formes d'appel •Par position (même ordre que la déclaration) •RESULTAT <= MIN (SIG1, 5); •Par nom (ordre non important) •RESULTAT <= MIN (B=> 5, A=> SIG1); •RESULTAT <= MIN (A=> SIG1, B=> 5); Formation VHDL Les sous-programmes Vahid MEGHDADI 179 Exemple ------------- Formation VHDL HEX-to-seven-segment decoder HEX: in STD_LOGIC_VECTOR (3 downto 0); LED: out STD_LOGIC_VECTOR (6 downto 0); segment encoding 0 --5 | | 1 --<- 6 4 | | 2 --3 Exemples Vahid MEGHDADI 180 Programmation concurrente with HEX select LED<= "1111001" when "0001", "0100100" when "0010", "0110000" when "0011", "0011001" when "0100", "0010010" when "0101", "0000010" when "0110", "1111000" when "0111", "0000000" when "1000", "0010000" when "1001", "0001000" when "1010", "0000011" when "1011", "1000110" when "1100", "0100001" when "1101", "0000110" when "1110", "0001110" when "1111", "1000000" when others; Formation VHDL Exemples --1 --2 --3 --4 --5 --6 --7 --8 --9 --A --b --C --d --E --F --0 Vahid MEGHDADI 181 Utilisation de fonction function DECODE (signal HEX: std_logic_vector(3 downto 0)) return std_logic_vector(6 downto 0) is begin case HEX is when "0001" => return "1111001"; --1 when "0010" => return "0100100"; --2 when "0011" => return "0110000"; --3 when "0100" => return "0011001"; --4 when "0101" => return "0010010"; --5 when "0110" => return "0000010"; --6 when "0111" => return "1111000"; --7 when "1000" => return "0000000"; --8 when "1001" => return "0010000"; --9 when "1010" => return "0001000"; --A ………... when others => return « 1000000"; -- 0 end case; end; Formation VHDL Exemples Vahid MEGHDADI 182 Paquetage Il donne la possibilité de •Regrouper des codes communs dans un travail en équipe •Déclarer des types et des sous-types •Déclarer des objets (signaux, constants) •Déclarer des sous-programmes •Déclarer des alias Formation VHDL Paquetage Vahid MEGHDADI 183 Syntaxe de Paquetage Package <nom_de_paquetage> is <suite de déclarations> end {<nom_de_paquetage>}; package pak_test is Exemple: subtype OCTET is std_logic_vector(7 downto 0); subtype MOT is std_logic_vector(15 downto 0); constant PAQUET_SIZE : integer := 11; function INT_TO_7SEG (constant CHIFFRE : in std_logic_vector(3 downto 0)) return OCTET; end pak_test; Formation VHDL Paquetage Vahid MEGHDADI 184 Paquetage de composants Le paquetage permet aussi de grouper la déclaration d'un ensemble de composants. Exemple : package STANDARD_CELL is component INVERSEUR port (E : in bit; S : out bit); end component; component PORTE_OU port (A,B : in bit; S : out bit); end component; …. end STANDARD CELL; Formation VHDL Paquetage Vahid MEGHDADI 185 Corps de Paquetage Décrit l'algorithme des sous-programmes déclarés dans le package. Syntaxe : package body <nom_de_paquetage> is {corps de sous-programmes} end <nom_de_paquetage>; Formation VHDL Paquetage Vahid MEGHDADI 186 Exemple de Corps de Paquetage package body pak_test is function INT_TO_7SEG (constant CHIFFRE : in std_logic_vector (3 downto 0)) return OCTET is variable SEG : std_logic_vector(7 downto 0); begin case CHIFFRE is when "0001" => SEG := "01111001" ; --1 when "0010" => SEG := "00100100" ; --2 ……. when "1111" => SEG := "00001110" ; --F when others => SEG := "01000000" ; --0 end case; return SEG; end INT_TO_7SEG; end pak_test; Formation VHDL Paquetage Vahid MEGHDADI 187 Utilisation de paquetage •On crée d'abord une librairie •Sous ISE, new source --> VHDL library •Ecrire le paquetage et son corps •Ajouter à la librairie que l'on souhaite •Sous ISE, sélectionner le fichier et ensuite--> move to library •Dans le programme utilisant cette librairie : library <mon_lib> use <mon_lib>.<mon_paquetage> Formation VHDL Paquetage Vahid MEGHDADI 188 Configuration Une entité peut avoir plusieurs architectures Un rôle de configuration : choisir l'architecture correspondante Exemple : Pour l'entité additionneur on peut envisager 3 architectures différentes : A, B et C ADDITIONNEUR(A) ADDITIONNEUR(B) ADDITIONNEUR(C) A chaque instanciation de l'entité, un seul couple entité/architecture peut être compilé. Formation VHDL Configuration Vahid MEGHDADI 189 Choix de l'architecture Deux façons pour relier une architecture précise à une entité : •Dans une unité de compilation autonome : la configuration •Dans la partie déclarative d'un bloc ou d'une architecture (configuration "à la volée") (Par défaut c'est la dernière compilée qui sera prise en compte) Formation VHDL Configuration Vahid MEGHDADI 190 Exemple de Configuration Entity SIM is end; Entity ADD is port (A,B : in integer; S : out integer); end ADD; architecture FONCTION of ADD is begin S <= A+B; end FONCTION; Formation VHDL architecture ESSAI1 of SIM is component ADD port (A,B : in integer; S : out integer); end component; signal X,Y,SUM : integer; begin INST1 : ADD port map (X,Y,SUM); X <= 12, 55 after 100 ns; Y <= 0, 100 after 200 ns; end ESSAI1; configuration CONF of SIM is for ESSAI1 for INST1 : ADD use entity work.ADD(FONCTION) end for; end for; end CONF; Configuration Vahid MEGHDADI 191 Exemple de Configuration "à la volée" Entity SIM is end; Entity ADD is port (A,B : in integer; S : out integer); end ADD; architecture FONCTION of ADD is begin S <= A+B; end FONCTION; Formation VHDL architecture ESSAI1 of SIM is component ADD port (A,B : in integer; S : out integer); end component; for all : ADD use entity work.ADD(FONCTION); -- ou -- for INST2 : ADD -use entity work.ADD(FONCTION); signal X,Y,SUM : integer; begin INST2 : ADD port map (X,Y,SUM); X <= 12, 55 after 100 ns; Y <= 0, 100 after 200 ns; end ESSAI1; Configuration Vahid MEGHDADI 192 Les Attributs •Attribut sur les signaux: •signal_name'attribut •l'attribut synthétisable : event •If CLK'event and CLK='1' then … •attribut sur le type array •type MYARR is array (-2 to 4) of integer; •MYARR’left returns -2 •MYARR’right 4 •MYARR’high 4 •MYARR'low -2 •MYARR’reverse_range 4 downto to -2 Formation VHDL Les Attributs Vahid MEGHDADI 193 Alias Intérêt •Donne un nom différent (plus lisible) à un objet •l'ancien nom reste utilisable Syntaxe •alias nouveau_nom : type_ou_sous_type is ancien_nom Exemple variable V32 : std_logic_vector (0 to 31); alias P_8 : std_logic_vector (0 to 7) is V32(0 to 7); alias D_8 : std_logic_vector (0 to 7) is V32(24 to 31); alias SIGNE : std_logic is V32(0); ... SIGNE := '1'; -- identique que V32(0) <= ‘1’; Formation VHDL Alias Vahid MEGHDADI 194 Encodage d'état dans une machine à état •Encodage d'états peut se faire manuellement : type t_etat is (S1, S2, S3, S4, S5); -- encodage binaire attribute enum_code : string; attribute enum_code of t_etat : type is "000 001 010 011 100"; -- S1 est codé en "000", S2 en "001", S3 en "011" et … signal etat : t_etat; •On peut laisser le compilateur choisir le codage type t_etat is (S1, S2, S3, S4, S5); signal etat : t_etat; Formation VHDL Encodage d'état dans une machine à état Vahid MEGHDADI 195 Codage one-hot La méthode préférée pour les circuits énormes est le codage one-hot type t_etat is (S1, S2, S3, S4, S5); -- encodage binaire attribute enum_code : string; attribute enum_code of t_etat : type is "00001 00010 00100 01000 10000"; -- S1 est codé en "00001", S2 en "00010", S3 en "00100" et … signal etat : t_etat; Remarque: Ne pas oublier d'initialiser l'état avec un signal RESET Formation VHDL Encodage d'état dans une machine à état Vahid MEGHDADI 196 for Generate for-generate (à utiliser dans la zone concurrente) permet de répéter un circuit plusieurs fois. Exemple : BIT0 : FULL_ADD port map (X(0) , Y(0) , ’0’ , Z(0) , C(0)); BIT1 : FULL_ADD port map (X(1) , Y(1) , C(0) , Z(1) , C(1)); …. BIT7 : FULL_ADD port map (X(7) , Y(7) , C(6) , Z(7) , C(7)); LABEL : for i in 1 to 7 generate ADDITION : FULL_ADD port map (X(i), Y(i), C(i-1), Z(i), C(i); end generate BIT0: FULL_ADD port map (X(0) , Y(0) , ’0’ , Z(0) , C(0)); Formation VHDL For generate Vahid MEGHDADI 197 Généricité C’est un moyen de transmettre des infos à un component pour le rendre paramétrable. Exemples : une porte ET à N entrées, un registre à décalage de taille N, un multiplexeur N vers 1, … Syntaxe : generic Formation VHDL (param1 : type de param1 := valeur par défaut; param2 : type de param2 := valeur par défaut; ...); Généricité Vahid MEGHDADI 198 Exemple Porte ET à N entrées : entity PORTE_ET is generic(N : integer := 2); port(ENTREE : in std_logic_vector(1 to N); SORTIE : out std_logic); end entity; … process (ENTREE) variable V : std_logic; begin V := '1'; for I in 1 to N loop V := V and ENTREE(I); end loop; SORTIE <= V; end process; Formation VHDL Généricité Vahid MEGHDADI 199 Appel d’un bloc paramétrable component PORTE_ET generic(N :integer := 2); port(ENTREES : in std_logic_vector(1 to N); SORTIE : out std_logic); end component; … architecture A of B is begin INST : PORTE_ET generic map(N => 5) port map(ENTREES => A, SORTIE => Z); … end A; Formation VHDL Généricité Vahid MEGHDADI 200 If Generate If-generate permet de synthétiser un circuit suivant une condition Exemple : entity generate_test is generic ( CLK_DIV : boolean :=TRUE); Port ( CLK : in std_logic; sortie : out std_logic); end generate_test; architecture A of generate_test is signal clk_r : std_logic:= '1'; begin U1: if CLK_DIV generate process(CLK) begin if CLK'event and CLK='1' then clk_r <= not clk_r; end if; end process; end generate; U2: if not CLK_DIV generate clk_r <= clk; end generate; sortie <= clk_r; end A; Formation VHDL If generate Vahid MEGHDADI 201 Conseils de synthèse •Utiliser le nom du fichier le même que le nom de l'entité •Ne pas mettre plus d'un couple entity/architecture dans un fichier •Les noms des signaux peuvent être jusqu'à 256 caractères. Ne pas hésiter à donner un nom signifiant à des signaux (constantes, variables, types, etc) •Quand vous appelez un component, utilisez les paramètres de passage par nom : •U1 : HALF_ADD port map(A =>oper1, B=>oper2, SUM =>somme, C=>retenue); Formation VHDL Conseils de synthèse Vahid MEGHDADI 202 Conseils (2) •Ne jamais utiliser des signaux ou des variables pour des constantes (cela gaspille les ressources énormément), •Xilinx recommande de n'utiliser que les std_logic ou std_logic_vector pour les types des ports dans les entités. •Eviter, si c'est possible, l'utilisation de "buffer" pour les signaux de sortie qui sont lus dans l'architecture. A la place, déclarer un signal interne avec la même valeur et utiliser "out" pour le signal de sortie Formation VHDL Conseils de synthèse Vahid MEGHDADI 203 Conseils (3) •Privilégier l'utilisation des signaux par rapport aux variables •Les instructions wait for xx ns, et after xx ns ne se synthétisent pas •Les valeurs initiales ne sont normalement pas tenue compte en synthèse : •signal SUM : std_logic_vector(3 downto 0) := "1100"; Formation VHDL Conseils de synthèse Vahid MEGHDADI 204 Ordre des opérations Ordre dans une expression arithmétique ADD <= A1 + A2 + A3 + A4; ADD <= (A1+A2) + (A3+A4) Donnent le même résultat mais pas forcement le même circuit A1 A2 A3 A4 ADD A1 A2 A3 ADD Un circuit plus rapide A4 Formation VHDL Conseils de synthèse Vahid MEGHDADI 205 "if" ou "case", la différence Pour un circuit de décodage, "if" produit un circuit à priorité tandis que "case", un circuit équilibré •Utiliser "case" pour un décodage complexe •Utiliser "if" pour favoriser les chemins lents entity if_ex is port (SEL: in std_logic_vector(1 downto 0); A,B,C,D: in std_logic; MUX_OUT: out std_logic); end if_ex; Formation VHDL architecture A of if_ex is begin IF_PRO: process (SEL,A,B,C,D) begin if (SEL=”00”) then MUX_OUT <= A; elsif (SEL=”01”) then MUX_OUT <= B; elsif (SEL=”10”) then MUX_OUT <= C; elsif (SEL=”11”) then MUX_OUT <= D; else MUX_OUT <= '0'; end if; end process; --END IF_PRO end BEHAV; Conseils de synthèse Vahid MEGHDADI 206 Circuit résultant Formation VHDL Conseils de synthèse Vahid MEGHDADI 207 Utilisant "case" entity case_ex is port (SEL: in std_logic_vector (1 downto 0); A,B,C,D: in std_logic; MUX_OUT: out std_logic); end case_ex; Formation VHDL architecture BEHAV of case_ex is begin CASE_: process (SEL,A,B,C,D) begin case SEL is when “00” => MUX_OUT <= A; when “01” => MUX_OUT <= B; when “10” => MUX_OUT <= C; when “11” => MUX_OUT <= D; when others=> MUX_OUT <= '0'; end case; end process; end BEHAV; Conseils de synthèse Vahid MEGHDADI 208 Circuit résultant Formation VHDL Conseils de synthèse Vahid MEGHDADI 209 Génération des latch Une instruction "if" incomplet synthétise un latch (un verrou): if A=B then C <= '1'; end if; Si ce n'est pas ce que l'on souhaite, il faut ajouter la branche else. if A=B then C <= '1'; else C<= ‘0’; end if; Formation VHDL Conseils de synthèse Vahid MEGHDADI 210 Partage des ressources Process (A,B,C,COND) Variable Z1,Z1 : ….. ; begin Z1 := A+B; Z2 := A+C; if COND='1' then Z <= Z1; else Z <= Z2; end if; end process; Process (A,B,C,COND) variable TMP : ..... ; begin if COND='1' then TMP := B; else TMP := C; end if; Z <= TMP + A; end process; Formation VHDL COND B A C COND B C A Conseils de synthèse Vahid MEGHDADI 211 Validation d'horloge Eviter de générer une horloge par un circuit combinatoire gate_clk<= (IN1 and IN2 and CLK); process (gate_clk) begin if (gate_clk’event and gate_clk=’1’) then if (LOAD=’1’) then OUT1 <= DATA; end if; end if; end process; Formation VHDL Conseils de synthèse Vahid MEGHDADI 212 Validation d'horloge (suite) ENABLE <= IN1 and IN2 and LOAD; process (CLOCK) begin if (CLOCK’event and CLOCK=’1’) then if (ENABLE=’1’) then DOUT <= DATA; end if; end if; end process; Formation VHDL Conseils de synthèse Vahid MEGHDADI 213 Occupation sur le FPGA CLB CLB Chaîne de retenue Spartan-II, Virtex I3 I2 I1 I0 O Spartan-III, Virtex-II SET CE D Q RST LUT I3 I2 I1 I0 Formation VHDL O SET CE D Q RST Occupation sur le FPGA Vahid MEGHDADI 214 Registre à décalage Utilisation des bascules 4 Z-1 Z-1 Z-1 Z-1 Z-1 Z-1 Ce registre à décalage demande combien de slice ? 12 car 2 bascules par slice sont disponibles. Formation VHDL Occupation sur le FPGA Vahid MEGHDADI 215 Utilisation des LUT Multiplexeur A B SEL1 SEL2 A B I3 I2 I1 I0 O SEL1 SEL2 Ce multiplexeur demande combien de slice ? Un seul slice. Formation VHDL Occupation sur le FPGA Vahid MEGHDADI 216 Additionneur complet A B Cin Cout + I3 I2 I1 I0 sum Sum=f(A,B,Cin) A Cout=g(A,B,Cin) Cin B I3 I2 I1 I0 O O Cout Sum Un slice. Formation VHDL Occupation sur le FPGA Vahid MEGHDADI 217 Additionneur complet Xilinx LUT A Cout 0 1 B Sum Cin Un seul slice pour l'additionneur complet. Formation VHDL Occupation sur le FPGA Vahid MEGHDADI 218 La chaîne de retenu Connexion rapide I3 I2 I1 I0 O SET CE D Q RST LUT I3 I2 I1 I0 Formation VHDL O Occupation sur le FPGA SET CE D Q RST Vahid MEGHDADI 219 Addition 8 bits S8 B7 A7 B6 A6 Il suffit 4 slices pour une addition sur 8 bits B5 A5 B4 A4 B3 A3 B2 A2 B1 A1 B0 A0 Formation VHDL Occupation sur le FPGA S7 S6 S5 S4 S3 S2 S1 S0 Vahid MEGHDADI 220