Projet Architecture 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)

Cahier des charges 2010 - 2011

Ce document décrit le jeu d'instruction minimum que doit supporter votre processeur. Vous êtes libre d'ajouter toutes les extensions souhaitées, mais elles ne doivent pas remettre en cause cette spécification imposée.

Attention : vous ne devez vous lancer dans l'ajout d'extensions qu'après avoir vérifié que le cahier des charges est géré entièrement et correctement. Le jour de la soutenance, la qualité primera largement sur la quantité.

Si vous souhaitez imprimez une page Wiki, le plus simple est de cliquer sur le lien "version imprimable" dans la Boîte à outils sur la gauche pour obtenir une version du texte sans les bordures et en-tête.

Cahier des charges minimal

Codage des instructions
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 Nom Description
Séance 2 (i.e. vous devez implanter ces instructions au plus tard à la séance # pour espérer finir le cahier des charges minimal)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 reset  %pc := 0
1 1 0 1 0 1 0 x x x x x x rd in  %rd := PIN
1 1 0 1 0 1 1 rb x x x x x x out POUT := %rb
Séance 3
0 codage de l'opération rb ra rd opération  %rd := %ra OP %rb
Séance 4
1 1 0 1 0 0 0 rb ra rd lw  %rd := MEM(%ra + %rb)
1 1 0 1 0 0 1 rb ra rd sw MEM(%ra + %rb) := %rd
Séance 5
1 1 1 0 0 0 0 rb ra cc brcc si %ra valide cc alors %pc := %pc + %rb + 1 (*)
1 1 1 0 0 0 1 rb ra cc bacc si %ra valide cc alors %pc := %rb
1 0 imm8 ra cc bricc si %ra valide cc alors %pc := %pc + ext(imm8) + 1 (*)
Séance 6
1 1 0 0 imm9 rd li  %rd = ext(imm9)
1 1 1 1 0 0 0 rb x x x rd brl  %rd := %pc + 1 || %pc := %pc + %rb + 1 (*)
1 1 1 1 0 0 1 rb ra rd bal  %rd := %pc + 1|| %pc := %rb (**)
Séance 7
Démonstration sur carte (***)
Intégration du VGA
Gestion des interruptions

Légende : les 'x' signifient "valeur non prise en compte dans le décodage".

(*) : l'affectation %pc := %pc + %rb + 1 signifie qu'on ajoute à %rb la valeur de %pc après l'incrémentation dans l'état de décodage des instructions (i.e. vous n'avez pas à faire d'incrémentation supplémentaire après avoir ajouté %rb à %pc).

(**) : il est possible d'implémenter aussi cette instruction avec %pc := %rb + %ra (les deux seront acceptés).

(***) : attention, le fichier de contraintes fourni utilise le port B1 pour les 8 bits de poids fort de PIN, ce qui peut poser des problèmes : il est recommandé de forcer ces 8 bits de poids fort à 0 dans le composant top-level de votre réalisation.

Codage des opérations
Nom 5 4 3 2 1 0 Description
inc 0 0 0 0 1 0 <%rd , C> := %ra + 1
dec 0 0 0 0 1 1 <%rd , C> := %ra - 1
add 0 0 0 1 0 0 <%rd , C> := %ra + %rb
sub 0 0 0 1 0 1 <%rd , C> := %ra - %rb
adc 0 0 0 1 1 0 <%rd , C> := %ra + %rb + C
sbc 0 0 0 1 1 1 <%rd , C> := %ra - %rb - C
mova 0 0 1 0 0 0  %rd := %ra
movb 0 0 1 0 0 1  %rd := %rb
nega 0 0 1 0 1 0  %rd := -%ra
negb 0 0 1 0 1 1  %rd := -%rb
and 0 1 0 0 0 0  %rd := %ra . %rb
or 0 1 0 0 0 1  %rd := %ra + %rb
xor 0 1 0 0 1 0  %rd := %ra ⊕ %rb
not 0 1 0 0 1 1  %rd := %ra
shl 1 0 décalage  %rd := %ra << (décalage + 1)
shr 1 1 décalage  %rd := %ra >> (décalage + 1)
Codage des conditions
Nom 2 1 0 Description
eq 0 0 0 vrai ssi %ra = 0
ge 0 0 1 vrai ssi %ra ≥ 0
le 0 1 0 vrai ssi %ra ≤ 0
true 0 1 1 toujours vrai
ne 1 0 0 vrai ssi %ra ≠ 0
lt 1 0 1 vrai ssi %ra < 0
gt 1 1 0 vrai ssi %ra > 0
false 1 1 1 toujours faux

Les interruptions

Une fois que vous avez fini de gérer toutes les étapes précédentes du cahier des charges, vous pouvez ajouter la gestion des interruptions. Pour valider cette étape, vous devez au moins :

  • gérer une seule source d'interruption matérielle ;
  • fournir un mécanisme permettant la sauvegarde de tous les registres dont le contenu doit être préservé pendant un traitement d'interruption ;
  • garantir qu'un traitant d'interruption ne peut être interrompu avant la fin du traitement ;
  • ajouter toutes les instructions nécessaires.

Vous pouvez ensuite enrichir votre gestion des interruptions, en supportant par exemple :

  • le masquage / démasquage logiciel des interruptions ;
  • plusieurs sources d'interruptions matérielles ;
  • la possibilité d'interrompre un traitant d'interruption par une interruption de plus forte priorité.

Un programme de test possible : PGCD

int main(void)
{
   unsigned a, b;
   a = 15; b = 10;
   while (a != b) {
       if (a < b) {
           b = b - a;
       } else {
           a = a - b;
       }
   }
   return 0;
}