Exemple: Un processeur 8 bits Eduardo Sanchez Laboratoire de Systèmes Logiques Ecole Polytechnique Fédérale de Lausanne Les processeurs u Deux éléments sont nécessaires pour réaliser un traitement d’information: • un algorithme (séquence d’opérations) • les ressources pour exécuter l’algorithme (éléments de stockage et de traitement) u On appelle processeur l’ensemble de ressources matérielles nécessaires à l’exécution d’un algorithme de traitement d’information Page 2 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne u Un processeur peut toujours être décomposé en deux parties: • l’unité de contrôle (séquencement de l’algorithme) • l’unité de traitement (élément de stockage et de traitement) entrées de contrôle CK entrées de données signaux de contrôle unité de contrôle signaux de status sorties de contrôle Page 3 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne unité de traitement sorties de données u A chaque coup d’horloge, l’unité de contrôle doit générer tous les bits qui contrôlent les ressources de l’unité de traitement (signaux de contrôle): l’unité de contrôle est une machine séquentielle u L’ensemble de signaux de contrôle générés par cycle d’horloge est une microinstruction du processeur entrées de contrôle signaux de contrôle système logique combinatoire CK Page 4 signaux de status b a s c u l e s Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne u Le système logique combinatoire de l’unité de contrôle peut être réalisé de façon câblée ou programmée: on parle alors d’unité de contrôle câblée ou microprogrammée. Une unité de contrôle cablée est plus rapide que son équivalente microprogramée, ainsi que plus petite en surface de circuit intégré. Toutefois, une unité microprogrammée demande une conception plus simple et c’est plus facile à corriger et à modifier. Page 5 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Exemple de processeur u Concevoir un processeur capable de compter le nombre de 1 présent dans un mot d’entrée (32 bits) u Un algorithme possible est: data := inport ocount := 0 mask := 1 while data ≠ 0 repeat temp := data and mask ocount := ocount + temp data := data >> 1 end while outport := ocount Page 6 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne u De l’analyse de l’algorithme découle la structure globale de l’unité de traitement: • il y a 4 variables (data, mask, ocount, temp): il faut donc 4 éléments de stockage (registres) • la seule entrée de données est formée par les 32 bits de inport • la sortie de données est formée par les 6 bits de outport • les opérations nécessaires sont: addition, and, décalage à droite, chargement d’un registre avec une constante ou avec un autre registre, comparaison avec 0 • le seul signal de status à envoyer vers l’unité de contrôle est le résultat de la comparaison data≠0 u L’unité de contrôle aura une entrée de contrôle, start, pour indiquer le début de l’opération, et une sortie de contrôle, done, pour en indiquer la fin Page 7 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne start inport reset 32 signaux de contrôle 20 système logique combinatoire CK data≠0 b a s c u l e s data ocount mask temp and + shifter comparateur 6 done Page 8 outport Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Processeurs à plusieurs niveaux de langage u Si l’on veut avoir un processeur non spécialisé, capable d’exécuter plusieurs tâches, à volonté de l’utilisateur, il faut un processeur avec un répertoire d’instructions. Chaque instruction réalise un certain traitement sur les données et il est possible de programmer l’algorithme à l’aide d’une suite d’instructions u Chaque instruction est donc une tâche simple, réalisée comme une suite de micro-instructions u Le répertoire d’instructions constitue le langage machine du processeur ou langage d’assemblage Page 9 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne u Pour faciliter l’écriture du programme, il est possible d’utiliser d’autres langages, à un plus grand niveau d’abstraction que le langage machine: ce sont les langages de haut niveau, tels que Pascal, C, etc u Le programme écrit dans un langage de haut niveau est traduit en langage machine par un programme appelé compilateur u Le programme en langage machine est stocké dans la mémoire de l’ordinateur et le processeur exécute (interprète) chaque instruction comme une suite de micro-instructions. Le nombre de micro-instructions par instruction est variable, selon la complexité de l’instruction Page 10 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Page 11 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne contrôle microprogramme INTERPRETEUR MOVE.L MOVE.L MOVE.L START: ABCD MOVE.B TEST: CMPA BNE traitement • • #2001,A0 #3001,A1 #4000,A2 -(A0),-(A1) (A1),(A2) #1001,A0 START • • COMPILATEUR begin • • for i:=1 to 1000 do C[i] := A[i] + B[i]; • • end. processeur mémoire var A,B,C : array[1..1000] of integer; i : integer; program toto; u Le processeur effectue sans arrêt une boucle composée de trois phases: • recherche (fetch) de l’instruction: l’adresse en mémoire de l’instruction à exécuter est stockée en permanence dans un registre du processeur, appelé PC (Program Counter). L’instruction pointée par le PC est cherchée dans la mémoire et stockée dans un autre registre du processeur: le IR (Instruction Register) • décodage de l’instruction (decode): chaque instruction est identifiée, grâce à un code (opcode). En fonction de ce code, le processeur choisit la tâche à exécuter, c’est-à-dire la séquence de micro-instructions à exécuter • exécution (execute) de l’instruction: à la fin de cette phase, on retourne à la première phase Page 12 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne initialisation initialisation lecture lecture de de l’instruction l’instruction décodage décodage ADD ADD Page 13 MOVE MOVE ••••• Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne LOAD LOAD STORE STORE Structure d’un ordinateur processeur contrôle traitement séquenceur séquenceur registres registres mémoire micromémoire micromémoire entrées/sorties opérateurs opérateurs bus d’adresse bus de données bus de contrôle Page 14 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne PC PC ← ← adresse adresse initiale initiale MAR MAR ← ← PC PC MDR MDR ← ← M[PC] M[PC] PC PC ← ← PC+1 PC+1 IR IR ← ← MDR MDR décodification décodification de de IR IR opérande opérande chercher chercher l’opérande l’opérande exécuter exécuter Page 15 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Exemple de processeur: structure générale reset processeur mémoire mémoire de de données données mémoire mémoire d’instructions d’instructions CLK 8 16 11 Page 16 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne 16 bus de données bus d’adresse bus de contrôle Bus de contrôle mémoire mémoire de de données données mémoire mémoire d’instructions d’instructions ADR MEMI CE R/W ADR DATA 16 MEMD CE R/W DATA RWM 8 RWM bus d’adresse bus de données bus de contrôle Page 17 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Répertoire d’instructions Rd,adr Rd ← M[adr] STORE adr,Rs M[adr] ← Rs MOVE Rd,Rs Rd ← Rs SUB Rd,Rs1,Rs2 Rd ← Rs1 - Rs2 ADD Rd,Rs1,Rs2 Rd ← Rs1 + Rs2 CMP Rs1,Rs2 flag ← Rs1 - Rs2 BR offset if flag then PC ← PC + offset JMP offset PC ← PC + offset LOAD Page 18 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Format des instructions 15 LOAD Rd,adr 0 0 15 STORE adr,Rs 0 0 15 MOVE Rd,Rs 0 1 15 SUB Rd,Rs1,Rs2 0 1 15 ADD Rd,Rs1,Rs2 1 0 15 CMP Rs1,Rs2 1 0 15 BR offset 1 1 15 JMP Page 19 offset 1 1 13 12 11 0 Rd 13 12 11 1 Rs 13 12 11 0 Rd 13 12 11 1 Rd 13 12 11 0 Rd 13 12 11 1 Ø 13 12 11 0 Ø 13 12 11 1 Ø 10 0 adr 10 0 adr 10 9 8 0 Rs 10 Ø 9 Rs1 10 9 Rs1 10 9 Rs1 8 7 6 Rs2 8 7 Ø 6 Rs2 8 7 0 0 Ø 6 0 Ø Rs2 10 0 offset 10 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne 0 offset reset IR ← M[PC] PC ← PC+1 decode if flag then PC ← PC+IR[10..0] R[IR[12..11]] ← M[IR[10..0]] PC ← PC+IR[10..0] M[IR[10..0]] ← R[IR[12..11]] R[IR[12..11]] ← R[IR[10..9]] flag ← R[IR[10..9]]-R[IR[8..7]] Page 20 R[IR[12..11]] ← R[IR[10..9]]-R[IR[8..7]] R[IR[12..11]] ← R[IR[10..9]]+R[IR[8..7]] Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Structure du processeur reset CLK unité de contrôle unité de traitement 16 Page 21 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne 11 bus de données bus d’adresse bus de contrôle Unité de traitement bus de données [7..0] [7..0] OEALU 1 IR[10..0] 0 0 AW AA AB R/W CLK IR[12..11] IR[8..7] RWREG CLK + registres registres LDPC RESET 0 1 IR[10..9] OPALU SELAA IR IR LDIR ALU 1 CLK OPCODE (IR[15..13]) INALU ff ll aa gg CLK LDFLAG FLAG OEPC bus d’adresse Page 22 PC PC B 0 IR[12..11] SELPC INREG 1 A 0 1 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne IR[10..0] OEIR IR ← M[PC] bus de données LDPC PC PC RESET IR IR CLK OEPC bus d’adresse Page 23 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne LDIR PC ← PC + 1 bus de données 1 + LDPC PC PC RESET IR IR CLK OEPC bus d’adresse Page 24 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne LDIR DECODE bus de données 1 + LDPC PC PC RESET IR IR LDIR CLK OPCODE (IR[15..13]) OEPC bus d’adresse Page 25 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne LOAD bus de données [7..0] 1 IR[12..11] IR[8..7] RWREG CLK AW AA AB registros registros LOAD CLK A B + LDPC PC PC RESET IR IR LDIR CLK OPCODE (IR[15..13]) IR[10..0] OEPC bus d’adresse Page 26 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne OEIR STORE bus de données [7..0] [7..0] 1 IR[12..11] IR[8..7] RWREG CLK AW AA AB registros registros LOAD CLK A B + LDPC PC PC RESET IR IR LDIR CLK OPCODE (IR[15..13]) IR[10..0] OEPC bus d’adresse Page 27 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne OEIR MOVE bus de données [7..0] [7..0] OEALU 1 0 IR[12..11] IR[8..7] RWREG CLK 1 AW AA AB registros registros LOAD CLK A B INREG + LDPC PC PC RESET IR IR LDIR CLK OPCODE (IR[15..13]) IR[10..0] OEPC bus d’adresse Page 28 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne OEIR Unité de contrôle reset RWM MEMI MEMD CLK Page 29 unité de contrôle RWREG SELAA INREG OPALU INALU OEALU LDFLAG LDPC SELPC OEIR LDIR OEPC FLAG OPCODE Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne unité de traitement library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; package procpack is ------------------component controleur port (clk, reset : in std_logic; flag : in std_logic; opcode : in std_logic_vector(2 downto 0); rwm, memi, memd : out std_logic; rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc : out std_logic); end component; component traitement port (clk, reset : in std_logic; rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc : in std_logic; flag : out std_logic; opcode : out std_logic_vector(2 downto 0); busadresse : out std_logic_vector(10 downto 0); busdonnees : inout std_logic_vector(15 downto 0)); end component; Page 30 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne component registres port (clk : in std_logic; entreebus, entreealu : in std_logic_vector(7 downto 0); a, b : out std_logic_vector(7 downto 0); aw, aa, ab : in std_logic_vector(1 downto 0); inreg, rw, selaa : in std_logic); end component; component pc port (clk, reset : in std_logic; ldpc, selpc : in std_logic; entreepc : in std_logic_vector(10 downto 0); sortiepc : out std_logic_vector(10 downto 0)); end component; component ir port (clk : in std_logic; ldir : in std_logic; entreeir : in std_logic_vector(15 downto 0); sortieir : out std_logic_vector(15 downto 0)); end component; Page 31 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne component alu port (clk : in std_logic; inalu, opalu, ldflag : in std_logic; flag : out std_logic; entreea, entreeb : in std_logic_vector(7 downto 0); resultat : out std_logic_vector(7 downto 0)); end component; component memdata port (adr : in std_logic_vector(10 downto 0); data : inout std_logic_vector(7 downto 0); ce, rw : in std_logic); end component; component meminstr port (adr : in std_logic_vector(10 downto 0); data : inout std_logic_vector(15 downto 0); ce, rw : in std_logic); end component; end procpack; Page 32 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use work.procpack.all; entity traitement is -------------------port (clk, reset : in std_logic; rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc : in std_logic; flag : out std_logic; opcode : out std_logic_vector(2 downto 0); busadresse : out std_logic_vector(10 downto 0); busdonnees : inout std_logic_vector(15 downto 0)); end traitement; Page 33 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne architecture synt of traitement is ---------------------------------signal signal signal signal sortieir : std_logic_vector(15 downto 0); sortiepc : std_logic_vector(10 downto 0); resultatalu : std_logic_vector(7 downto 0); rega, regb : std_logic_vector(7 downto 0); begin a: registres port map (clk, busdonnees(7 downto 0), resultatalu, rega, regb, sortieir(12 downto 11), sortieir(10 downto 9), sortieir(8 downto 7), inreg, rwreg, selaa); b: alu port map (clk, inalu, opalu, ldflag, flag, rega, regb, resultatalu); c: pc port map (clk, reset, ldpc, selpc, sortieir(10 downto 0), sortiepc); d: ir port map (clk, ldir, busdonnees, sortieir); opcode <= sortieir(15 downto 13); busadresse <= sortieir(10 downto 0) when oeir='1' else sortiepc when oepc='1' else (others => 'Z'); busdonnees <= ("00000000" & resultatalu) when oealu='1' else (others => 'Z'); end synt; Page 34 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use work.procpack.all; entity processeur is -------------------port (clk, reset : in std_logic; busadresse : out std_logic_vector(10 downto 0); busdonnees : inout std_logic_vector(15 downto 0); rwm, memi, memd : out std_logic); end processeur; architecture synt of processeur is ---------------------------------signal rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc, flag : std_logic; signal opcode : std_logic_vector(2 downto 0); begin a: controleur port map (clk, reset, flag, opcode, rwm, memi, memd, rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc); b: traitement port map (clk, reset, rwreg, selaa, inreg, opalu, inalu, oealu, ldflag, ldpc, selpc, oeir, ldir, oepc, flag, opcode, busadresse, busdonnees); end synt; Page 35 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use work.procpack.all; entity systeme is ----------------port (clk, reset busadresse busdonnees rwm, memi, end systeme; Page 36 : in std_logic; : out std_logic_vector(10 downto 0); : inout std_logic_vector(15 downto 0); memd : out std_logic); Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne architecture synt of systeme is ------------------------------signal ba : std_logic_vector(10 downto 0); signal rw, mi, md : std_logic; component processeur port (clk, reset : in std_logic; busadresse : out std_logic_vector(10 downto 0); busdonnees : inout std_logic_vector(15 downto 0); rwm, memi, memd : out std_logic); end component; begin a: processeur port map (clk, reset, ba, busdonnees, rw, mi, md); b: memdata port map (ba, busdonnees(7 downto 0), md, rw); c: meminstr port map (ba, busdonnees, mi, rw); busadresse <= ba; rwm <= rw; memi <= mi; memd <= md; end synt; Page 37 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne Programme de test mémoire d’instructions: LOAD LOAD ADD SUB SUB L1: SUB CMP BRANCH JMP L2: JMP R0,M[0] R1,M[1] R2,R0,R1 R3,R0,R1 R0,R0,R0 R2,R2,R3 R2,R0 L2 L1 L2 mémoire de données: 000 04 001 03 Page 38 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne 000 001 002 003 004 005 006 007 008 009 0000 0801 9080 7880 6000 7580 A400 C001 E7FC E7FF architecture synt of meminstr is -------------------------------type memitype is array(31 downto 0) of std_logic_vector(15 downto 0); signal memoirei : memitype := (0 => "0000000000000000", 1 => "0000100000000001", 2 => "1001000010000000", 3 => "0111100010000000", 4 => "0110000000000000", 5 => "0111010110000000", 6 => "1010010000000000", 7 => "1100000000000001", 8 => "1110011111111100", 9 => "1110011111111111", others => "0000000000000000"); signal adrint : std_logic_vector(4 downto 0); signal outint : std_logic_vector(15 downto 0); signal ceint : std_logic; begin adrint <= adr(4 downto 0); ceint <= '1' when (ce='1' and conv_integer(adr)<=31) else '0'; process (rw, ceint, adrint, data) begin outint <= memoirei(conv_integer(adrint)); if rw='0' then if ceint='1' then memoirei(conv_integer(adrint)) <= data; end if; end if; end process; data <= outint when (ceint='1' and rw='1') else (others => 'Z'); end synt; Page 39 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne architecture synt of memdata is ------------------------------type memdtype is array(31 downto 0) of std_logic_vector(7 downto 0); signal memoired : memdtype := (0 => "00000100", 1 => "00000011", others => "00000000"); signal adrint : std_logic_vector(4 downto 0); signal outint : std_logic_vector(7 downto 0); signal ceint : std_logic; begin adrint <= adr(4 downto 0); ceint <= '1' when (ce='1' and conv_integer(adr)<=31) else '0'; process (rw, ceint, adrint, data) begin outint <= memoired(conv_integer(adrint)); if rw='0' then if ceint='1' then memoired(conv_integer(adrint)) <= data; end if; end if; end process; data <= outint when (ceint='1' and rw='1') else (others => 'Z'); end synt; Page 40 Eduardo Sanchez Ecole Polytechnique Fédérale de Lausanne