Étape 4: Deux maîtres Wishbone et un arbitre

ATTENTION : TAG GIT pour cette ETAPE : "ARBITRE"

1) Introduction

L'architecture réalisée n'est pas très réaliste. Dans la pratique, l'image affichée n'est pas stockée dans la SDRAM de manière statique mais générée par un dispositif extérieur tel qu'un microprocesseur ou un décodeur vidéo. L'accès au contrôleur SDRAM doit donc être partagé entre le bloc vga et cet autre dispositif. Pour se rapprocher d'une telle structure nous allons mettre en place (dans Top) l'organisation suivante:

  • Le contrôleur vga est inchangé.
  • Un module mire sera créé. Son seul port d'entrée/sortie est une interface Wishbone. Son rôle est d'écrire une mire dans la mémoire SDRAM, et de répéter indéfiniment cette opération.
  • Le module Top contiendra  deux nouvelles interfaces Wishbone :

    • wshb_if_vga  dédiée aux transferts de données du module vga qui ne pourra plus accéder directement au contrôleur de SDRAM.

    • wshb_if_mire  dédiée aux transferts de données de la mire.

  • L'accès au contrôleur de SDRAM étant maintenant partagé par deux modules totalement indépendants, il faut intercepter et arbitrer les requêtes des deux blocs. Un nouveau module wshb_intercon aura pour rôle de:
    • Détecter les requêtes en provenance des deux maitres (en se basant sur les signaux cyc des interfaces Wishbone).
    • Élire un maître.
    • Mettre en correspondance les signaux du maître élu avec les signaux de l'interface maître.
    • Neutraliser les signaux du maître "non élu" pour le forcer à attendre.

La structure codée dans Top sera donc la suivante (les blocs en vert correspondent aux instances des sous-modules, les blocs en rouge correspondent aux instances des interfaces).

2) Travail à réaliser

  • Créer un module mire chargé d'écrire une mire de manière permanente. Attention, le module mire devra être "fair-play" c'est-à-dire ne pas maintenir une demande d'écriture permanente de manière à permettre à l'arbitre de donner la main au module vga. Pour cela vous pouvez, par exemple, insérer un cycle à vide (avec cyc et stb à 0) toutes les 64 requêtes d'écriture.
  • Modifiez (si ce n'est pas déjà le cas) le module vga pour que son signal cyc soit identique à stb. Ainsi, le module vga sera lui-même "fair-play". Quand sa FIFO est pleine, il laisse le module mire prendre éventuellement la main sur le bus Wishbone.
  • Créez le module wshb_intercon pour mettre en place le mécanisme d'arbitrage et de sélection des signaux.  Vous coderez un arbitre équitable basé sur un passage de jeton. Dans la mesure ou le module mire et le module vga rendent la main de manière régulière, il suffira d'observer le signal cyc de chacun des modules:
    • Si le module mire a le jeton et si son signal cyc est à 0, alors l'arbitre donnera le jeton au module vga.
    • Si le module vga a le jeton et si son signal cyc est à 0, alors l'arbitre donnera le jeton au module mire.
  • Modifiez enfin le module Top pour mettre en place les nouvelles interfaces ainsi que les nouveaux modules.
  • Vérifiez par simulation le bon fonctionnement de l'ensemble.
  • Adaptez les fichiers pour la synthèse (project_list.tcl), synthétisez...
  • Testez sur la carte...

N'OUBLIEZ PAS : TAG GIT pour cette ETAPE : "ARBITRE"