Vous êtes sur la page 1sur 17

TD2 VHDL et logique programmable

TD2 VHDL et logique programmable


L'objectif de ce chapitre est d'introduire rapidement les notions matrielles pour les circuits simples programmables ou PLA. Les documentations de ces circuits peuvent encore tre apprhendes par des schmas logiques simples, mais ce ne sera plus le cas si l'on dsire s'intresser aux Complex Programmable Logic Devices ou aux FPGA. Nous aborderons aussi quelques notions lies aux FPGA en fin de chapitre.

Gnralits
Nous commenons par prsenter les conventions de la reprsentation des circuits programmables : regardez l'image ci-dessous avec gauche la convention schmatique habituelle et droite la nouvelle convention.

Convention des schmas internes des composants logiques programmables

On voit sur cette image que les entres des portes ET sont, par convention, ramenes sur un fil. Pour connatre le nombre d'entres des portes ET ainsi dessines, il vous faut compter le nombre d'intersections avec des fils perpendiculaires et de diviser par deux. Par exemple sur l'image, le fil d'entre (vertical) de la porte ET de gauche rencontre 6 fils (horizontaux), ce qui signifie que la porte ET comporte trois entres (ce qui correspond bien au schma de gauche). Une division par deux est ralise car en gnral il arrive la variable et son complment. Nous avons utilis ici la mme convention pour le OU logique qui suit le ET. Mais, en gnral, pour les circuits simples, on dessine toutes les entres des OU comme ce sera fait dans les schmas internes dcrits plus loin dans ce chapitre. Les croix indiquent les liaisons sur des fils qui se croisent. Cette convention n'est utile qu'avec les circuits programmables simples (PLD, PAL et PLA)
''

Remarque : un rseau PLA ne contient que rarement tous les "minterms" (termes produits) contrairement une mmoire. Dans l'exemple de la figure ci-dessus, le fait que le OU ne contient que 4 entres veut dire que seulement quatre termes produits sont ralisables simultanment. Pourtant, avec trois entres, il existe huit termes produits.

TD2 VHDL et logique programmable

Correspondance entre les variables logiques et les broches physiques


Lors de la programmation de composants, il nous faut tablir une correspondance entre les variables logiques dclares dans l'entit et les broches physiques d'un composant. Il existe plusieurs techniques pour cela : Avec Warp2 (Cypress [1]) on utilise un attribut : ATTRIBUTE pin_numbers of mydesign:ENTITY IS "x:1 y:2 clk:3 a(0):4 "; avant de fermer la dclaration d'entit (qui s'appelle dans ce cas "mydesign"). Cette faon de faire est trs peu portable. Avec Xilinx on utilise un fichier spar (appel fichier ucf voir exemple ici). C'est un peu plus adapt aux FPGA qui ont facilement un nombre de broches important (suprieur 256).

Nomenclature des circuits programmables


Les circuits programmables ont des noms dans lesquels au moins deux chiffres apparaissent spars par une ou plusieurs lettres. le premier chiffre donne le nombre d'entres des ET logiques utiliss, le dernier chiffre donne en gnral le nombre de sorties. Si ce nombre N est infrieur 8, il y aura 8 sorties en tout dont N qui seront de type dtermin par la lettre, la lettre sera L pour combinatoire, R pour logique squentielle, V pour Versatile que l'on peut traduire par configurable. Remarque : sachant que la reprsentation des entres des portes ET se fait toujours par un seul fil horizontal, le premier chiffre multipli par deux indiquera toujours le nombre de fil vertical rencontrs par ce fil horizontal. Appliquons tout ceci la PAL 16R4 prsente ci-dessous :

TD2 VHDL et logique programmable

Architecture de la PAL 16R4

Son nom indique que l'on 4 sorties squentielles, ce qui n'est pas difficile remarquer. Ces sorties sont compltes par 4 sorties combinatoires. Les 64 termes produits indiqus sur la figure sont rpartis galit sur les 8 sorties, ce qui indique que les OU ont tous 8 entres.

Exercice 1
On veut raliser le circuit schmatis ci-contre dans une PAL 16R8 dont le schma partiel est prsent ci-dessous. crire le programme VHDL correspondant en remarquant que la variable Ena n'a pas besoin d'tre dclare dans l'entit. Placez les croix correspondantes au programme sur le schma ci-aprs. Remarque : mme si cette structure (ci-dessous) avec OU nombre d'entres fix est appele PAL, on utilisera indiffremment dans la suite PAL ou PLA.

TD2 VHDL et logique programmable

Schma pour la rponse


''

Remarque : La PAL tant une 16R8, le schma ci-dessus est incomplet : il manque 7 sorties et aussi 28 fils verticaux (2 x 16 moins les 4 que l'on a). Indication : transformez votre schma en quation de rcurrence. Ce qui se trouve avant Qout dans le schma original est une commande trois tats sans inversion. Quand vous essayez d'implanter votre quation partez de la sortie physique de votre PAL. Pour changer de champ d'application voici un exercice concernant l'arithmtique lmentaire.

TD2 VHDL et logique programmable

Exercice 2 (PAL 16X4 spcialis pour arithmtique)


On vous prsente le contenu partiel d'une PAL 16X4 destine raliser des oprations arithmtiques.

Schma interne de la PAL 16X4


''

Remarque : La PAL tant une 16X4, le schma ci-dessus est incomplet : il manque 6 sorties et aussi 24 fils verticaux (2 x 16 moins les 8 que l'on a). 1) La cellule de base d'un PAL destin l'arithmtique est donne ci-dessus. Reprer et exprimer les valeurs logiques des fils internes 8, 9, 10 et 11 en fonction de A1 et B1. A quoi sert I ? 2) On cherche utiliser ce genre de cellule pour raliser . On rappelle les quations de C1 et A1+ une addition 1 bit :

C1 = (A1 xor B1).C0 + A1.B1 A1+ = A1 xor B1 xor C0 En dduire les quations de S1= (sous forme de ou exclusifs et/ou fonctions identits) et de /C1 (sous forme

disjonctive). 3) Calculs intermdiaires : calculer les produits (fonctions ET logique) (8).(9), (9).(11), (9).(10), (8).(11), (8).(9).(11) et (8).(10).(11) et montrer qu'ils interviennent tous dans les quations prcdentes de S1 et de /C1. 4) Dessiner les fusibles non grills sur la figure ci-dessus. Nous allons maintenant nous intresser aux nouvelles catgories de composants programmables, ceux qui utilisent des cellules "versatiles" (configurables) et que l'on appelle parfois GAL.

TD2 VHDL et logique programmable

La GAL 20V8
On prsente ci-dessous le schma partiel du circuit de la GAL 20V8 (24 broches dont 8 sorties configurables).

Brochage de la 20V8

On peut distinguer 13 entres vritables notes de I1 I13. Chaque sortie est note de I/O0 I/O7. La notation laisse penser, juste titre, que si l'on manque d'entre, on peut transformer des sorties en entres. Si vous n'avez pas d'horloge (en logique combinatoire par exemple), vous pouvez aussi utiliser la broche CLK/I0 en entre.
Dfinition On appelle cellule configurable, un cellule, c'est dire un ensemble de circuits, dont le fonctionnement est conditionn par des bits internes. Cet ensemble de circuits reprsente le schma interne de la cellule qui suffit, en gnral, expliquer son fonctionnement.

Chaque sortie est constitue par une cellule configurable l'aide de bits internes. Le schma de cette cellule configurable est donn ci-dessous :

Cellule configurable d'une 20V8

On peut y distinguer des multiplexeurs, commands par les bits SG1 et SL0x (o x est le numro de la sortie correspondante), un ou exclusif command par un bit SL1x. L'objectif de ce ou exclusif est de complmenter ou pas la sortie du ou logique qui le prcde.
Dfinition On appelle bit global tout bit dont la deuxime lettre du nom est "G". On appelle bit local tout bit dont la deuxime lettre du nom est un "L".

Un bit global est forcment identique pour les 8 cellules configurables. Un bit local est dpendant de la macrocellule, et c'est pour cela qu'il est termin par un x. Pour terminer sur ce composant on donne un schma interne partiel o l'on reconnat ces cellules configurables :

TD2 VHDL et logique programmable

''

Remarque : La PAL tant une 20V8, le schma ci-dessus est incomplet : il manque 4 sorties et aussi 16 fils verticaux (2 x 20 moins les 24 que l'on a).

La GAL 22V10
La GAL 22V10 est plus rcente que la 20V8. On pourrait penser que la cellule configurable de ce composant est plus complexe que celle de la 20V8, puisque plus moderne, mais il n'en est rien. Nous commenons par prsenter cette cellule configurable :

Cellule reconfigurable d'une 22V10

TD2 VHDL et logique programmable On distingue sur ce schma une simplification sur les entres du OU logique l'aide de pointills. Cela est d au fait que le nombre de ET logique arrivant sur le OU logique est variable suivant la cellule configurable : les broches 14 et 23 ont en 8, les broches 15 et 22 ont en 10, les broches 21 et 16 ont en 12, les broches 17 et 20 ont en 14 et enfin les broches 18 et 19 ont en 16. Le nombre de multiplexeurs a franchement diminu (en taille comme en nombre) ce qui facilite sa comprhension. Voici un exemple de composant 22V10 :

Le brochage de ce composant est donn par la figure ci-dessous :

Brochage du composant 22V10

On prsente maintenant un schma interne partiel de ce composant :

TD2 VHDL et logique programmable

Schma interne partiel d'un composant 22V10


''

Remarque : La PAL tant une 22V10, le schma ci-dessus est incomplet : il manque 6 sorties et aussi 28 fils verticaux (2 x 22 moins les 16 que l'on a). Le schma interne complet est complexe et peut tre simplifi comme sur la figure ci-dessous :

TD2 VHDL et logique programmable

10

Architecture d'une PAL 22V10

Exercice 3
La polarit de chaque cellule configurable peut tre programme individuellement pour tre inverse ou non. D'autre part la sortie peut tre combinatoire ou squentielle. 1) Lequel des deux bits bits (S0 et S1) dtermine la polarit ? 2) Dessinez les quatre circuits quivalents la cellule configurable.

Les CPLD
Un CPLD peut tre dfini comme un assemblage de PLDs de type 22V10. Nous en donnons la structure ci-dessous :

TD2 VHDL et logique programmable

11

Tous les "Logic Blocs" sont peu prs quivalents des PALs 22V10. Comme on peut le voir, ces PALs sont connectes par le bloc "Programmable Interconnect". Dans cette architecture une implantation ne ncessite pas de placements et routages mais seulement des interconnexions.

Les FPGA
Les FPGA sont des composants plus complexes encore que les CPLD. Nous allons examiner quelques unes de leurs particularits travers des exemples d'implantation.

Les LUTs
Les LUTs sont des lments importants des FPGA. Nous allons essayer de les manipuler en VHDL.

Prsentation des LUTs


Une table de vrit de trois entres peut tre reprsente par un nombre 8 bits que l'on convertit en hexadcimal. Soit donc la table de vrit suivante (trois entres notes e0, e1 et e2, une sortie note s) :

TD2 VHDL et logique programmable

12

e2 e1 e0 s 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 b0 1 1 b1 0 1 b2 1 0 b3 0 1 b4 1 0 b5 0 1 b6 1 0 b7

Vous pouvez synthtiser la table de vrit l'aide d'un seul nombre sur 8 bits (poids faible en haut) : 1. en binaire ce nombre vaut : 0b01010110 2. en hexadcimal ce nombre vaut : 0x56 (not X"56" en VHDL) La valeur hexadcimale 56 (note X"56" en VHDL) est la valeur avec laquelle il faudra initialiser votre LUT avec un composant lut3. Pour 4 entres (ce qui est notre cas), on utilise une lut4 avec 4 chiffres hexadcimaux.

Utiliser des LUTs en VHDL


Cette section est malheureusement spcifique au fabricant Xilinx. Un exemple est donn maintenant : library IEEE; use IEEE.STD_LOGIC_1164.ALL; library unisim; use unisim.vcomponents.all; ENTITY transcodeur IS PORT( e : in STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4 entres s : out STD_LOGIC_VECTOR(6 DOWNTO 0)); -- 7 sorties END transcodeur; ARCHITECTURE atranscodeur OF transcodeur IS BEGIN i1 : LUT4 generic map (INIT => X"EAAA") port map( I0 => e(0), I1 => e(1), I2 => e(2), I3 => e(3), O => s(0) ); ..... Cet exemple vous montre comment on cble une LUT4 en VHDL (port map) et comment on l'initialise (generic map). Le cblage de ce composant est correct mais pas son initialisation puisqu'on vous demande de la calculer plus loin. Les deux lignes library ... et use ... sont ajouter avant toute entit qui utilise une LUT en plus bien sr de "library ieee;".

TD2 VHDL et logique programmable

13

Exercice 4
Raliser le schma correspondant au "port map" de l'exemple ci-dessus dans le composant "transcodeur" (deux rectangles, un appel "transcodeur" et un appel "LUT4"). Complter ce schma avec d'ventuels pointills en montrant que sept LUTs seront ncessaires pour raliser le transcodeur complet. Raliser une table de vrit complte du dcodage demand. En dduire les 7 valeurs hexadcimales d'initialisation des LUTs. Raliser l'architecture complte de "transcodeur".

RAM et FPGA
La nomination de la mmoire dans un FPGA n'est pas trs simple : s'agit-il de RAM ou de ROM ? La documentation parle de RAM mais comme il est possible de l'initialiser lors de son criture en VHDL, on peut facilement l'utiliser comme une ROM. C'est naturellement ce que l'on fait lorsque l'on implante un processeur dans le FPGA pour lui donner un programme excuter (voir livre sur SOC (System on Chip)). Il est possible de raliser des protocoles pour charger cette mmoire partir des fichiers HEX (Intel) ou binaire comme ce sera dvelopp dans le chapitre Programmer in Situ et dboguer du livre prcdemment cit.

La BRAM ou bloc RAM


Les mmoires sont difficiles utiliser en VHDL car la faon pour les implmenter dpend du fondeur de FPGA. Ainsi la faon de faire prsente dans cette section n'est vraie que pour les FPGA Xilinx. Si vous voulez que votre outil de synthse infre une RAM/ROM il vous faut crire votre RAM/ROM avec un style spcifique. Nous prsentons ici un exemple sur lequel nous nous appuierons dans la suite : ROM avec sortie Registered --- ROMs Using Block RAM Resources. -- VHDL code for a ROM with registered output (template 1) -library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rams_21a is port (clk : in std_logic; en : in std_logic; addr : in std_logic_vector(5 downto 0); data : out std_logic_vector(19 downto 0)); end rams_21a; architecture syn of rams_21a is type rom_type is array (63 downto 0) of std_logic_vector (19 downto 0); signal ROM : rom_type:= (X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A", X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002", X"08201", X"00500", X"04001", X"02500", X"00340", X"00241", X"04002", X"08300", X"08201", X"00500", X"08101", X"00602", X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021", X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",

TD2 VHDL et logique programmable X"00900", X"02023", X"00102", X"04004", X"0030D", X"00302", X"00303", X"02137", X"00304", X"02341", X"00102", X"02433", X"02036", X"04040", X"08201", X"04002", X"00900", X"00301", X"04004", X"00301", X"00102", X"02500", X"02500", X"0400D"); X"08201", X"00301", X"02237", X"02500",

14

begin process (clk) begin if (clk'event and clk = '1') then if (en = '1') then data <= ROM(conv_integer(addr)); end if; end if; end process; end syn; Exercice 5 (spcifique Xilinx et carte Spartan3) Compteur sortie sept segments ralis avec une mmoire Nous allons utiliser un compteur normal, c'est dire qui compte en binaire sur 4 bits suivi d'une mmoire pour le transcodage pour l'affichage sur un afficheur sept segments. Dimensionner la ROM ncessaire votre problme. Calculer les valeurs hexadcimales contenues dans cette ROM. 1. Raliser un compteur 4 bits avec initialisation asynchrone. 2. Raliser un diviseur de frquence par 2**24 3. Assembler le tout Commentaires sur l'exercice 5 (spcifique Xilinx) Votre fichier rapport de compilation doit faire apparatre une ROM : dans "detailed reports" chercher "Synthesizing Unit <rams_21a>", et vous verrez :
WARNING:Xst:1781 - Signal <ROM> is used but never assigned. Tied to default value. Found 16x8-bit ROM for signal <$varindex0000> created at line 62. Found 8-bit register for signal <data>. Summary: inferred 1 ROM(s). inferred 8 D-type flip-flop(s). Unit <rams_21a> synthesized.

Malheureusement, le fait qu'il dtecte une ROM ce point n'est pas suffisant pour tre sr qu'il l'implante tel quel (je veux dire en BRAM). Si vous voulez forcer une BRAM donc, dans la fentre "Design", 1. 2. 3. 4. il faut bien cliquer bouton droit sur "Synthesize -XST". Mais ensuite il faut slectionner "Process properties" (et pas "design goals and strategies" ). L il faut slectionner "HDL options" dans la "fentre" "Category" . Et ensuite cocher "rom extract" et pour "rom style" slectionner "block".

On peut voir le rsultat en dmarrant PlanAhead (un exemple provenant d'un autre projet est montr ci-dessous) aprs le placement routage complet de l'application (avec un fichier de contraintes .UCF) depuis la mme fentre "Design" en dveloppant l'arborescence de "Place and Route" et en lanant "Analyze Timing / Floorplan Design (PlanAhead)".

TD2 VHDL et logique programmable

15

Les blocs mmoires utiliss dans le FPGA

Les blocs mmoires utiliss sont dessins en blanc. L'ensemble des blocs disponibles est reprsent par les 12 rectangles rouges dont la taille et le nombre dpendent trs fortement du type du FPGA utilis. Nous croyons qu'il est bon de s'habituer ce genre d'outil pour bien comprendre ce que l'on fait. Il existe mme des situations (pas trs frquentes) pour lesquelles l'utilisation de PlanAhead est quasiment obligatoire. Dans PlanAhead, on ne voit pas forcment le chevelu et les blocs utiliss par l'application. Il faut tre sur l'onglet "Device" et cliquer sur les 3 icnes (bande verticale d'icnes cot du dessin du circuit) "show/hide loc constraints" "show/hide bundle nets" et "show/hide I/O nets".

TD2 VHDL et logique programmable

16

La RAM distribue
La RAM distribue est plus facile utiliser : il suffit de prendre l'exercice 5 sans choisir les options pour raliser une BRAM et c'est tout. Nous prsentons ci-dessous un exemple qui utilise de la ROM distribue.

Les blocs mmoires distribus utiliss dans le FPGA

Cet exemple provient d'un autre projet sur VHDL. On distingue encore les rectangles rouges reprsentant les BRAM non utiliss. L'ensemble des blocs utiliss se trouve encore en blanc et cet exemple montre bien pourquoi on appelle cela de la ROM distribue.

Rfrences
[1] http:/ / www. cypress. com/

Sources et contributeurs de larticle

17

Sources et contributeurs de larticle


TD2 VHDL et logique programmable Source: http://fr.wikibooks.org/w/index.php?oldid=346202 Contributeurs: DavidL, JackPotte, SergeMoutou, 19 modifications anonymes

Source des images, licences et contributeurs


Image:VHDLFig2.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig2.png Licence: inconnu Contributeurs: SergeMoutou File:PAL Block Diagram.jpg Source: http://fr.wikibooks.org/w/index.php?title=Fichier:PAL_Block_Diagram.jpg Licence: Copyrighted free use Contributeurs: en:User:Swtpc6800 Image:VHDLFig3.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig3.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig4.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig4.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig5.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig5.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig6.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig6.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig7.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig7.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig8.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig8.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig9.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig9.png Licence: inconnu Contributeurs: SergeMoutou File:AMD PAL 22V10.jpg Source: http://fr.wikibooks.org/w/index.php?title=Fichier:AMD_PAL_22V10.jpg Licence: Public Domain Contributeurs: Photo by Michael Holley en:User:Swtpc6800, 2006 Image:VHDLFig9b.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig9b.png Licence: inconnu Contributeurs: SergeMoutou Image:VHDLFig10.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig10.png Licence: inconnu Contributeurs: SergeMoutou File:22V10 Block Diagram.jpg Source: http://fr.wikibooks.org/w/index.php?title=Fichier:22V10_Block_Diagram.jpg Licence: Copyrighted free use Contributeurs: en:User:Swtpc6800 Image:VHDLFig11.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig11.png Licence: inconnu Contributeurs: SergeMoutou Fichier:MemoryPlanAhead1.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:MemoryPlanAhead1.png Licence: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contributeurs: SergeMoutou Fichier:MemoryPlanAhead2.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:MemoryPlanAhead2.png Licence: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contributeurs: SergeMoutou

Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/