Université Gaston Berger de Saint-Louis UFR de sciences appliquées et Technologies Section Informatique Projet Architecture Licence Informatique (2012-2013) Conception d’un microprocesseur pour la gestion d’une pompe à essence (station de service EDK) Présenter par : OUMAR HAMID OUMAR MAHAMAT ASSADICK HASSANE SAYAR Sous la direction de : Dr. CHERIF DIALLO Sommaire I. Introduction .................................................................................................................................... 3 II. Description fonctionnelle d’une pompe à essence. ..................................................................... 3 III. Les interfaces d’entrées et sorties ............................................................................................. 3 IV. Architecture et fonctionnement du microprocesseur............................................................... 5 V. Jeux d’instructions .......................................................................................................................... 6 VI. Mode d’adressage des instructions ........................................................................................... 6 VII. Unité arithmétique et logique.................................................................................................... 8 VIII. Unite de contrôle ........................................................................................................................ 9 IX. Cycle d’exécution d’une instruction........................................................................................... 9 X. Programmation microprocesseur ................................................................................................ 10 XI. Conclusion................................................................................................................................. 11 I. Introduction La conception d'un micro-processeur impose d'incessants allers-retours entre le niveau fonctionnel (ce que la machine sera capable de faire), et le niveau matériel, qui spécifie comment elle le fera. Nous avons choisi de suivre partiellement la même démarche. D’abord, nous aborderons notre description du microprocesseur par le niveau fonctionnel, car c'est à ce niveau que seront définies les caractéristiques les plus générales. Il nous sera cependant impossible de définir totalement ce niveau fonctionnel en l'absence de définition matérielle. Cette première étape nous permettra de proposer une première ébauche d'architecture, en particulier en termes de constituants élémentaires. Ce n'est qu'ensuite que nous pourrons revenir sur le niveau fonctionnel et proposer, par exemple, un jeu d'instructions précis. II. Description fonctionnelle d’une pompe à essence. On désire réaliser un microprocesseur capable de gérer une pompe à essence d’une station de service (cas de l’EDK). Celui-ci fonctionne comme suit : Un bouton Volume est activé (v=1) lorsque la commande est en fonction de la quantité(le nombre de litre). Un bouton Montant est actif (m=1) lorsque la commande est fonction du Montant. Pour envoyer une commande on appuie sur Envoyer(e=1), qui se trouve juste derrière le clavier. On peut aussi annuler une commande en tapant sur Annuler (a=1). Lors que nous souhaitons commander par volume (par exemple 30 L), la première chose à faire c’est d’initialiser le système de telle sorte qu’il accepte le nombre de litre, en appuyant sur la touche Volume du clavier de bord ci-dessus. C’est le même principe si on veut commander par Montant, il suffit juste de commencer en tapant avant tout sur la touche Montant et continuer la saisie. En bref, une fois le mode de commande est choisi, l’utilisateur entre une valeur, puis il appuie sur le bouton envoyer pour valider la commande ou sur annuler, en cas d’erreur, afin de pouvoir recommencer l’opération. Lors d’un envoi, un test est effectué pour savoir l’état du réservoir (r=1 si le réservoir contient du carburant). Si r=1 un signal est émis pour envoyer le carburant et afficher le Montant et le volume commandés. Si r=0 un signal indiquant que le réservoir est vide et qu’il faut réapprovisionner, est alors envoyer. Lors d’une annulation de commande (a=1) le système est réinitialisé. III. Les interfaces d’entrées et sorties On dispose d’un clavier contenant des touches numériques et des touches de commande dont nous avons besoin pour lancer une commande, ce clavier sera lié a un décodeur d’adresse qui va décoder le code saisi au clavier et par la suite l’envoyer à un microprocesseur qui va traiter l’information ,c’est à dire effectuer la commande et en fin afficher le Montant et le volume dans les afficheurs LEDS.(voir figure ci-dessous) IV. Architecture et fonctionnement du microprocesseur Notre microprocesseur est organisé autour des deux composants fondamentaux qui sont l'ALU (Arithmetic and Logic Unit) et l'Unité de Contrôle (CU). Schématiquement, l'ALU est l'entité de calcul d'un microprocesseur tandis que l'UC est son entité de synchronisation. Ces deux composants sont reliés entre eux et avec les éléments de mémorisation par trois bus principaux : les bus A et B sont les bus d'entrée de l'ALU tandis que le bus C correspond a son bus de sortie (dans notre cas, les mots seront de 16 bits ; ce sera donc la taille de nos bus ). Schématiquement, l'ALU va réaliser des calculs sur les valeurs des bus A et B et mettre les résultats a disposition sur le bus C tandis que l'unité de contrôle sera chargée de décoder les instructions machines. Celles-ci, une fois décodées, vont correspondre a une suite d'ouvertures et de fermetures de commandes de façon à ce que les valeurs désirées soient placées sur les bons bus de données et que le résultat soit acheminé au bon endroit. C'est aussi l'Unite de Contrôle qui fixe l'opération effectuée par l'ALU (signaux Add, Comp, Shl, Shr, And, TrA et TrB) et qui choisit les registres d'index (signaux ID0 et ID1) lorsqu'ils sont utilises. Dans un microprocesseur, les unités de mémorisation sont des registres dont les temps d'accès sont beaucoup plus rapides que le temps d'accès mémoire (entre autre parce qu'un registre n'a pas à être adressé). Notre microprocesseur comprend des registres dédies a l'adressage (IDX1, IDX2 et IDX3) et des registres spécifiques (program counter, Instruction Register et Accumulateur). Dans le cas particulier du microprocesseur, on trouve aussi trois registres spécifiques destinés aux entrées sorties mémoire (AR, MW-R et MR-R) et trois constantes (NULL, +1 et -1). Le tableau suivant présente les différents registres de notre microprocesseur. Acronyme PC Nom Program Counter IR Instruction Register Acc Accumulateur AR Address Register MW-R Memory Write Register MR-R Memory Read Register IDX1 IDX2 IDX3 NULL Index 1 Index 2 index 3 Null register +1 Plus one register -1 Minus one register Schéma logique de l’application Fonction Contient l'adresse mémoire de la prochaine instruction à exécuter. Contient le code machine de l'instruction en cours d'exécution. Registre destiné à recevoir le résultat des opérations de calcul. Lors d'un accés mémoire (en lecture ou en écriture), ce registre contient l'adresse mémoire utilisée. Lors d'une opération d' ecriture en mémoire, ce registre contient le mot à transferer du bus vers la memoire. Lors d'une lecture mémoire, ce registre contient le mot a transférer de la mémoire vers le bus. Premier registre d'index. Deuxième registre d'index. Troisième registre d'index. Constante 0x0000 (utilisé pour spécifier les modes d'adressage non-index es). Constante 0x0001. Constante 0xFFFF Le microprocesseur qui a été développé en simulation par logiciel LogicWorks V. Jeux d’instructions Notre Microprocesseur dispose d'un ensemble d'instructions relativement étendu dans lequel on trouvera quatre instructions arithmétiques (addition, complément a deux, multiplication par deux et division par deux, ET logique), des instructions de saut (en fait deux sauts conditionnels et un saut inconditionnel), des instructions de manipulation d'index (lecture/ écriture d'index, incrément /décrément d'index) et deux instructions d'entrée-sortie (Read et Write). A ces instructions, il faudra naturellement ajouter deux instructions de lecture/ écriture mémoire (load et store). Nous obtenons donc un total de 16 instructions assembleur 16 bits (le code opération OpCode sera donc codé sur 4 bits). Celles-ci peuvent être, classiquement, regroupées en 4 types : Les instructions d'accès mémoire, les instructions arithmétiques, les instructions de branchement (conditionnelles ou inconditionnelles), les instructions d'entrée-sortie VI. Mode d’adressage des instructions Instruction OpCode Description Fonction LDA mem 0000 LoaD Accumulator STA mem 0001 STore Accumulator ADD mem 0010 TCA 0011 AND mem 0100 BRU mem 0101 Charge dans la mémoire, à l'adresse « mem » le contenu de l'accumulateur ADD Accumulator Ajoute a l'accumulateur le contenu de la mémoire lu a l'adresse « mem ». Le résultat de l'addition est stocke dans l'accumulateur Two Complement Complément a deux de l'accumulateur. Accumulator Le résultat de l'addition est stock e dans l'accumulateur AND Accumulator AND bit a bit entre l'accumulateur et le contenu de la mémoire lu a l'adresse « mem ». Le résultat est stock e dans l'accumulateur BRanchUnconditional Saut inconditionnel a l'adresse « mem ». BIP mem 0110 Branch If Positive Saut conditionnel. Saute a l'adresse « mem » si ACC>0. BIN mem 0111 Branch If Negative RWD 1000 Read a WorD WWD 1001 Write a WorD Saut conditionnel. Saute à l'adresse « mem » si ACC<0. Lit un mot sur la console et le charge dans l'accumulateur Ecrit sur l’afficheur LED , le contenu de l'accumulateur SHL 1010 SHift Left Décalage a gauche du contenu de l’accumulateur. Equivaut à une multiplication par deux. SHR 1011 SHift Right LDX mem 1100 LoaD indeX STX mem 1101 STore indeX Décalage à droite du contenu de l'accumulateur (avec conservation du signe). Equivaut à une division par deux. Charge dans un registre d'index le contenu de la mémoire lu à l'adresse « mem ». Charge dans la mémoire, à l'adresse « mem », le contenu de l'index TIX mem 1110 Test Incremented indeX Charge dans l'accumulateur le contenu de la mémoire lu a l'adresse « mem ». Incrémente le registre d'index et effectue un saut a l'adresse « mem » si le contenu du registre est nul. TDX mem VII. 1111 Test Decremented indeX Décrémente le registre d'index et effectue un saut a l'adresse « mem » si le contenu du registre est non nul Unité arithmétique et logique L'Unité Arithmétique et Logique (Arithmetic and Logic Unit ALU) est l'élément de calcul d'un microprocesseur. Elle comporte trois entrées : deux bus de données (Bus A et Bus B) et un bus de commande indiquant quelle opération l'ALU doit effectuer. Elle comporte une seule sortie correspondant au résultat de l'opération en cours (Bus C). Les trois bus de données (entrées et sorties) sont tous de la même taille (16 bits puisqu'il s'agit de la taille des mots manipulés par le microprocesseur). La taille du bus de commande dépend du nombre d'opérations réalisées par l'ALU. Dans le cas de notre microprocesseur, l'ALU va permettre l'exécution de calculs arithmétiques. De plus, un simple coup d'œil au schéma global de notre microprocesseur nous montre que l'ALU devra aussi permettre de transferer des informations de l'un de ses bus d'entrée (Bus A ou B) vers le bus C. C'est pourquoi, outre les cinq opérations nécessaires pour réaliser les instructions de calcul (addition, décalages à gauche ou à droite, ET logique et complément), l'ALU est dotée de deux opérations de transfert permettant de placer, sur le bus C, le contenu du bus A (opération TrA) ou du bus B (opération TrB). Finalement, notre ALU comporte sept opérations : Addition : le contenu du bus A est ajouté au contenu du bus B et le résultat est placé sur le bus C. On note : Bus C = ADD (Bus A, Bus B). And : ET logique entre le contenu du bus A et le contenu du bus B. Le résultat est placé sur le bus C. On note : Bus C = AND (Bus A, Bus B). Complément à 1 : le contenu du Bus A est complémenté et le résultat est placé sur le bus C. On note : Bus C=COMP (Bus A). Décalage à droite : le contenu du Bus A est décalé à droite d’un bit et le résultat est placé sur le Bus C (ce qui équivaut à une division par deux). On note: Bus C=SHR (Bus A). Décalage à gauche : le contenu du Bus A est décalé gauche de un bit et le résultat est placé sur le bus C (ce qui équivaut à une multiplication par deux). On note: Bus C=SHL (Bus A). Transfert A : le contenu du Bus A est place sur le Bus C. On note : Bus C=TrA (Bus A). Transfert B : le contenu du Bus B est placé sur le Bus C. On note : Bus C=TrB (Bus B). Schéma de l’Unité Arithmétique et Logique : VIII. Unite de contrôle L'unité de contrôle (UC) parfois appelée en français « séquenceur » constitue le cœur d'un microprocesseur : c'est elle qui régule les interactions entre les différents éléments en distribuant, suivant une synchronisation précise, les signaux de commande aux diverses unités participant à l'exécution d'une instruction (registres, ALU, bus, mémoires, ...). Elle lit une instruction et la charge dans le registre de lecture de la PROM (IR), Elle modifie la valeur stockée dans le PC pour permettre la lecture de l’instruction suivante (il peut s'agir d'une incrémentation ou d'un saut en fonction des informations dont dispose l’UC sur l'état du microprocesseur), Elle décode l’instruction de façon à fournir les signaux de contrôle au microprocesseur. Cette deuxième tache n'est pas toujours effectuée car certaines instructions sont destinées uniquement à la gestion interne de l'UC. Lorsqu'elle est nécessaire, cette opération est effectuée par un module spécifique : le décodeur. Le cycle d'exécution des instructions est cadencé par une horloge externe (CLK). On notera que, lorsque l'UC fournit les signaux de contrôle au microprocesseur, elle doit respecter une synchronisation précise (afin de garantir, par exemple, que l'ALU aura le temps d'exécuter les calculs demandés avant que les registres ne stockent le résultat). La figure ci-dessous présente l'architecture générale d'une UC micro-programmée. IX. Cycle d’exécution d’une instruction Afin d'assurer la bonne exécution de ces trois taches, l'exécution d'une instruction par le microprocesseur est divisée en trois phases distinctes : FETCH, DEFER (éventuellement) et EXECUTE. Le cycle FETCH correspond aux opérations de chargement de l'instruction à exécuter de la mémoire vers le registre MR-R puis vers IR (Cette opération devant être précédée du transfert de l'adresse de l'instruction (stockée dans le registre PC) vers le registre AR) et d'incrémentation du compteur ordinal (registre PC). DEFER n'est exécuté que lorsque le microprocesseur est utilisé en mode d'adressage indirect EXECUTE : l'UC doit donc décoder le code opératoire (OPCODE charge lors du cycle FETCH) pour savoir quelles instructions exécuter. De plus, la séquence des instructions peut aussi, suivant les instructions assembleurs, être dépendante de signaux de contrôle calculés en fonction de l'état de l'accumulateur ou d'un registre d'index. X. Programmation microprocesseur adr 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b commentaire FETCH type 0 0 0 0 0 1 0 2 3 0 0 5 instruction AR <- PC READ PC <- PC + 1 IR <- MR-R AR <-IR0-8 Si instr. non-indexable, saut a la ADDRESS 0x07 AR <-IR0-8 + IdX Saut vers (OPCODE +1)*8 Si IR13=1, saut vers DEFER ( ADDRESS 0x83) READ ACC <-MR-R Saut vers FETCH ( ADDRESS 0x00) valeur 0x08210 0x00004 0x08f30 0x009a0 0x06210 0x10700 0x06630 0x20000 0x38300 0x00004 0x008a0 0x50000 0x10 0x11 0x12 0x13 Exec. STA 3 0 0 5 Si IR13=1, saut vers DEFER (ADDRESS 0x83) MW-R <- ACC WRITE Saut vers FETCH (ADDRESS 0x00) 0x38300 0x02290 0x00008 0x50000 0x18 0x19 0x1a 0x1b Exec. ADD 3 0 0 5 Si IR13=1, saut vers DEFER (ADDRESS 0x83) READ ACC <- MR-R + ACC Saut vers FETCH (ADDRESS 0x00) 0x38300 0x00004 0x028b0 0x50000 0x20 0x21 0x22 Exec. TCA 0 0 5 ACC <- COMP(ACC) ACC <- ACC + 1 Saut vers FETCH (ADDRESS 0x00) 0x020c0 0x02cb0 0x50000 0x28 0x29 0x2a 0x2b Exec. AND 3 0 0 5 Si IR13=1, saut vers DEFER (ADDRESS 0x83) READ ACC <- AND (MR-R,ACC) Saut vers FETCH (ADDRESS 0x00) 0x38300 0x00004 0x028f0 0x50000 0x30 0x31 0x32 Exec. BRU 3 0 5 Si IR13=1, saut vers DEFER (ADDRESS 0x83) PC <-AR Saut vers FETCH (ADDRESS 0x00) 0x38300 0x04310 0x50000 0x38 0x39 0x3a 0x3b Exec. BIP 6 3 0 5 Si ACC <= 0, Saut vers FETCH (ADDRESS 0x00) Si IR13=1, saut vers DEFER (ADDRESS 0x83) PC <- AR Saut vers FETCH (ADDRESS 0x00) 0x60000 0x38300 0x04310 0x50000 0x40 0x41 Exec. BIN 7 5 Si ACC >= 0, Saut vers FETCH (ADDRESS 0x00) Saut vers la ADDRESS 0x39 0x70000 0x53900 Indexage Goto Exec Exec. LDA XI. Conclusion Actuellement la tendance est à la simplification des jeux d’instructions des machines et les ordinateurs micro-programmés sont moins diffusées. Toutefois, il faut remarquer que la programmation en assembleur se rapproche davantage de la conception de microprogramme que de l’écriture de programme en langage d’assemblage. En outre, la conception de circuits à la demande fait davantage appel à l’utilisation de systèmes en tranches pour lesquels l’utilisation du micro-contrôle est indispensable.