Architecture des Ordinateurs Processeur MIPS Rapport Xavier Perseguers, [email protected] Tadeusz Senn, [email protected] 1er mai 2002 ÉCOLE POLYTECHNIQUE FÉDÉRALE DE LAUSANNE Rapport : Processeur MIPS – BB 1 Processeur MIPS – BB Introduction Ce rapport présente la réalisation d’un processeur MIPS 32 bits en VHDL. Le processeur, surnommé BB, a été créé avec un petit nombre d’instructions (arithmétiques : ADD, SUB et ADDI ; logiques : AND et OR ; de saut conditionnel : BEQ ; et d’accès à la mémoire : SW et LW ). La technique du pipelining n’a pas été abordée. Il décrit la méthodologie utilisée pour implémenter le processeur, les tests effectués pour vérifier son bon fonctionnement, les problèmes rencontrés et leurs solutions, ainsi que certaines améliorations possibles. Méthodologie La méthodologie choisie a été de créer les composants et de les tester au fur et à mesure. Nous utilisons au maximum la bibliothèque arithmétique. De cette façon, notre approche est plus comportementale que structurelle. C’est aussi pourquoi nous préférons ne pas réutiliser les composants développés séparément. Unité de contrôle L’unité de contrôle est une machine de Moore, i.e. une machine dont l’état futur ne dépend que de l’état présent. Elle est composée de sept états organisés selon la figure 1 : Fetch : lecture de l’instruction suivante (IRWrite et MemiCS à 1 ), incrémentation du Program Counter (PC) (PCWrite activé, et PCSrc désactivé pour que le PC soit incrémenté de la valeur par défaut 4, i.e. P C = P C + 4 comme dans tous les états où il est désactivé). Decode : détermination de l’état futur en fonction de l’instruction lue dans l’état Fetch. De plus, si l’instruction est un SW, préparation de l’adresse en désactivant ALUSrc (explications dans la section Problèmes et Solutions, en page 6). Rapport : Processeur MIPS – BB 2 Fetch LW Op LW Op Addi Decode Addi Op BEQ Op SW Op R-Type BEQ SW R-Type Fig. 1 – Graphe des états de l’unité de contrôle Les états suivants sont des opérations : Addi ALUCtrl : signal à 010 pour effectuer l’addition avec l’ALU. ALUSrc : activé (signal à 1 ) pour sélectionner la valeur immédiate comme l’une des sources de l’addition. RegWrite : activé pour enregistrer le résultat dans un registre. RegDst : désactivé (signal à 0 ) pour prendre l’adresse du registre destination RT venant des bits 20 à 16 de l’instruction. BEQ ALUCtrl : signal à 110 pour effectuer une soustraction avec l’ALU. La soustraction permet de comparer la valeur des deux registres. Si le résultat est nul, le flag zero de l’ALU sera activé et provoquera la mise à jour du PC. PCSrc : activé pour remplacer la valeur du PC par la sortie de l’additionneur calculant le Branch Target. PCWriteCond : activé pour écrire dans le PC pour autant que le bit zero de l’ALU soit aussi activé. ALUSrc : désactivé pour que la seconde sortie du Register File arrive sur l’ALU. Rapport : Processeur MIPS – BB 3 RegDst : désactivé pour prendre l’adresse du registre destination RT venant des bits 20 à 16 de l’instruction. SW ALUCtrl : signal à 010 pour effectuer une addition avec l’ALU. L’addition permet de calculer l’adresse mémoire en combinant l’adresse stockée et l’offset. ALUSrc : activé pour prendre comme seconde opérande de l’ALU les 16 bits de poids faible (sign extended), c’est-à-dire la partie offset de l’instruction. MemdCS : activé pour sélectionner la mémoire. MemdWE : activé pour remplacer le contenu de la mémoire désigné par l’adresse par le contenu de DataIn. RegDst : désactivé pour prendre l’adresse du registre destination RT venant des bits 20 à 16 de l’instruction. LW ALUCtrl : signal à 010 pour calculer l’adresse mémoire comme dans l’état SW. ALUSrc : activé comme dans l’état SW. MemdCS : activé comme dans l’état SW. MemtoReg : activé pour copier le contenu de la mémoire dans un registre. RegWrite : activé pour autoriser l’écriture dans le registre. RegDst : désactivé pour prendre l’adresse du registre destination RT venant des bits 20 à 16 de l’instruction. R-Type ALUCtrl : déterminé par les bits Funct de l’instruction. Permet de choisir l’opération arithmétique ou logique à effectuer. RegDst : activé pour signifier que le registre de destination du résultat de l’opération est déterminé par les bits 15 à 11 de l’instruction (partie RD). RegWrite : activé comme dans l’état LW. ALUSrc : désactivé pour que la seconde sortie du Register File arrive sur l’ALU. Donner une valeur initiale à tous les signaux sortants, y compris l’état futur, empêche la synthèse de latches et simplifie le code. De plus, cela permet au circuit d’être dans un état stable par défaut. 1 0 Addi 010 1 Beq 010 0 SW 010 1 LW 110 1 1 1 1 R-Type (ALUCtrl[2..0]/Funct[5..0]) Add Sub And Or 010/100000 110/100010 000/100100 001/100101 0 0 0 0 1 1 1 Rapport : Processeur MIPS – BB Fetch ALUCtrl[2..0] ALUSrc IRWrite MemdCS MemdWE MemiCS MemtoReg PCSrc PCWrite PCWriteCond RegDst RegWrite Etat suivant Decode SW Autres 1 1 0 1 Decode 1 0 0 0 1 1 1 1 1 1 1 1 1 Fetch Tab. 1 – Synthèse des signaux de l’unité de contrôle — inspiré de la figure 5.20 p. 361 du COD. 4 Rapport : Processeur MIPS – BB 5 Tests Effectués La première vérification du bon fonctionnement a été faite avec le programme proposé dans la mémoire d’instructions. Ensuite, les opérations logiques (AND et OR) ainsi que l’accès en écriture à la mémoire (SW ) ont été rajoutés parce qu’ils n’étaient pas testés dans le programme original. Enfin, nous avons écrit un programme calculant le produit de deux facteurs initialement stockés en mémoire (cf. listing 1). Le programme est structuré comme une procédure. Les adresses des deux facteurs sont stockées respectivement dans $a0 et $a1, et celle de retour, dans $v0. La première partie permet d’initialiser le contenu de la mémoire (memdata) ; la seconde effectue la multiplication, basée sur sa définition mathématique : a·b= a X b 1 Listing 1: Programme de multiplication : 6 · 8 1 3 4 5 6 7 8 9 11 13 14 15 16 17 18 19 20 21 22 23 25 26 # Initialization addi addi add addi addi sw sw $s0 , $s1 , $a0 , $a1 , $v0 , $s0 , $s1 , $zero , 6 $zero , 8 $zero , $ z e r o $a0 , 4 $a1 , 4 0 ( $a0 ) 0 ( $a1 ) # $s0 = 6 # $s1 = 8 # $a0 = 0 # $a1 = 4 # $v0 = 8 # mem[ $a0 ] = $s0 # mem[ $a1 ] = $s1 # Multiplication lw lw add add Loop : add addi beq beq End : sw $s0 $s1 $s2 $s3 , , , , $s2 , $s3 , $s3 , $zero 0 ( $a0 ) 0 ( $a1 ) $zero , $ z e r o $zero , $ z e r o # # # # $s2 , $s1 $s3 , 1 $s0 , End , $zero , Loop # $s2 = $s2 + $s1 # $s3 = $s3 + 1 # i f $s3=$s1 GOTO End # GOTO Loop $s2 , 0 ( $v0 ) $s0 $s1 $s2 $s3 = = : : operand #1 operand #2 temp r e s u l t loop counter # mem[ $v1 ] <= r e s u l t Eternity : beq $zero , $zero , E t e r n i t y # i n f i n i t e l o o p Rapport : Processeur MIPS – BB 6 Fig. 2 – Déroulement du programme Problèmes et Solutions Le premier problème est apparu lors de la simulation : un signal avait une valeur ‘X’ alors que le programme n’utilisait que des ‘0’ et des ‘1’. Nous avions initialisé les signaux dans le processus Reset de l’unité de contrôle (processus propre) et au début du processus principal. Or l’un des signaux avait une autre assignation dans l’état Fetch. Comme solution, seul l’état est remis à Fetch dans le Reset, et tous les signaux sont initialisés à chaque coup d’horloge dans le processus principal. Dans l’ALU, le flag zero doit être activé quand un résultat est nul. Comme le résultat temporaire (dans notre cas tp result) est défini comme un signal, il est indispensable de définir la valeur de ce flag à l’extérieur du processus de calcul sous peine d’avoir un décalage d’un coup d’horloge entre le nouveau résultat et son activation éventuelle. L’opération de saut conditionnel BEQ peut être effectuée, théoriquement, par les opérations AND ou SUB de l’ALU. En pratique, le signal zero est indispensable pour que la valeur du PC puisse être différente de P C = P C +4 ; d’où le choix de la soustraction qui active ce signal si les opérandes sont égales. Le dernier problème s’est posé avec l’instruction SW. En effet, lors des premiers tests et comme nous nous sommes basés tout d’abord sur le graphe des états du cours (cf. figure 1, p. 2), l’instruction commençait par écrire n’importe où en mémoire avant de le faire à la bonne adresse. En examinant le schéma de l’unité de traitement, il est apparu que l’adresse n’est valide qu’après son calcul dans l’ALU, lequel requière un coup d’horloge supplémentaire par rapport au signal de sélection en écriture de la mémoire (MemdWE ). Ainsi, il était envisageable d’ajouter un état intermédiaire, entre les états Decode et SW, pour laisser du temps à l’ALU. Toutefois nous avons trouvé plus astucieux de préparer l’adresse dans l’état Decode. Rapport : Processeur MIPS – BB 7 Améliorations Le design du processeur mis à part, des améliorations au niveau des performances et des possibilités intrinsèques sont envisageables. Actuellement, toutes les instructions demandent, pour s’exécuter, trois coups d’horloge pendant lesquels une partie du processeur n’est pas utilisée. Il serait intéressant d’implémenter le pipelining pour réduire le temps total d’exécution et avoir une meilleure gestion des ressources du processeur. Le pipelining permet de commencer à exécuter une nouvelle instruction alors que la précédente est encore traitée. Il faut évidemment remarquer qu’une instruction de saut ou un test empêchent l’application de cette technique. Le nombre de coups d’horloge pour une instruction n’est pas réduit, mais comme les opérations se chevauchent, le temps total d’exécution d’une séquence d’instructions est diminué. Le Processeur MIPS – BB a un jeu d’instructions quelque peu restreint. Des instructions telles que des décalages (SLL et SRL), un autre comparateur (SLT ) et une nouvelle opération logique (NOR) augmenteraient de façon significative les possibilités de programmation. Les décalages permettent des multiplications et divisions par 2 ; le comparateur ‘<’ complète les instructions de sauts conditionnels ; et le NOR permet de calculer toutes les autres fonctions logiques, en particulier la fonction NOT. Enfin, la gestion des exceptions permettrait de détecter les dépassements de capacité dans les opérations arithmétiques ainsi que les instructions non reconnues ou incorrectes. Conclusion 17.04.2002 11h49: ÇA MARCHE !!! Pour réaliser le Processeur MIPS – BB, les solutions choisies — par exemple les bibliothèques arithmétiques — nous sont apparues comme évidentes du fait de leur simplicité et de leur logique. De plus, plutôt que de coder les instructions utilisées pour la multiplication en binaire, nous avons préféré créer, en informaticiens, le programme MIPS Assembler 1 . Finalement, ce projet nous a permis de nous familiariser avec la logique d’un processeur, son architecture et son fonctionnement. Nous espérons garder en mémoire les quelques subtilités découvertes pour pouvoir les exploiter dans notre avenir en ingénierie informatique. 1. Disponible sur http://diwww.epfl.ch/∼persegue/mips/ Rapport : Processeur MIPS – BB 8 Références [1] D.A. Patterson et J.L. Hennessy. Computer Organization & Design, 2nd Edition. Morgan Kaufmann Publishers, 1998. [2] E. Sanchez et P. Ienne. Notes du cours Conception des Processeurs, 2001-2002. [3] E. Sanchez et P. Ienne. Notes du cours Architecture des Ordinateurs, 2002. [4] B. Orwell. Nineteen Eighty-Four. Penguin Books, 1948. Rapport : Processeur MIPS – BB 9 Annexes Fichiers VHDL add synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 alu synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 and 2 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 controlunit synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 ir synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 memdata synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 meminstr synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 mux 2 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 or 2 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 pc synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 reg 32 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 regfile 32 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26 shiftleft2 synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 signextend synth.vhd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Rapport : Processeur MIPS – BB Listing 2: add synth.vhd 1 2 3 4 6 7 8 9 10 11 12 14 15 17 18 19 20 LIBRARY USE i e e e USE i e e e USE i e e e ieee ; . std logic 1164 . all ; . std logic arith . all ; . std logic unsigned . all ; ENTITY add IS PORT( a : IN b : IN r e s u l t : OUT ); END add ; s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; s t d l o g i c v e c t o r ( 3 1 downto 0 ) −− Simple o pé r a t i o n a r i t h m é t i q u e ( a d d i t i o n ) −− u t i l i s a n t l a b i b l i o t h è q u e a r i t h m é t i q u e ARCHITECTURE synth OF add IS BEGIN r e s u l t <= a + b ; END synth ; 10 Rapport : Processeur MIPS – BB 11 Listing 3: alu synth.vhd 1 2 3 4 6 7 8 9 10 11 12 13 14 16 17 18 20 21 23 24 25 26 27 28 29 30 31 32 34 36 37 38 39 40 41 42 LIBRARY USE i e e e USE i e e e USE i e e e ieee ; . std logic 1164 . all ; . std logic arith . all ; . std logic unsigned . all ; ENTITY a l u IS PORT( a : b : result : zero : op : ); END a l u ; IN IN OUT OUT IN std std std std std logic logic logic logic logic v e c t o r ( 3 1 downto 0 ) ; v e c t o r ( 3 1 downto 0 ) ; v e c t o r ( 3 1 downto 0 ) ; ; v e c t o r ( 2 downto 0 ) ARCHITECTURE synth OF a l u IS SIGNAL t p r e s u l t : s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; BEGIN −− P r o c e s s u s p r i n c i p a l dé c o d a n t l e s i g n a l op . −− Choix de ‘U’ pour d e s o p é r a t i o n s non reconnues PROCESS ( op , a , b ) BEGIN CASE op IS WHEN ” 000 ” => t p r e s u l t <= a AND b ; WHEN ” 001 ” => t p r e s u l t <= a OR b ; WHEN ” 010 ” => t p r e s u l t <= a + b ; WHEN ” 110 ” => t p r e s u l t <= a − b ; WHEN others => t p r e s u l t <= (OTHERS = > ’U ’ ) ; END CASE; END PROCESS; −− G e s t i o n du f l a g z e r o PROCESS ( t p r e s u l t ) BEGIN IF ( t p r e s u l t = ( 3 1 downto 0 = > ’ 0 ’ ) ) THEN z e r o <= ’1 ’; ELSE z e r o <= ’0 ’; END IF ; Rapport : Processeur MIPS – BB 43 45 46 48 50 END PROCESS; −− Passage par un s i g n a l t e m p o r a i r e pour que l a −− s o r t i e r e s u l t a i t t o u j o u r s une v a l e u r r e s u l t <= t p r e s u l t ; END synth ; 12 Rapport : Processeur MIPS – BB Listing 4: and 2 synth.vhd 1 2 3 5 6 7 8 9 10 11 13 14 16 17 18 19 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; USE i e e e . s t d l o g i c a r i t h . a l l ; ENTITY And PORT( In0 In1 Out0 ); END And 2 ; 2 IS : IN : IN : OUT std logic ; std logic ; std logic −− Simple o pé r a t i o n l o g i q u e (ET l o g i q u e ) −− u t i l i s a n t l a b i b l i o t h è q u e a r i t h m é t i q u e ARCHITECTURE synth OF And 2 IS BEGIN Out0 <= In0 AND In1 ; END synth ; 13 Rapport : Processeur MIPS – BB 14 Listing 5: controlunit synth.vhd 1 2 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; 23 ENTITY C o n t r o l U n i t IS PORT( Funct : IN Op : IN clk : IN reset : IN ALUCtrl : OUT ALUSrc : OUT IRWrite : OUT MemdCS : OUT MemdWE : OUT MemiCS : OUT MemtoReg : OUT PCSrc : OUT PCWrite : OUT PCWriteCond : OUT RegDst : OUT RegWrite : OUT ); END C o n t r o l U n i t ; 25 ARCHITECTURE synth OF C o n t r o l U n i t IS 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 27 28 29 30 31 33 35 36 38 39 41 42 std std std std std std std std std std std std std std std std logic logic logic logic logic logic logic logic logic logic logic logic logic logic logic logic v e c t o r ( 5 downto 0 ) ; v e c t o r ( 5 downto 0 ) ; ; ; v e c t o r ( 2 downto 0 ) ; ; ; ; ; ; ; ; ; ; ; −− d é c l a r a t i o n d e s 7 é t a t s type State Type i s ( Fetch , Decode , Addi , Beq , RType , SW, LW) ; s i g n a l c u r r e n t s t a t e : State Type ; s i g n a l n e x t s t a t e : State Type ; BEGIN PROCESS ( c u r r e n t s t a t e , op , Funct ) BEGIN −− I n i t i a l i s a t i o n de t o u s l e s s i g n a u x −− à chaque changement d ’ é t a t ALUCtrl ALUSrc <= (OTHERS = > ’ 0 ’ ) ; <= ’0 ’; Rapport : Processeur MIPS – BB 53 IRWrite MemdCS MemdWE MemiCS MemtoReg PCSrc PCWrite PCWriteCond RegDst RegWrite next state 55 CASE c u r r e n t s t a t e IS 43 44 45 46 47 48 49 50 51 52 57 59 60 61 62 63 65 66 68 69 70 71 72 73 74 75 76 77 78 79 80 82 84 85 86 15 <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= ’0 ’; <= Fetch ; −− Fetch : Charger l ’ i n s t r u c t i o n s u i v a n t e WHEN Fetch => IRWrite <= ’1 ’; PCWrite <= ’1 ’; MemiCS <= ’1 ’; n e x t s t a t e <= Decode ; −− Decode : Décoder l ’ i n s t r u c t i o n −− Pour SW, c a l c u l e r l ’ a d r e s s e en p l u s WHEN Decode => CASE Op IS WHEN ” 001000 ” => n e x t s t a t e <= Addi ; WHEN ” 000100 ” => n e x t s t a t e <= Beq ; WHEN ” 000000 ” => n e x t s t a t e <= RType ; WHEN ” 101011 ” => ALUCtrl <= ” 010 ” ; ALUSrc <= ’1 ’; MemdCS <= ’1 ’; n e x t s t a t e <= SW; WHEN ” 100011 ” => n e x t s t a t e <= LW; WHEN OTHERS => n e x t s t a t e <= Fetch ; END CASE; −− O pé r a t i o n s WHEN Addi => ALUCtrl <= ” 010 ” ; ALUSrc <= ’1 ’; Rapport : Processeur MIPS – BB 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 118 119 121 122 123 124 125 126 127 128 130 RegWrite <= ’1 ’; WHEN Beq => −− S o u s t r a c t i o n pour un s a u t ALUCtrl <= ” 110 ” ; PCSrc <= ’1 ’; PCWriteCond <= ’1 ’; WHEN RType => −− Choix de l ’ o pé r a t i o n de t y p e R−t y p e CASE Funct IS WHEN ” 100000 ” => ALUCtrl <= ” 010 ” ; WHEN ” 100010 ” => ALUCtrl <= ” 110 ” ; WHEN ” 100100 ” => ALUCtrl <= ” 000 ” ; WHEN ” 100101 ” => ALUCtrl <= ” 001 ” ; WHEN OTHERS => ALUCtrl <= ”UUU” ; END CASE; RegDst <= ’1 ’; RegWrite <= ’1 ’; WHEN SW => ALUCtrl <= ” 010 ” ; ALUSrc <= ’1 ’; MemdCS <= ’1 ’; MemdWE <= ’1 ’; WHEN LW => ALUCtrl <= ” 010 ” ; ALUSrc <= ’1 ’; MemdCS <= ’1 ’; MemtoReg <= ’1 ’; RegWrite <= ’1 ’; END CASE; END PROCESS; −− P r o c e s s u s Reset : −− I n i t i a l i s e uniquement l ’ é t a t c o u r a n t PROCESS ( c l k , r e s e t ) BEGIN IF ( r e s e t = ’ 1 ’ ) THEN c u r r e n t s t a t e <= f e t c h ; ELSIF ( c l k ’ e v e n t AND c l k = ’ 1 ’ ) THEN c u r r e n t s t a t e <= n e x t s t a t e ; END IF ; END PROCESS; END synth ; 16 Rapport : Processeur MIPS – BB Listing 6: ir synth.vhd 1 2 4 5 6 7 8 9 10 11 13 14 16 17 18 20 21 22 23 24 25 26 27 29 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY IR PORT( a q we clk ); END IR ; IS : : : : IN OUT IN IN std std std std l o g i c v e c t o r ( 3 1 downto 0 ) ; l o g i c v e c t o r ( 3 1 downto 0 ) ; logic ; logic ARCHITECTURE synth OF IR IS BEGIN −− R e g i s t r e d ’ i n s t r u c t i o n ( 3 2 b i t s ) −− a c t i v é en é c r i t u r e avec un s i g n a l −− s u p p lé m e n t a i r e ( ‘ we ’ ) PROCESS ( c l k , a , we ) BEGIN IF ( c l k ’ e v e n t AND c l k = ’ 1 ’ ) THEN IF ( we = ’ 1 ’ ) THEN q <= a ; END IF ; END IF ; END PROCESS; END synth ; 17 Rapport : Processeur MIPS – BB 18 Listing 7: memdata synth.vhd 1 2 3 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 25 26 27 28 29 30 32 33 34 36 37 39 40 42 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; USE i e e e . s t d l o g i c u n s i g n e d . a l l ; ENTITY memdata PORT( adr Data Out cs we Data In oe ); END memdata ; IS : : : : : : IN OUT IN IN IN IN std std std std std std logic logic logic logic logic logic v e c t o r ( 7 downto 0 ) ; v e c t o r ( 3 1 downto 0 ) ; ; ; v e c t o r ( 3 1 downto 0 ) ; ARCHITECTURE synth OF memdata IS TYPE memdtype IS ARRAY( ( ( 2 ∗ ∗ 8 ) / 4 ) − 1 downto 0 ) OF s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; SIGNAL memoired : memdtype := (0 = > ” 000000000000000000000000 000 0010 0 ” , 1 => ” 000000000000000000000000 000 0001 1 ” , OTHERS => ” 000000000000000000000000 000 0000 0 ” ) ; BEGIN −− −− −− −− −− −− Memoire de données : Doit ê t r e s é l e c t i o n n é e ( ’ cs ’ ) p u i s deux modes : l e c t u r e e t é c r i t u r e en f o n c t i o n de ‘ we ’ ( c o n v i n t e g e r n é c e s s a i r e p a r c e que l ’ i n d e x de l a mémoire e s t de t y p e i n t e g e r ) PROCESS ( cs , oe , we , adr , Data In ) BEGIN Data Out <= (OTHERS = > ’Z ’ ) ; IF ( c s = ’ 1 ’ ) THEN IF ( we = ’ 1 ’ ) THEN −− Mode : E c r i t u r e memoired (CONV INTEGER( adr )) <= Data In ; ELSE Rapport : Processeur MIPS – BB −− Mode : L e c t u r e IF ( oe = ’ 1 ’ ) THEN Data Out <= memoired (CONV INTEGER( adr ) ) ; END IF ; 44 45 46 47 49 50 51 53 19 END IF ; END IF ; END PROCESS; END synth ; Rapport : Processeur MIPS – BB Listing 8: meminstr synth.vhd 1 2 3 5 6 7 8 9 10 11 12 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; USE i e e e . s t d l o g i c u n s i g n e d . a l l ; ENTITY meminstr IS PORT( adr : IN data : OUT cs : IN oe : IN ); END meminstr ; std std std std l o g i c v e c t o r ( 7 downto 0 ) ; l o g i c v e c t o r ( 3 1 downto 0 ) ; logic ; logic ARCHITECTURE synth OF meminstr IS TYPE memitype IS ARRAY( ( ( 2 ∗ ∗ 8 ) / 4 ) − 1 downto 0 ) OF s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; s i g n a l memoirei : memitype : = ( −− a d d i $s0 , $zero , 6 0 => ” 0010000000010000000000000 000 0110 ” , −− a d d i $s1 , $zero , 8 1 => ” 0010000000010001000000000 000 1000 ” , −− add $a0 , $zero , $ z e r o 2 => ” 0000000000000000001000000 010 0000 ” , −− a d d i $a1 , $a0 , 4 3 => ” 0010000010000101000000000 000 0100 ” , −− a d d i $v0 , $a1 , 4 4 => ” 0010000010100010000000000 000 0100 ” , −− sw $s0 , 0 ( $a0 ) 5 => ” 1010110010010000000000000 000 0000 ” , −− sw $s1 , 0 ( $a1 ) 6 => ” 1010110010110001000000000 000 0000 ” , −− lw $s0 , 0 ( $a0 ) 7 => ” 1000110010010000000000000 000 0000 ” , −− lw $s1 , 0 ( $a1 ) 8 => ” 1000110010110001000000000 000 0000 ” , −− add $s2 , $zero , $ z e r o 9 => ” 0000000000000000100100000 010 0000 ” , −− add $s3 , $zero , $ z e r o 10 => ” 0000000000000000100110000 010 0000 ” , −− add $s2 , $s2 , $s1 11 => ” 0000001001010001100100000 010 0000 ” , 20 Rapport : Processeur MIPS – BB 52 −− a d d i $s3 , $s3 , 1 12 => ” 0010001001110011000000000 000 0001 ” , −− b e q $s0 , $s3 , 1 13 => ” 0001001001110000000000000 000 0001 ” , −− b e q $zero , $zero , −4 14 => ” 0001000000000000111111111 111 1100 ” , −− sw $s2 , 0 ( $v0 ) 15 => ” 1010110001010010000000000 000 0000 ” , −− b e q $zero , $zero , −1 16 => ” 0001000000000000111111111 111 1111 ” , 54 OTHERS => ” 000000000000000000000000 0000 000 0 ” ) ; 43 44 45 46 47 48 49 50 51 56 58 59 61 62 63 64 65 66 67 68 69 71 BEGIN −− Mémoire d ’ i n s t r u c t i o n c o n t e n a n t l e programme −− de m u l t i p l i c a t i o n PROCESS ( cs , oe , adr ) BEGIN IF ( c s = ’ 1 ’ AND oe = ’ 1 ’ ) THEN data <= memoirei (CONV INTEGER( adr ) ) ; ELSE −− i n a c t i v e = > ’Z ’ en s o r t i e data <= (OTHERS = > ’Z ’ ) ; END IF ; END PROCESS; END synth ; 21 Rapport : Processeur MIPS – BB Listing 9: mux 2 synth.vhd 1 2 4 5 6 7 8 9 10 11 13 14 16 17 18 19 21 22 23 24 25 26 27 28 30 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY mux 2 IS PORT( e0 : IN e1 : IN o : OUT s e l : IN ); END mux 2 ; std std std std l o g i c v e c t o r ( 3 1 downto 0 ) ; l o g i c v e c t o r ( 3 1 downto 0 ) ; l o g i c v e c t o r ( 3 1 downto 0 ) ; logic ARCHITECTURE synth OF mux 2 IS BEGIN −− −− −− −− M u l t i p l e x e u r 2 e n t r é e s de 3 2 b i t s avec 1 b i t de c o n t r ô l e . S i l e s i g n a l ‘ s e l ’ d i f f è r e de ‘ 0 ’ ou de ‘ 1 ’ , e n v o i de ‘U’ en s o r t i e PROCESS ( e0 , e1 , s e l ) BEGIN CASE s e l IS WHEN ’ 0 ’ => o <= e0 ; WHEN ’ 1 ’ => o <= e1 ; WHEN OTHERS => o <= (OTHERS = > ’U ’ ) ; END CASE; END PROCESS; END synth ; 22 Rapport : Processeur MIPS – BB Listing 10: or 2 synth.vhd 1 2 4 5 6 7 8 9 10 12 13 15 16 17 18 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY o r 2 PORT( In0 In1 Out0 ); END o r 2 ; IS : IN : IN : OUT std logic ; std logic ; std logic −− Simple o pé r a t i o n l o g i q u e (OU l o g i q u e ) −− u t i l i s a n t l a b i b l i o t h è q u e a r i t h m é t i q u e ARCHITECTURE synth OF o r 2 IS BEGIN Out0 <= In0 OR In1 ; END synth ; 23 Rapport : Processeur MIPS – BB Listing 11: pc synth.vhd 1 2 4 5 6 7 8 9 10 11 12 14 15 17 18 20 21 22 23 24 25 26 27 28 29 31 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY pc IS PORT( clk : a : q : we : reset : ); END pc ; IN IN OUT IN IN std std std std std logic logic logic logic logic ; v e c t o r ( 3 1 downto 0 ) ; v e c t o r ( 3 1 downto 0 ) ; ; ARCHITECTURE synth OF pc IS BEGIN −− R e g i s t r e PC 3 2 b i t s −− P r o c e s s u s Reset e t p r i n c i p a l PROCESS ( c l k , r e s e t ) BEGIN IF ( r e s e t = ’ 1 ’ ) THEN q <= (OTHERS = > ’ 0 ’ ) ; ELSIF ( c l k ’ e v e n t and c l k = ’ 1 ’ ) THEN IF ( we = ’ 1 ’ ) THEN q <= a ; END IF ; END IF ; END PROCESS; END synth ; 24 Rapport : Processeur MIPS – BB 25 Listing 12: reg 32 synth.vhd 1 2 4 5 6 7 8 9 10 12 13 14 16 17 19 20 21 22 23 24 26 28 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY r e g 3 2 IS PORT( c l k : IN a : IN q : OUT ); END r e g 3 2 ; std logic ; s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; s t d l o g i c v e c t o r ( 3 1 downto 0 ) ARCHITECTURE synth OF r e g 3 2 IS SIGNAL r e g s i g n a l : s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; BEGIN −− R e g i s t r e 3 2 b i t s s é q u e n t i e l −− sans s i g n a l Reset PROCESS ( c l k ) BEGIN IF ( c l k ’ e v e n t AND c l k = ’ 1 ’ ) THEN r e g s i g n a l <= a ; END IF ; END PROCESS; q <= r e g s i g n a l ; END synth ; Rapport : Processeur MIPS – BB 26 Listing 13: regfile 32 synth.vhd 1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 24 26 27 29 30 31 33 34 36 37 38 39 40 42 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; USE i e e e . s t d l o g i c u n s i g n e d . a l l ; ENTITY R e g F i l e PORT( clk aa ab aw a b WData RegWrite ); END R e g F i l e 3 2 3 2 IS : : : : : : : : IN IN IN IN OUT OUT IN IN std std std std std std std std logic logic logic logic logic logic logic logic ; vector vector vector vector vector vector ( 4 downto 0 ) ; ( 4 downto 0 ) ; ( 4 downto 0 ) ; ( 3 1 downto 0 ) ; ( 3 1 downto 0 ) ; ( 3 1 downto 0 ) ; ; ARCHITECTURE synth OF R e g F i l e 3 2 IS TYPE a d d r e s s t y p e i s array ( 3 1 downto 0 ) of s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; SIGNAL r f a d d r e s s : a d d r e s s t y p e ; BEGIN −− R e g i s t r e P r i n c i p a l PROCESS ( aa , ab , c l k , RegWrite , aw ) BEGIN −− S o r t i e s c o n s t a n t e s a <= r f a d d r e s s (CONV INTEGER ( aa ) ) ; b <= r f a d d r e s s (CONV INTEGER ( ab ) ) ; −− E c r i t u r e s é q u e n t i e l l e IF ( c l k ’ e v e n t AND c l k = ’ 1 ’ ) THEN −− Adresse ‘ ‘ 0 0 0 ’ ’ i n t e r d i t e IF ( RegWrite = ’ 1 ’ AND aw /= ” 000 ” ) THEN r f a d d r e s s (CONV INTEGER ( aw)) <= WData ; END IF ; END IF ; END PROCESS; Rapport : Processeur MIPS – BB 44 45 47 −− R e g i s t r e z e r o r f a d d r e s s (0) <= ( others = > ’ 0 ’ ) ; END synth ; 27 Rapport : Processeur MIPS – BB Listing 14: shiftleft2 synth.vhd 1 2 4 5 6 7 8 9 11 12 14 15 17 19 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY s h i f t l e f t 2 IS PORT( e n t r e e : IN s t d l o g i c v e c t o r ( 3 1 downto 0 ) ; s o r t i e : OUT s t d l o g i c v e c t o r ( 3 1 downto 0 ) ); END s h i f t l e f t 2 ; ARCHITECTURE synth OF s h i f t l e f t 2 IS BEGIN −− Décalage v e r s l a gauche de 2 b i t s −− en a j o u t a n t d e s ’ 0 ’ s o r t i e <= e n t r e e ( 2 9 downto 0 ) & ” 00 ” ; END synth ; 28 Rapport : Processeur MIPS – BB Listing 15: signextend synth.vhd 1 2 4 5 6 7 8 9 11 12 14 16 18 LIBRARY i e e e ; USE i e e e . s t d l o g i c 1 1 6 4 . a l l ; ENTITY SignExtend IS PORT( e n t r e e : IN s t d l o g i c v e c t o r ( 1 5 downto 0 ) ; s o r t i e : OUT s t d l o g i c v e c t o r ( 3 1 downto 0 ) ); END SignExtend ; ARCHITECTURE synth OF SignExtend IS BEGIN −− E x t e n s i o n du b i t 1 5 aux b i t s 31 −16 de l ’ e n t ré e s o r t i e <= (31 downto 16 = > e n t r e e ( 1 5 ) ) & e n t r e e ; END synth ; 29