27/04/2009 M1 EEA MISE EN ŒUVRE D’UN PROCESSEUR 4 BITS PAR SYNTHESE LOGIQUE DE HAUT NIVEAU SUR FPGA [Copyright LAGIN GARY] Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA SOMMAIRE I .Mise en place du décodeur d’instruction.......P4 II. Mise en place du décodeur d’instruction complet......15 III. Développement de la partie calcul...........P16 IV. Développement de la partie de contrôle....P17 LAGIN GARY M1 EEA Page 2 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Présentation du projet L e but de ce projet est de réaliser un microprocesseur 4 bits et d’implémenter la structure sur un FPGA. On introduira ainsi les concepts élémentaires de l’architecture des microcontrôleurs. Avantages du projet : • • • • • Maitrise du logiciel Quartus. Progrès en langageVHDL. Notions de schémas bloc. Compréhension du principe de l’architecture d’un microprocesseur très simple qui sera bénéfique si nous devions travailler sur une architecture plus complexe en entreprise. Autonomie d’apprentissage et explication des professeurs. Inconvénient du projet. • • Durée des séances assez lourdes. Bug du logiciel Quartus qui nous fait perdre du temps. Schéma de principe du microprocesseur. LAGIN GARY M1 EEA Page 3 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA I .Mise en place du décodeur d’instruction La première étape consistera à lire dans la mémoire de programme, l’instruction et sa donnée et de faire parvenir l’instruction au bloc « MicroInstruction » (MI). Nous mettrons en place les 3 blocs suivants que nous étudierons séparément : • • • Le compteur de programme PC (PC.qpf) La mémoire de programme PM (PM.qpf) Le registre d’instruction RI (RI.qpf) Nous commencerons à étudier et puis créer le bloc PC dont sa structure a déjà été vue en TD. Etude du compteur de programme PC : La commande PC est un pointeur qui va pointer et se déplacer par incrémentation sur les adresses de la mémoire PM où le programme a été crée (par l’utilisateur). LAGIN GARY M1 EEA Page 4 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Ainsi : Admettons le programme ci-dessous : (sens de lecture du programme de haut en bas) : mnémonique LDA 2 ADD 1 OUT Instruction & donnée (sur 8 bits) 0101|0010 0010|0001 0100|0000 NOP 0000|0000 commentaire On charge 2 dans l’accu A. On addition le contenu par 1. Le résultat est transmis le registre « output register ». Arrêt du programme. De plus, le cahier des charges nous informe que PC compte de 0000 à 1111 soit en décimal de 0 à 15 et que le pointeur est initialisé à 0. Ainsi nous en déduisons une mémoire PM de 16 mots de 8 bits (capacité 128 bits). Voici ce que cela nous donne : Mémoire programme (PM) Au début PC=0 @0000 0101 0010 @0001 PC+1 0010 0001 @0010 0100 0000 @0011 0000 0000 @0100 @1111 LAGIN GARY M1 EEA Page 5 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Pseudo code : Tableau de l’entité PC Nom Mode Type clk entrée Bit clear entrée Bit S sortie Entier (0à 15) Début ; Si clear=1 alors S=0 ; Sinon si clk= alors count<= count +1 ; S<=count ; Fin de SI Fin ; Programme : prog_count.vhd Library IEEE;--librairie offrant les outils pour la programmation vhdl use ieee.std_logic_1164.all; entity PC is port ( clk,clear:IN bit; S:out integer range 0 to 15 );--déclaration entrée/sortie end PC; architecture beh of PC is--architecture nommée BEH d'entité PC LAGIN GARY M1 EEA Page 6 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA begin process (clk,clear)--pour rendre la lecture du programme séquentielle,clk et clear sont les événements en entrée. variable count:integer range 0 to 15;--variable interne au process variant de 0 à 15 begin if clear='1' then S<=0;--clear ne dépend pas de l'horloge, il est dit asynchrone (prioritaire devant l'horloge clk, si clear=1 alors S=0) elsif clk'event and clk='1' then count:=count+1;--incrémentation à chaque coup d’horloge S<=count;--mettre la valeur de count dans la sortie S end if;--fin de condition-end process;--fin de process end beh;--fin d'architecture Résultat de simulation: Dans le fichier PC.vwf, on règle les paramètres en entrée (attention : l’horloge clk doit être inférieur à l’horloge du microprocesseur qui est de 50 Mhz) de façon à avoir tous les cas en sortie puis on lance la simulation. clear clk S Interprétation : LAGIN GARY M1 EEA Page 7 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA On s’aperçoit que lorsque le clear est activé « clear=1 », le compteur n’est pas réinitialisé. Il nous faut donc réinitialiser la 0 la variable interne count. Correction du programme Library IEEE;--librairie offrant les outils pour la programmation vhdl use ieee.std_logic_1164.all; entity PC is port ( clk,clear:IN bit; S: out integer range 0 to 15 ); architecture beh of PC is--architecture nommé beh d'entité PC begin process (clk,clear)--pour rendreà la lecture du programme sequentielle, variable count:integer range 0 to 15; variable interne du process begin if clear='1' then count :=0;--initialiser count à zéro S<=count ; elsif clk'event and clk='1' then count:=count+1; S<=count;--mettre la valeur de count dans la sortie S end if;--fin de condition-end process;--fin de process end beh;--fin d'architecture LAGIN GARY M1 EEA Page 8 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Résultat de simulation : clear clk S Delay Théoriquement, il devrait y avoir 0 sur la sortie S à cet emplacement. Interprétation : On observe un retard (Delay) entre la donnée émise et le coup d’horloge. En temps normal la sortie S qui est initialisé à 0 par la commande asynchrone « clear=1 », restera à 0 jusqu’au prochain front d’horloge montant de S. Malheureusement, en réalité il y a un retard qui est du à l’accumulation des bascules en `cascade’ et à la fréquence d’horloge. La mémoire de programme PM : Pour créer la mémoire, nous utiliserons les macro-fonctions disponibles sur Quartus. Nous allons donc créer un bloc Ram défini en tant que macro fonction. Pour simuler la structure, il nous faudra initialiser la mémoire PM. Ainsi dans « new memory initialization file », nous spécifions la taille de la mémoire, c'est-à-dire 16 mots de 8 bits. Une fenêtre (ci-dessous) apparait, dans laquelle nous mettons les données en décimal. LAGIN GARY M1 EEA Page 9 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA PM.mif Adresse de 0 à 7. Adresse de 8 à 15 Nous allons maintenant associer le fichier PM.mif avec macro-fonction « LPM_RAM_DQ » qui est le bloc RAM crée. RAM : (random access memory) est une mémoire volatile, sur laquelle nous pouvons écrire à volonté. Ce qui nous donne la structure ci-dessous : Nous testons ce bloc pour connaitre plus précisément son fonctionnement. Simulation : 2 coups d’horloge address clk q wren Pour avoir une valeur sur q, la durée de temps de latence est de 2 coups d’horloge. Cela semblerait être du au temps mis au bloc pour pointer l’@ de la valeur choisi et lire cette dernière sur q. La période de l’adresse fait 5 fois celle du clk pour laisser le temps à q de s’afficher correctement. LAGIN GARY M1 EEA Page 10 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Interprétation. WREN : c’est une entrée prioritaire (asynchrone). Lorsque : Wren=1 droit écriture dans la mémoire Wren=0 autorisation `lecture’ d’une valeur d’une case mémoire pointée à une adresse. Clock : horloge de synchronisation pour que le contenu de l’@ soit lu sur la sortie q. Data : bus de donnée (c’est les entrées avec lesquelles nous allons stocker nos données. Address : bus d’adresse (c’est les entrées avec lesquelles nous choisissons l’emplacement de la mémoire qu’on veut stocker). Nous pouvons implémenter notre structure sur le Stratix (FPGA) de la plaquette qui contient de manière interne une mémoire RAM. Nous avons une mémoire de 128 bit à implémenter qui sera « taillé »sur la mémoire 512 du FPGA. Fmax :la fréquence max est la fréquence pour laquelle la donnée q devient instable (limitatif). Fmax=1 Ghz Analyse temporelle (voir annexe) LAGIN GARY M1 EEA Page 11 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Le registre d’instruction RI Le registre d’instruction reçoit les données de la mémoire : Les 8 bits de données sont séparés en deux : Les bits les plus significatifs correspondent aux instructions, les bits les moins significatifs aux données. Créer un modèle VHDL nommé « instr_reg ». Le registre d’instruction sera définit de la façon suivante : - Une entrée clear de mise à zéro - Une entrée Clock de synchronisation sur une horloge. - Une entrée EnableInstr permettant de valider le fonctionnement. - Une entrée 8 bits venant de la mémoire. - Une sortie sur 4 bits : « to_Micro » contenant l’instruction - Une sortie sur 4 bits « to_bus » contenant la donnée à transmettre sur le bus interne. Pour connecter la sortie « to_bus » sur le bus interne, les différentes sorties des blocs devront être déclarées sous la forme de STD_LOGIC. Ceci permet de définir un cas où les sorties vers le bus interne peuvent être déclarées en haute impédance (Z) lorsque le bloc est inactif et ne doit pas écrire sur le bus. Attention, tout composant qui est relié avec le bus interne IB, doit déclarer son entité (sortie) en std_logic. Nous avons mis l’entrée clear puis Enableinstruct en état prioritaire sur tout le reste des entrées du montage. Le pseudo-code nous donne : Table de l’entité Nom Mode Type clear entrée 1bit LAGIN GARY M1 EEA clk entrée 1bit Enableinstruct instruct entrée entrée 1bit Bus 8 Bit To_micro sortie Bus 4 Bit To_bus sortie Bus 4 bit Page 12 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA Si clear=0 alors Si Enableinstr=1 alors Si clk= alors To_micro<=instru(D7 à D4) To_bus<=instru(D3 à D0) Fin de si Sinon to_micro<=ZZZZ to_micro<ZZZZ fin de si sinon to_micro<=0000 sinon to_bus<=0000 fin de si Ce qui nous donne Programme: instr_reg.vhd library IEEE; use ieee.std_logic_1164.all; entity instr_reg is port( clear,clk,EnableInstr :in bit; Instruct:in std_logic_vector(7 downto 0); to_micro,to_bus:out std_logic_vector(3 downto 0) ); end instr_reg; LAGIN GARY M1 EEA Page 13 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA architecture beh of instr_reg is begin process(clear,clk,EnableInstr,Instruct) begin if clear='0' then if EnableInstr='1' then if clk'event and clk='1' then to_micro<=Instruct(7 downto 4);sur les 4 bits de poids forts sur to_micro to_bus<=Instruct(3 downto 0);sur les 4 bits de poids faible sur to_bus end if; else -- sinon enableinstr=0 alors to_micro<="ZZZZ";--haute impedancesur sortie si enableinstr=0 to_bus<="ZZZZ"; end if; else -- sinon clera=0 alors to_micro<="0000"; to_bus<="0000"; end if; end process; end beh; Simulation: LAGIN GARY M1 EEA Page 14 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA On observe bien la valeur 7 (4 bits de poids forts) sur to_micro et la valeur 4 (4 bits de poids faible) sur to _bus. II. Mise en place du décodeur d’instruction complet : Simulation et explication de chronogramme (cf. Annexe 2) LAGIN GARY M1 EEA Page 15 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA III. Développement de la partie calcul Mise en place de l’accu A Entity ACCUA is port port(D,C :in std_logic ;Q,NQ :out_logic) ; End ACCUA ; Architecture arc of ACCUA is Signal Qint:std_logic; Begin Qint <= D when (C’event and c=’1’) else Qint; Q<= Qint; NQ<=not Qint; End arc; La simulation voir annexe 4 Mise en place de l’accu B : Idem que celui de l’accuA Assemblage ALU+ACCUA+ACCUB (voir annexe 5) Simulation et commentaire (voir annexe 6) LAGIN GARY M1 EEA Page 16 Mise en œuvre d’un processeur 4 bits par synthèse logique de haut niveau sur FPGA IV. Développement de la partie de contrôle. Mise en place du générateur de phase LIBRARY ieee; USE ieee.std_logic_1164.all; --USE ieee.std_logic_arith.all; ENTITY GENE_3 IS PORT ( H : IN STD_LOGIC; -- Horloge ONE : INOUT STD_LOGIC; -- Phase TWO : INOUT STD_LOGIC; -- Phase THREE : INOUT STD_LOGIC -- Phase ); } END GENE_3; ARCHITECTURE a OF GENE_3 IS SIGNAL ONE_Tmp : STD_Logic; BEGIN PROCESS (H) BEGIN ONE_Tmp <= TWO NOR THREE; IF (H'EVENT AND H = '1') THEN ONE <= THREE; TWO <= ONE_Tmp; THREE <= TWO; END IF; END PROCESS; END a; LAGIN GARY M1 EEA Page 17