3MMCEP Projet CdC

De Ensiwiki
Aller à : navigation, rechercher
AttentionCette page est maintenue uniquement par les enseignants. Afin de ne pas perturber le déroulement des cours, elle n'a pas vocation à être modifiée par les élèves. Mais si vous avez des modifications à proposer, merci d'en discuter ou d'envoyer un e-mail aux auteurs de la page (cf. historique)
Laptop.png  Première Année  CDROM.png  Informatique 
Fleche haut.png

Vous trouverez sur cette page la spécification précise du processeur à réaliser pendant le projet, ainsi que la liste des étapes à valider pour chaque séance et niveau de difficulté.

Planning des étapes du projet

Etapes du niveau A

Nous avons découpé l'implantation en 5 étapes correspondant au 5 séances encadrées de la partie projet, comme détaillé dans le tableau ci-dessous. A titre indicatif, nous avons aussi regroupé les étapes par niveau de difficulté : il ne faut bien sûr passer au niveau de difficulté supérieur que lorsque vous avez fini et rigoureusement testé les niveaux plus faciles.

Les étapes du niveau A sont difficiles et demandent un investissement conséquent, ne vous y engagez pas au détriment de votre travail dans les autres matières ! Les extensions sont elles-aussi des étapes difficiles, à réserver pour la fin du projet s'il vous reste du temps.

Indication concernant la notation du projet : la qualité sera largement valorisée par rapport à la quantité, il est inutile de vous lancer dans l'implantation d'extensions ou d'étapes avancées si les instructions de base ne fonctionnent pas parfaitement.

Attention : on rappelle également que l'on attend que vous rendiez, en plus du code VHDL, les tests que vous avez écrit pour valider les étapes.

Tableau d'avancement

Planning des séances du projet
Séance Niveau C Niveau B Niveau A
2 lecture et décodage des instructions, NOP, LUI, ORI
3 ADDU, ADDIU, SUBU, AND, ANDI, OR, XOR, NOR, XORI, SLL, SRL, SRA, SLLV, SRAV, SRLV SLT, SLTI, SLTU, SLTIU, factorisation d'états MULT, MULTU, MFLO, MFHI, MTLO, MTHI, DIV, DIVU
4 LW, SW afficheur 7-segments, programme utilisant l'affichage VGA LBU, LHU, LB, SB, LH, SH
5 BNE, BEQ, BLEZ, BGTZ, J, JAL, JALR, JR BGEZ, BGEZAL, BLTZ, BLTZAL
6 gestion d'une source d'interruption programme intéressant sur FPGA gestion des exceptions (ADD, ADDI, SUB, ...)
Extensions décaleur à barillet, timer additionneur à préfixe gestionnaire d'interruptions (RFE, MTC0, MFC0)

La sémantique des instructions est détaillé dans le document de descriptions des instructions.

Le mécanisme d'interruption à gérer en séance 6 est détaillée sur cette page.

Précision concernant le décaleur à barillet : on ne vous demande pas de ré-implanter complètement le circuit de décalage, mais plutôt d'utiliser un seul opérateur fourni dans la bibliothèque VHDL (par exemple SHR) pour implanter les trois types de décalage demandé dans le cahier des charges. Pour cela, vous devez implanter les circuits miroirs en entrée et sortie comme détaillé dans le document ci-dessus.

Les extensions sont quant à elle décrites dans ce document.

En plus de ces documents rédigés par nos soins, vous aurez sûrement besoin de consulter la documentation officielle des cartes FPGA Xilinx si vous souhaitez par exemple gérer l'afficheur 7-segments.

Codage des instructions

Les instructions MIPS respectent un codage très régulier qui facilite l'implantation de l'état de décodage. Elles sont classées selon trois formats :

Format des instructions MIPS
Format Bits 31 à 26 25 ... 21 20 ... 16 15 ... 11 10 ... 6 5 ... 0
R opcode registre rs registre rt registre rd champs SH champs FUNC
I opcode registre rs registre rt constante sur 16 bits
J opcode constante sur 26 bits

On donne ci-dessous les tableaux qui permettront le décodage des différentes instructions :

Décodage basé sur la valeur du champ codop
codop bits de 28 à 26
bits de 31 à 29 000 001 010 011 100 101 110 111
000 spécial regimm J JAL BEQ BNE BLEZ BGTZ
001 ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI
010 cop0 - - - - - - -
011 - - - - - - - -
100 LB LH - LW LBU LHU - -
101 SB SH - SW - - - -
11x - - - - - - - -
Décodage basé sur la valeur du champ FUNC quand l'opcode vaut spécial
FUNC bits de 2 à 0
bits de 5 à 3 000 001 010 011 100 101 110 111
000 SLL - SRL SRA SLLV - SRLV SRAV
001 JR JALR - - SYSCALL BREAK - -
010 MFHI MTHI MFLO MTLO - - - -
011 MULT MULTU DIV DIVU - - - -
100 ADD ADDU SUB SUBU AND OR XOR NOR
101 - - SLT SLTU - - - -
11x - - - - - - - -
Décodage basé sur la valeur du champ RT quand l'opcode vaut regimm
RT bits de 18 à 16
bits de 20 à 19 000 001 010 011 100 101 110 111
00 BLTZ BGEZ - - - - - -
10 BLTZAL BGEZAL - - - - - -
x1 - - - - - - - -
Décodage basé sur la valeur du champ RS quand l'opcode vaut cop0
RS bits de 23 à 21
bits de 25 à 24 000 001 010 011 100 101 110 111
00 MFC0 - - - MTC0 - - -
01 - - - - - - - -
Décodage basé sur la valeur du champ FUNC quand l'opcode vaut cop0 et IR25 vaut 1 et IR24...6 = 019
FUNC bits de 2 à 0
bits de 5 à 3 000 001 010 011 100 101 110 111
00x - - - - - - - -
010 RFE - - - - - - -
001 - - - - - - - -
1xx - - - - - - - -

Implantation de la Partie Opérative

La PO qui vous est initialement fournie correspond au schéma ci-dessous (les parties jaunâtres seront à rajouter si vous implantez la gestion d'une source d'interruption à votre projet) :

CEP Projet PO S2.png

Attention : notez bien que les feedback Z, C et S sont des sorties combinatoires de l'UAL envoyées directement à la PC et ne sont pas stockés dans un registre (à la différence du Pentium par exemple où les indicateurs sont stockés dans le registre %eflags).

Dans la PO, on utilise les conventions de codage suivantes :

Sélection de l'opérande X de l'UAL
cmd_ALU_X_Sel Opérande sélectionné
0000 Registre rs (désigné par IR25...21 et passant par le port A)
0001 Registre PC
0010 Registre EPC (note : à ajouter dans la PO au moment utile !)
0011 Registre DT
1000 Constante 0 sur 32 bits
1001 Constante 1 sur 32 bits
1010 Constante 16 sur 32 bits
1011 Constante 4096 sur 32 bits
1100 PC31...28 || 028
1101 027 || IR10...6

Où :

  • || est l'opérateur de concaténation de chaines de bits : par exemple, "1010" || "101" = "1010101" ;
  • xn représente la chaine de bits composée du bit x répété n fois : par exemple, 04 = "0000" ;
  • xa...b représente la sous-chaine de bits composée des bits de la chaine x dont les numéros sont compris entre a et b inclus : par exemple, "11101000"5..3 = "101".
Sélection de l'opérande Y de l'UAL
cmd_ALU_Y_Sel Opérande sélectionné
000 016 || IR15...0
001 IR1516 || IR15...0
010 04 || IR25...0 || 02
011 IR1514 || IR15...0 || 02
100 Registre rt (désigné par IR20..16 et passant par le port B)
110 Constante 0 sur 32 bits
111 Constante 4 sur 32 bits

Où IR1516 || IR15...0 construit le mot de 32 bits composé des 16 bits de poids faible de IR et du bit 15 de IR répliqué 16 fois dans les poids forts du mot (dit autrement, si on considère que les 16 bits de poids faible de IR forme un mot de 16 bits, on construit le mot de 32 bits correspondant en faisant une extension de signe).

Sélection de l'opération de l'UAL
cmd_ALU_OP Opération sélectionnée
000? RES <-- X + Y
001? RES <-- X - Y
0100 RES <-- X and Y
0101 RES <-- X or Y
0110 RES <-- X xor Y
0111 RES <-- X nor Y
100x RES <-- Y << X4...0
1010 RES <-- Y >> X4...0 (décalage logique)
1011 RES <-- Y >>> X4...0 (décalage arithmétique)

Où <-- représente l'assignation de valeur.

Attention, le bit noté ? dans l'addition et la soustraction permet de décider d'une opération signée ou non-signée. Regardez le code de la PO pour trouver le bon codage.

Sélection de la source du bus adresse
cmd_ADDR_Sel registre source
0 registre PC
1 registre AD

Toutes les commandes sur 1 bits sont actives à l'état haut (e.g. il faut envoyer '1' pour activer la commande).

Validation

Il est obligatoire d'utiliser le mécanisme de validation détaillée à la séance 2 pour permettre aux enseignants de noter la progression régulière du travail.

L'application de validation utilise une base de tests dont on ne donne pas les sources afin de vous inciter à réaliser vos propres tests.

Attention : les programmes servant de tests utilisent pour la plupart plusieurs instructions autres que l'instruction testée. Cela signifie qu'il est possible que l'instruction X que vous cherchez à valider fonctionne correctement, mais que la validation ne soit pas acceptée car votre implantation de l'instruction Y utilisée dans le test est fausse.

On vous donne ci-dessous la liste des dépendances entre les tests et les instructions (évidemment, chaque test dépend aussi de l'instruction dont il porte le nom !) :

  • dépendance(s) de test_S2_lui.s : aucune
  • dépendance(s) de test_S2_ori.s : aucune
  • dépendance(s) de test_S3_addiu.s : ori, addu
  • dépendance(s) de test_S3_addu.s : ori
  • dépendance(s) de test_S3_andi.s : ori
  • dépendance(s) de test_S3_and.s : ori
  • dépendance(s) de test_S3E_slti.s : lui, ori
  • dépendance(s) de test_S3E_sltiu.s : lui, ori
  • dépendance(s) de test_S3E_slt.s : ori
  • dépendance(s) de test_S3E_sltu.s : ori
  • dépendance(s) de test_S3_nor.s : ori
  • dépendance(s) de test_S3_or.s : ori
  • dépendance(s) de test_S3_sll.s : ori
  • dépendance(s) de test_S3_sllv.s : ori, sll
  • dépendance(s) de test_S3_sra.s : addiu
  • dépendance(s) de test_S3_srav.s : addiu, sra
  • dépendance(s) de test_S3_srl.s : ori
  • dépendance(s) de test_S3_srlv.s : ori, srl
  • dépendance(s) de test_S3_subu.s : ori
  • dépendance(s) de test_S3_xori.s : ori
  • dépendance(s) de test_S3_xor.s : ori
  • dépendance(s) de test_S4_lw.s : ori
  • dépendance(s) de test_S4_lw_sw.s : ori, lw
  • dépendance(s) de test_S5_beq.s : addiu, j
  • dépendance(s) de test_S5_bgtz.s : ori, addiu, j
  • dépendance(s) de test_S5_blez.s : addiu, j
  • dépendance(s) de test_S5_bne.s : ori, j
  • dépendance(s) de test_S5E_bext.s : ori, lui, bltzal, j, bltz, nor, bgez, or, bgezal, jr
  • dépendance(s) de test_S5_jalr.s : ori, jr
  • dépendance(s) de test_S5_jal.s : ori, jr
  • dépendance(s) de test_S5_jr.s : ori, j
  • dépendance(s) de test_S5_j.s : ori
  • dépendance(s) de test_S6_irq.s : ori, bne, j

Extensions à la spécification de base du projet

Une fois que vous avez validé toutes les étapes obligatoires, vous pouvez si vous le souhaitez rajouter des extensions à votre projet. Vous avez un grand degré de liberté concernant ces extensions mais nous vous proposons quelques idées dans le document suivant.

On rappelle la structure globale du système développé, une fois que les extensions suggérées sont intégrées (parties en jaunâtre) :

CEP Projet Systeme Complet.png