La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Cours #9 Conception et réalisation de processeurs à usage général

Présentations similaires


Présentation au sujet: "Cours #9 Conception et réalisation de processeurs à usage général"— Transcription de la présentation:

1 Cours #9 Conception et réalisation de processeurs à usage général

2 Plan pour aujourd’hui Mise en contexte
Retour sur les processeurs à usage spécifique Processeurs à usage général: introduction Chemin des données Unité de contrôle + Des précisions sur les notes de cours, des exemples et une parenthèse sur VHDL!

3 La machine distributrice
Comment réaliser ce processeur? Concevoir un processeur à usage spécifique? Utiliser un processeur à usage général?

4 Deux types de processeurs
(notes, section 5.1) Deux types de processeurs Un processeur est un type spécial de système numérique dont le but est de traiter des données par une succession d’étapes simples, pouvant résulter en un traitement global complexe. Un processeur doit acquérir des données, les traiter, et produire un résultat sous forme numérique ou vidéo. On distingue deux types principaux de processeurs : Les processeurs à usage général peuvent être programmés. Le programme exécuté par un processeur est gardé en mémoire sous la forme d’une liste d’instructions. On réfère souvent à ce type de processeur par le nom de « microprocesseur ». Un microcontrôleur est un cas particulier d’un processeur à usage général. Un processeur spécialisé est un processeur à usage général auquel on a ajouté des instructions spéciales. Les processeurs à usage spécifique sont des processeurs non programmables qui sont conçus dans le but de répondre à un besoin unique. Ils sont plus simples et plus efficaces que les processeurs à usage général. Ils ne peuvent pas en général être facilement reprogrammés.

5 Parties d’un processeur
(notes, section 5.1) Parties d’un processeur Un processeur est composé de deux parties: Le chemin des données (datapath) traite les données. Il inclut: des registres; des unités fonctionnelles (comme une unité arithmétique et logique) un mécanisme de commutation pour transférer et manipuler les données. L’unité de contrôle (control unit) est responsable du séquençage des opérations à exécuter par le chemin de données selon des entrées externes et le résultat des opérations.

6 Plan pour aujourd’hui Mise en contexte
Retour sur les processeurs à usage spécifique Processeurs à usage général: introduction Chemin des données Unité de contrôle + Des précisions sur les notes de cours, des exemples et une parenthèse sur VHDL!

7 Exemple de processeur à usage spécifique: transmetteur RS-232
(notes, section 6.4) Exemple de processeur à usage spécifique: transmetteur RS-232 Le chemin des données ne contient que les registres nécessaires. La machine à états de l’unité de contrôle ne peut faire qu’une seule tâche.

8 Exemple de processeur à usage spécifique: joueur de Blackjack
(notes, section 6.7) Exemple de processeur à usage spécifique: joueur de Blackjack Le chemin des données ne contient que les registres nécessaires. La machine à états de l’unité de contrôle ne peut faire qu’une seule tâche.

9 Du processeur à usage spécifique au processeur à usage général
(notes, section 9.1) Du processeur à usage spécifique au processeur à usage général Pour changer la tâche d’un processeur à usage spécifique, il faut: ajouter les registres et structures de calculs nécessaires à son chemin des données; changer la machine à états de son unité de contrôle; et, changer les signaux de contrôle entre le chemin des données et l’unité de contrôle. Un processeur à usage général doit pouvoir effectuer n’importe quelle tâche qu’un processeur à usage spécifique, mais avec: un chemin des données fixe; une unité de contrôle fixe; et, des signaux de contrôle fixes. Un processeur à usage général doit pouvoir être programmé sans changer sa structure ni ses interconnexions. Pour effectuer une tâche différente, au lieu de changer la machine à états, on la traverse de différentes façons en fonction du programme entreposé en mémoire.

10 Plan pour aujourd’hui Mise en contexte
Retour sur les processeurs à usage spécifique Processeurs à usage général: introduction Chemin des données Unité de contrôle + Des précisions sur les notes de cours, des exemples et une parenthèse sur VHDL!

11 Processeurs à usage général
(notes, section 9.1) Processeurs à usage général Certains processeurs à usage général, comme les processeurs Core de Intel et les processeurs FX-8000 de AMD, sont destinés principalement au marché des stations de travail et des ordinateurs portables. Ces circuits sont d’une complexité inouïe et sont le résultat du travail de centaines d’ingénieurs-années. D’autres processeurs, comme les ARM, MIPS, Intel 8051 et TMS320 sont moins bien connus mais sont fréquemment utilisés dans des applications embarquées comme les dispositifs mobiles et le domaine de l’automobile. Les processeurs à usage général sont habituellement fabriqués à très, très grande échelle. Leurs coûts de développement faramineux peuvent donc être répartis sur un très grand nombre d’unités, rendant rentable leur production et mise en marché. Il est intéressant d’observer que le développement de chaque nouvelle génération de processeur se fait à l’aide de stations de travail équipées de processeurs de la génération précédente. En d’autres mots, sans la puissance de calcul des processeurs d’aujourd’hui, on serait incapable de concevoir les processeurs de demain.

12 (notes, section 9.1) Jeu d’instructions Le jeu d’instructions (Instruction Set Architecture – ISA) est la spécification de toutes les instructions pouvant être effectuées par le processeur, leur encodage numérique, et l’inventaire des ressources mises à la disponibilité des programmeurs (comme des registres, des piles, des coprocesseurs, etc.). Le jeu d’instructions est le contrat entre les concepteurs du processeur et les programmeurs. On peut catégoriser les jeux d’instructions selon plusieurs dimensions. Une dimension concerne la forme du chemin des données du processeur, selon qu’il contient ou non des registres et de la mémoire. Les processeurs de type registre-registre (register-register ou load-store) sont les plus populaires. Pour ce type de processeur, les opérations peuvent être effectuées uniquement sur des valeurs gardées dans des registres. Il est possible de transférer des données entre les registres et la mémoire. Aujourd’hui on considère des processeurs basés sur l’architecture Harvard, c'est-à-dire qui ont des mémoires séparées pour le programme et les données (contrairement à l’architecture Von Neumann). Voir:

13 Micro-opérations du chemin des données
(notes, section 9.1) Micro-opérations du chemin des données La grande taille du jeu d’instructions d’un processeur à usage général implique qu’il faut pouvoir supporter un grand nombre de micro-opérations. On peut classifier les micro-opérations en trois groupes : le chargement de données de l’extérieur ou une mémoire vers un bloc de registres; la transformation des données grâce à une unité arithmétique et logique; et, l’entreposage de données en mémoire ou leur transfert vers l’extérieur.

14 Exemple d’aujourd’hui Le processeur PolyRISC au complet
(pas dans les notes) Exemple d’aujourd’hui Le processeur PolyRISC au complet Inspiré du processeur MIPS: Patterson & Hennessy, Computer Organization and Design, 5th ed., Morgan Kaufmann, 2013.

15 Plan pour aujourd’hui Mise en contexte
Retour sur les processeurs à usage spécifique Processeurs à usage général: introduction Chemin des données Unité de contrôle + Des précisions sur les notes de cours, des exemples et une parenthèse sur VHDL!

16 Architecture d’un chemin des données
(notes, section 5.2) Architecture d’un chemin des données Un chemin des données a deux parties principales: un bloc de registres qui conserve les données à traiter et des résultats précédents, de façon à pouvoir combiner toutes ces valeurs dans de nouveaux calculs. des unités fonctionnelles pour effectuer des opérations sur les données conservées dans les registres. Des modules combinatoires permettent de choisir, router et contrôler le flot d’information entre les registres et les unités fonctionnelles. L’unité fonctionnelle peut parfois avoir un état entreposé dans des éléments à mémoire. Information sur un calcul précédent (p. ex. négatif, zéro, etc.). Pour effectuer un calcul sur plusieurs cycles. Pour garder en mémoire une valeur spéciale (p. ex. un accumulateur).

17 Architecture d’un chemin des données Exemple: processeur BlackFin
Le processeur Blackfin est un processeur à usage général, spécialisé pour le traitement du signal et d’images. Analog Devices, BlackFin Embedded Processor ADSP-BF534/ADSP-BF536/ADSP-BF537, 2009.

18 Exercices Donner la fonction logique pour les signaux de contrôle
Montrer la valeur des signaux de contrôle pour différentes instructions Donner un exemple de programme Compiler un programme

19 Chemin des données d’un processeur à usage général
(notes, section 9.2) Chemin des données d’un processeur à usage général

20 Effectuer des opérations
(notes, section 9.2.9) Effectuer des opérations Pour effectuer une instruction avec le chemin des données proposé, il s’agit de donner les bonnes valeurs aux différents signaux de contrôle. Supposons que le bloc des registres contienne quatre registres R0, R1, R2, R3 et que la mémoire contienne 256 cellules. Par exemple, pour copier le contenu du registre R1 dans le registre R0, il faut: aiguiller la valeur du registre R1 à l’extérieur du bloc des registres; indiquer à l’UAL de n’effectuer aucune opération; passer à travers du multiplexeur de sélection ALU vs mémoire; revenir à l’entrée du bloc des registres, et aiguiller cette valeur dans R0; le signal sur le port B du bloc des registres et de l’UAL n’est pas utilisé et est sans importance; la mémoire ne doit pas charger de nouvelle valeur pendant cette opération.

21 Effectuer l’opération R0 ← R1
(notes, section 9.2.9) Effectuer l’opération R0 ← R1 case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 R2 R3 1 1 - - -

22 Effectuer l’opération R2 ← R1 + R3
(notes, section 9.2.9) Effectuer l’opération R2 ← R1 + R3 case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 + R2 R3 2 1 2 1 3 -

23 Effectuer l’opération R2 ← R2 ET R3
(notes, section 9.2.9) Effectuer l’opération R2 ← R2 ET R3 case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 ET R2 R3 4 1 2 1 3 -

24 Effectuer l’opération R3 ← M[25]
(notes, section 9.2.9) Effectuer l’opération R3 ← M[25] case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 R2 R3 23 24 25 1 1 1 3 - - 25 1

25 Effectuer l’opération M[25] ← R0
(notes, section 9.2.9) Effectuer l’opération M[25] ← R0 case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 R2 R3 23 24 25 - 1 - - 1 25 1

26 Effectuer l’opération …
(notes, section 9.2.9) Effectuer l’opération … case op_UAL is when 0 => F_UAL := A; when 1 => F_UAL := B_UAL; when 2 => F_UAL := A + B_UAL; when 3 => F_UAL := A - B_UAL; when 4 => F_UAL := A and B_UAL; when 5 => F_UAL := A or B_UAL; when 6 => F_UAL := not(A); when 7 => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; R0 R1 R2 R3 23 24 25

27 Éléments à mémoire pour chemins des données Bloc de registres
(notes, section 9.2.3) Éléments à mémoire pour chemins des données Bloc de registres Un bloc de registre peut avoir plusieurs ports d’entrée et de sortie. Un registre peut à la fois être la cible d’une écriture et la source pour l’un des ports de sortie. Version coûteuse en multiplexeurs!

28 (notes, section 9.2.5) Éléments à mémoire pour chemins des données Bloc de registres: code VHDL -- signaux du bloc des registres type lesRegistres_type is array(0 to Nreg - 1) of signed(Wd - 1 downto 0); signal lesRegistres : lesRegistres_type; signal A, B : signed(Wd - 1 downto 0); signal choixA, choixB, choixCharge : integer range 0 to Nreg - 1; signal chargeBR : std_logic; -- dans le corps de l’architecture process (CLK, reset, choixA, choixB) begin if rising_edge(CLK) then if reset = '1' then lesRegistres <= (others => (others => '0')); else if chargeBR = '1' then -- MUX pour choixDonnee_BR if (instruction.categorie = memoire and instruction.details = 0) then lesRegistres(choixCharge) <= memoireDonnees(to_integer(F)); lesRegistres(choixCharge) <= F; end if; end process; A <= lesRegistres(choixA); B <= lesRegistres(choixB); Dans cette description du bloc des registres: le nombre de ports d’entrée est fixé à 1 le nombre de ports de sortie est fixé à 2 le nombre de registres est déterminé par le paramètre Nreg la largeur des registres est déterminée par le paramètre Wd

29 Unité arithmétique et logique
(notes, section 9.2.6) Unité arithmétique et logique -- dans la partie déclarative de l’architecture type operationsUAL_type is (passeA, passeB, AplusB, AmoinsB, AetB, AouB, nonA, AouxB); signal op_UAL : operationsUAL_type; signal F : signed(Wd - 1 downto 0); signal Z, N : std_logic; -- dans le corps de l’architecture process(A, B, instruction) variable B_UAL, F_UAL : signed(Wd - 1 downto 0); begin if instruction.categorie = reg then -- MUX choixB_UAL B_UAL := B; else B_UAL := to_signed(instruction.valeur, B_UAL'length); end if; -- op_UAL case operationsUAL_type'val(instruction.details) is when passeA => F_UAL := A; when passeB => F_UAL := B_UAL; when AplusB => F_UAL := A + B_UAL; when AmoinsB => F_UAL := A - B_UAL; when AetB => F_UAL := A and B_UAL; when AouB => F_UAL := A or B_UAL; when nonA => F_UAL := not(A); when AouxB => F_UAL := A xor B_UAL; when others => F_UAL := (others => 'X'); end case; Dans cette description de l’UAL: les opérations sont fixes l’encodage est déterminé par l’ordre de la définition du type la largeur de l’UAL est déterminée par le paramètre Wd if F_UAL = 0 then Z <= '1'; else Z <= '0'; end if; N <= F_UAL(F_UAL'left); F <= F_UAL; end process;

30 (notes, section 9.2.6) UAL - suite Deux bits, Z et N, indiquent respectivement un résultat nul ou négatif. Ces bits sont utilisés pour les branchements. La complexité de l’UAL est une fonction de sa largeur et du nombre d’opérations qu’elle doit supporter.

31 (notes, section 9.2.7) Mémoire des données En théorie, un processeur avec un bloc des registres suffisamment grand n’aurait pas besoin d’une mémoire des données associée. C’est souvent le cas pour les processeurs spécialisés. En pratique cependant, un processeur à usage général a toujours besoin d’une telle mémoire. Pour la plupart des processeurs, la mémoire des données est placée à l’extérieur de celui-ci. La mémoire des données a en général un port de sortie, un port d’entrée, un port d’adresse et un port de contrôle de l’opération. La mémoire peut avoir plusieurs ports d’entrée et de sortie. En général, il est utile que les cellules de la mémoire aient est la même taille que celles du bloc des registres, mais ce n’est pas strictement nécessaire. Le port d’adresse spécifie une cellule de la mémoire en particulier. Le signal charge_MD détermine si la cellule sera lue (0) ou écrite (1).

32 Mémoire des données en VHDL
(notes, section 9.2.7) Mémoire des données en VHDL Une mémoire vive peut être vue comme un bloc de registres de très grande taille, avec: un (parfois deux) port de sortie un (parfois deux) port d’entrée un (parfois deux) port d’adresse un port de contrôle de l’opération. La description d’une mémoire des données en VHDL peut prendre plusieurs formes, selon une multitude de paramètres. Ceux-ci incluent, entre autres : le nombre de ports d’entrée et de sortie; le fait que les sorties soient synchrones ou asynchrones; le nombre de cycles nécessaires à la mémoire pour déplacer des données; la présence de signaux d’activation; et, la spécification de valeurs initiales. Il faut consulter la documentation du synthétiseur pour adopter le bon patron de code VHDL correspondant aux paramètres de la mémoire RAM désirée.

33 Mémoire des données en VHDL
(notes, section 9.2.7) Mémoire des données en VHDL -- dans la partie déclarative de l’architecture type memoireDonnees_type is array(0 to 2 ** Md - 1) of signed(Wd - 1 downto 0); signal memoireDonnees : memoireDonnees_type := (to_signed(99, Wd), to_signed(33, Wd), others => to_signed(31, Wd)); signal charge_MD : std_logic; process (CLK, F) begin if rising_edge(CLK) then if (instruction.categorie = memoire and instruction.details = 0) then memoireDonnees(to_integer(B)) <= F; end if; end process; Important: pas de signal de réinitialisation dans le modèle, ce qui empêcherait le synthétiseur d’utiliser la mémoire distribuée. Dans cette description de la mémoire: le nombre de mots est déterminée par le paramètre Md la taille des mots est déterminée par le paramètre Wd habituellement, la lecture d’une donnée nécessite un cycle d’horloge pour charger l’adresse, ce n’est pas modélisé ici

34 Comment se synthétise la mémoire dans un FPGA?
(notes, section 3.5.5) Comment se synthétise la mémoire dans un FPGA? Colonnes de blocs de mémoire intégrées à travers les CLBs. (Xilinx: Block RAM) LUTs des CLBs (Xilinx: Distributed RAM) Le choix peut être contrôlé par les paramètres du synthétiseur – démo à partir d’Active-HDL. Source: Maxfield, © Mentor Graphics, 2004

35 Plan pour aujourd’hui Mise en contexte
Retour sur les processeurs à usage spécifique Processeurs à usage général: introduction Chemin des données Unité de contrôle + Des précisions sur les notes de cours, des exemples et une parenthèse sur VHDL!

36 Unité de contrôle du processeur à usage général
(notes, section 9.3) Unité de contrôle du processeur à usage général L’unité de contrôle dirige le chemin des données. L’unité de contrôle est composée des composantes suivantes : un compteur de programme (Program Counter – PC) qui pointe à la prochaine instruction à exécuter; une mémoire des instructions contenant le programme à exécuter; un module pour décoder l’instruction à exécuter, c’est-à-dire de dériver les signaux de contrôle du chemin des données à partir de l’instruction; un module pour déterminer si un branchement a lieu ou non; deux additionneurs pour calculer l’adresse de la prochaine instruction.

37 Unité de contrôle du processeur à usage général
(notes, section 9.3) Unité de contrôle du processeur à usage général

38 Choix d’approche pour l’encodage des instructions
(pas dans les notes) Choix d’approche pour l’encodage des instructions Le code d’une instruction doit permettre de spécifier sans ambiguïté tous les signaux de contrôle du chemin des données. Il y a trois grandes approches: CISC, RISC et NISC Nous choisissons l’approche RISC. Les signaux de contrôle du chemin des données sont encodés, ce qui réduit la taille du programme. La spécification du processeur monte alors au niveau du jeu d’instructions. L’implémentation peut être différente pour deux processeurs qui ont le même comportement. NISC Technology and Toolset, University of California Irvine, [en ligne: consulté le 2009/11/11

39 Encodage des instructions en mémoire (1)
(notes, section 9.3.3) Encodage des instructions en mémoire (1) Considération pour le format des instructions et de leur encodage en mémoire C’est un problème à plusieurs solutions possibles. On favorise la régularité, ce qui simplifie le décodage et accélère le processeur. L’encodage, le jeux d’instructions et les modes d’adressage sont intimement liés. Choix effectués ici: Encodage sur un seul mot de 32 bits: chaque instruction s’exécute en un seul cycle. Le mot d’instruction est divisé en 6 champs. Modes d’adressage limités conformément à la philosophie RISC. Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 RC := RA ◊ RB 00 code de ◊ RC RA - RB RC := RA ◊ valeur 01 valeur(15:0) si (RA ◊ RB) goto (CP + valeur) 10 RC := MD[RA + valeur] 11 0000 MD[RA + valeur] := RB 0001 Inspiré du processeur MIPS: Patterson & Hennessy, Computer Organization and Design, 5th ed., Morgan Kaufmann, 2013.

40 Encodage des instructions en mémoire (2)
(notes, section 9.3.3) Encodage des instructions en mémoire (2) Catégorie 0: opération sur les registres Le processeur a 32 registres d’au moins 16 bits de large. Avec 4 bits pour les détails, l’UAL pourrait effectuer 16 opérations différentes, dont: A, B, A + B, A – B, A ET B, A OU B, NON(A), A OUX B A(15:0) × B(15:0), décaleG(A, B), décaleD(A, B) Etc. Les bits 15:5 de l’instruction pourraient servir à définir: des opérations supplémentaires aux 16 de base; et/ou des opérations sur plus de deux registres à la fois. Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 RC := RA ◊ RB 00 code de ◊ RC RA - RB RC := RA ◊ valeur 01 valeur(15:0) si (RA ◊ RB) goto (CP + valeur) 10 RC := MD[RA + valeur] 11 0000 MD[RA + valeur] := RB 0001

41 Encodage des instructions en mémoire (3)
(notes, section 9.3.3) Encodage des instructions en mémoire (3) Catégorie 1: opération sur un registre et une valeur codée dans l’instruction Les bits 15:0 de l’instruction contiennent la valeur à utiliser. Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 RC := RA ◊ RB 00 code de ◊ RC RA - RB RC := RA ◊ valeur 01 valeur(15:0) si (RA ◊ RB) goto (CP + valeur) 10 RC := MD[RA + valeur] 11 0000 MD[RA + valeur] := RB 0001

42 Encodage des instructions en mémoire (4)
(notes, section 9.3.3) Encodage des instructions en mémoire (4) Catégorie 2: branchement Il y a 16 conditions de branchement possibles. En pratique 8 suffisent. =, ≠, <, >, ≤, ≥, toujours (sans condition), jamais (ne pas brancher = NOP) Les branchements sont limités à ±215 adresses par rapport au CP. La valeur encodée dans l’instruction est étendue sur 16 bits et est ajoutée à la valeur incrémentée du CP. Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 RC := RA ◊ RB 00 code de ◊ RC RA - RB RC := RA ◊ valeur 01 valeur(15:0) si (RA ◊ RB) goto (CP + valeur) 10 RC := MD[RA + valeur] 11 0000 MD[RA + valeur] := RB 0001

43 Unité de branchement (notes, section 9.3)
-- signaux de l'unité de branchement type conditionBranchement_type is (egal, diff, ppq, pgq, ppe, pge, oui, non); signal brancher : std_logic; signal condition : conditionBranchement_type; -- unité de branchement process(Z, N, instruction) begin case conditionBranchement_type'val(instruction.details mod 8) is when egal => brancher <= Z; when diff => brancher <= not(Z); when ppq => brancher <= N; when pgq => brancher <= not(N); when ppe => brancher <= N or Z; when pge => brancher <= not(N) or Z; when oui => brancher <= '1'; when non => brancher <= '0'; end case; end process;

44 Compteur de programme (notes, section 9.3)
signal CP : integer range 0 to (2 ** Mi - 1); -- le compteur de programme process (CLK, reset) begin if rising_edge(CLK) then if reset = '1' then CP <= 0; else if instruction.categorie = branche and brancher = '1' then CP <= CP + instruction.valeur; CP <= CP + 1; end if; end process;

45 Encodage des instructions en mémoire (5)
(notes, section 9.3.3) Encodage des instructions en mémoire (5) Catégorie 3: chargement mémoire (Load-Store) L’adresse effective est composée de la somme d’un registre et d’une valeur de déplacement. Ceci facilite l’accès aux éléments d’un tableau. La mémoire des données peut avoir jusqu’à 232 mots de 32 bits (16 Go). Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 RC := RA ◊ RB 00 code de ◊ RC RA - RB RC := RA ◊ valeur 01 valeur(15:0) si (RA ◊ RB) goto (CP + valeur) 10 RC := MD[RA + valeur] 11 0000 MD[RA + valeur] := RB 0001

46 Exemples d’encodage d’instructions
(notes, section 9.3.3) Exemples d’encodage d’instructions Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 R7 := R5 + R2 R9 := R0 – R11 R8 := R4 Si R8 = R9, goto PC + 25 R12 := MD[240] MD[28] := R10 R14 := MD[R7 + 4] R31 := R0 ET 0xFF

47 Exemple de programme Adresse Instruction bits 31-30 catégorie
(notes, section 9.4) Exemple de programme Adresse Instruction bits 31-30 catégorie bits 29:26 détails bits 25:21 bits 20:16 bits 15:5 bits 4:0 R0 := M[0] 1 R1 := M[1] 2 Si R0 > R1, goto 5 3 R12 := R1 – R0 4 goto 6 5 R12 := R0 – R1 6 M[3] := R12 7 Goto 7

48 Exercice de programmation
(notes, section 9.6) Exercice de programmation Donnez les instructions et les codes numériques d’un programme qui calcule la moyenne de 8 valeurs gardées en mémoire dans des cellules contigües à partir de l’adresse 0.

49 Exercice de programmation
(notes, section 9.6) Exercice de programmation Donnez les instructions et les codes numériques d’un programme qui multiplie deux nombres non signés de 8 bits.

50 Mémoire des instructions en VHDL
(notes, section 9.3.4) Mémoire des instructions en VHDL Une instruction est défini comme une structure à 5 champs. La mémoire des instructions est définie dans la partie déclarative de l’architecture comme un tableau constant dans lequel on place les valeurs des instructions du programme. type instructionsCat_type is (reg, reg_valeur, branche, memoire); type instruction_type is record categorie : instructionsCat_type; details : natural range 0 to 15; reg1 : natural range 0 to Nreg - 1; reg2 : natural range 0 to Nreg - 1; valeur : integer range -2 ** (WImm - 1) to 2 ** (WImm - 1) - 1; end record; constant NOP : instruction_type := (branche, 7, 0, 0, 0); type memoireInstructions_type is array (0 to 2 ** Mi - 1) of instruction_type; constant memoireInstructions : memoireInstructions_type := ( (reg_valeur, operationsUAL_type'pos(passeB), 0, 0, 12), -- R0 := 12; (reg_valeur, operationsUAL_type'pos(passeB), 1, 0 , 7), -- R1 := 7; (reg, operationsUAL_type'pos(AplusB), 0, 0 , 1), -- R0 := R0 + R1; (reg, operationsUAL_type'pos(AouxB), 1, 0 , 1), -- R1 := R0 OUX R1; (reg_valeur, operationsUAL_type'pos(AplusB), 1, 1, -3), -- R1 := R1 + 1; (branche, conditionBranchement_type'pos(oui), 0, 0 , -1), -- goto loop; others => NOP);

51 Le problème du logiciel
(notes, section 9.4) Le problème du logiciel L’écriture directe d’un programme en codes de 32 bits est ardue. Pour simplifier la tâche, on peut un assembleur qui donne automatiquement les codes numériques des instructions à partir de leur représentation symbolique. Pour les programmes très complexes, cependant, on utilise plutôt un compilateur qui accepte en entrée un programme dans un langage de haut niveau comme C ou Python et qui produit les codes des instructions. Le compilateur doit s’appuyer sur une connaissance approfondie des instructions pouvant être réalisées par le processeur ainsi que des architectures de son chemin des données et de son unité de contrôle. Un simulateur et un débogueur seraient bien aussi … 

52 Un processeur pipeliné
(notes, section 9.5) Un processeur pipeliné Le processeur montré ici exécute une instruction par cycle. Le chemin critique est: CP → MI → Décodage → BR → UAL → MD → BR Tous les processeurs modernes décomposent le chemin critique à l’aide de la technique du pipeline.

53 Résumé: processeur à usage général
Notions à retenir et maîtriser Importance relative 1. Expliquer les différences et les forces relatives entre un processeur à usage spécifique et un processeur à usage général. 10 2. Chemin des données d’un processeur à usage général: Donner un diagramme montrant les composantes, connexions et signaux de contrôle Montrer comment aiguiller les signaux pour effectuer des opérations Donner le code VHDL pour le bloc des registres, l’UAL et la mémoire des données 35 3. Unité de contrôle d’un processeur à usage général: Donner un diagramme montrant les composantes et leurs connexions Expliquer comment effectuer l’encodage et le décodage des instructions Interpréter et écrire des programmes simples pour le processeur Donner le code VHDL pour le compteur de programme, la mémoire des instructions et l’unité de branchement 4. Expliquer comment modifier le processeur pour lui ajouter des instructions: Expliquer les modifications au chemin des données Expliquer les modifications à l’unité de contrôle Expliquer les modifications à l’encodage des instructions 20 Total 100


Télécharger ppt "Cours #9 Conception et réalisation de processeurs à usage général"

Présentations similaires


Annonces Google