Deux hôtes Avalon et un arbitre¶
ATTENTION
TAG GIT pour cette ETAPE : ARBITRE
Introduction¶
L'architecture construite jusqu'à présent 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 et renouvelée en permanence 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.
Le module Top dispose d'ores et déjà d'un accès à un flux vidéo via l'interface hôte Avalon nommée avalon_if_stream dans le code du module. Sur cette interface, le module reçoit des requêtes d'écritures en rafales provenant du HPS et visant à renouveler le contenu de l'image. Cette interface est pour l'instant neutralisée dans le code en forçant le signal waitrequest à la valeur 1.
L'objectif est donc maintenant de partager l'accès à l'interface avalon_if_sdram en créant un module d'interconnexion associé à un dispositif d'arbitrage.
1/ Un squelette d'interconnexion¶
- Dans le répertoire src, créez un nouveau module nommé avalon_intercon dont les ports seront:
- Un agent d'une interface avalon_if qui sera nommé avalon_ifa_vga
- Un agent d'une interface avalon_if qui sera nommé avalon_ifa_stream
- Un hôte d'une interface avalon_if qui sera nommé avalon_ifh_sdram
Les requêtes du module vga et du HPS seront redirigées vers ce module qui les redirigera vers la SDRAM.
Laissez le contenu du module avalon_intercon vide pour l'instant.
Dans le module Top:
- Supprimez la neutralisation de l'interface avalon_if_stream (commentez les 2 assignations aux signaux avalon_stream.waiterequest et avalon_stream.readdata).
- Déclarez une nouvelle interface de type avalon_if et nommée avalon_if_vga dans la liste des bus Avalon internes
- Instanciez le module avalon_intercon en connectant:
- L'interface avalon_stream au port avalon_ifa_stream du module.
- L'interface avalon_vga au port avalon_ifa_vga du module.
- L'interface avalon_sdram au port avalon_ifh_sdram du module.
- Modifiez la connection du port avalon_ifh de l'instance de vga en le connectant à l'interface avalon_ifa_vga du module d'interconnexion.
Nous allons tout d'abord vérifier que nous n'avons rien cassé...
- Dans le module avalon_intercon:
- Créez un code de neutralisation de l'interface avalon_ifa_stream.
- Connectez l'interface avalon_ifa_vga à l'interface avalon_ifh_sdram. Pour cela, détaillez les connexions signal par signal, en utilisant des constructions assign.
-
Compilez, simulez cette nouvelle version et vérifiez que les images générées sont toujours celles de la mire générée.
-
Pas de synthèse à cette étape.
2/ Une sélection de l'hôte connecté à l'interface sdram¶
Un signal interne à avalon_intercon servira de drapeau pour indiquer quel hôte est connecté à la sdram
- Ajouter dans avalon_intercon un signal nommé sel_vga.
-
Configurez le signal sel_vga pour être une constante égale à 1 (assign...)
-
Modifiez les connexions des signaux de avalon_ifh_sdram pour les conditionner à la valeur du signal sel_vga:
- Vous utiliser l'opérateur ternaire dans les assign
- Attention à bien gérer tous les signaux, notamment les signaux de retour vers les interfaces hôtes.
-
Compilez, simulez cette nouvelle version et vérifiez que les images générées sont toujours celles de la mire générée.
-
Pas de synthèse à cette étape.
- Modifiez le signal sel_vga pour être une constante égale à 0
-
Compilez, simulez cette nouvelle version et vérifiez que d'une part les images générées sont noires et que d'autre part un flux continu de données est transféré vers la sdram (examinez les signaux de l'interface)
-
Pas de synthèse à cette étape.
3/ Espionnage de l'interface hôte avalon_ifh_vga¶
Nous voulons permettre au flux d'écriture de s'intercaler dans les intervalles inactifs des flux de lecture. Pour cela, nous pouvons espionner l'interface vga
Compte tenu du protocole Avalon Memory Mapped et de l'usage de rafales de lecture on peut considérer que l'interface avalon_ifh_vga est active dans les conditions suivantes:
- Une requête de lecture de N données en rafale a été demandée (N est transmis par l'interface) alors que sel_vga est égal à 1
- N données demandées ont été reçues à la suite de cette requête.
Ajoutez un code permettant de déterminer un signal vga_busy d'être à 1 pendant une telle séquence.
-
Attention le signal vga_busy doit réagir combinatoirement à la détection de la requête.
-
Fixez le signal sel_vga à 1
- Compilez, simulez cette nouvelle version et vérifiez que le signal vga_busy délimite bien les séquence de transferts de l'hôte avalon_ifh_vga. Vérifiez, de même que le signal est bien égal à 0 en dehors de ces séquences.
4/ Espionnage de l'interface hôte avalon_ifh_stream¶
Compte tenu du protocole Avalon Memory Mapped et de l'usage de rafales de lecture on peut considérer que l'interface avalon_ifh_stream est active dans les conditions suivantes:
- Une requête d'écritures de N données en rafale a été demandée (N est transmis par l'interface) alors que sel_vga est égal à 0
- Les N données ont été écrites à la suite de cette requête.
Ajoutez un code permettant de déterminer un signal stream_busy d'être à 1 pendant une telle séquence.
- Attention le signal stream_busy doit réagir combinatoirement à la détection de la requête.
- Fixez le signal sel_vga à 0
- Compilez, simulez cette nouvelle version et vérifiez que le signal stream_busy délimite bien les séquence de transferts de l'hôte avalon_ifh_stream. Vérifiez, de même que le signal est bien égal à 0 en dehors de ces séquences.
5/ Un arbitre¶
- Créez un code donnant la main alternativement à l'une ou l'autre des interfaces via le signal sel_vga.
- Quand une interface ne demande pas de transfert, la main est donnée à l'autre interface uniquement s'il y a une requête de cette autre interface
- Compilez, simulez cette nouvelle version et vérifiez que de nouvelles images sont générées.
Examiner la séquence des images générées. Il est possible que la première image contienne des traces de l'ancienne mire (expliquez pourquoi). Si les images sont déchirées ou bruitées, il est vraisemblable que votre arbitre gère mal les conflits d'accès à la SDRAM.
L'image finale obtenue devrait être:
Conclusion¶
Après simulation, votre architecture semble fonctionner. Cela dit, les modèles de simulation de la SDRAM et de son contrôleur ne sont pas très réalistes. Il en est de même du modèle de simulation du flux en provenance du HPS. L'étape suivante, sur la maquette permettra d'évaluer cela.
N'oubliez pas
TAG GIT pour cette ETAPE : ARBITRE