Étape 4: Interface de microcontrôleur - FPGA Xilinx Spartan 6
Nous avons conçu l’interface MCU de façon à être en mesure de partager des données entre le microcontrôleur STM32 et les FPGA 3 Nexys. Afin d’assurer une carte graphique entièrement fonctionnel, les données reçues de la STM32 doivent être dirigées vers le registre correct ou vers le contrôleur DMA sans aucune discontinuité ou les données perdues. Le STM32 devrait également pouvoir lire les données des registres sans mettre en péril le processus d’écriture.
Le protocole d’Interface MCU
Le connecteur LCD utilisé pour connecter le microcontrôleur STM32 le FPGA 3 Nexys est un connecteurs carte à carte de 17 par 2.
Pour utiliser le protocole SRAM asynchrone EFM, nous avons besoin :
- Un bus de données 16 bits, disponible directement depuis le connecteur LCD (D0 à D15)
- Les signaux NOE, NWE et NE4, également disponibles sur le connecteur de l’écran LCD (RD, WR et CS)
- Une bit 26 adresse non disponible sur le connecteur LCD, là seule l’A [0] bit. Ce pourquoi nous avons dû créer notre propre protocole, donc nous pouvons utiliser l’EFM pour transférer les données depuis le microcontrôleur STM32.
Afin de couvrir notamment à l’impossibilité du bus d’adresses de 26 bits, nous avons décidé de diviser une transaction (lecture ou écriture) dans trois opérations successives. Le premier est une opération d’écriture contenant l’adresse du Registre dans que nous voulons lire ou écrire. Le second est une lecture ou une opération d’écriture selon le type d’opération que nous devons faire. Dans le cas d’une opération d’écriture, le bus de données va être contenant les données que nous voulons écrire dans les registres dont l’adresse est spécifiée dans l’opération précédente. Étant donné que les registres GPU sont des registres de 32 bits, il faut deux écrire (ou lire) transaction de 16 bits.
Pour reprendre le protocole, afin d’écrire dans un registre, nous avons besoin de trois transactions d’écriture. Le premier celui qui tient l’adresse et les deux autres contenant les données de 32 bits (LSB puis MSB). Dans le cas où nous voulons lire les données des registres, la première transaction sera une écriture une contenant l’adresse. Les deux autres contiennent les données des registres (LSB puis MSB).
Gestion de bus de données et l’adresse
Le bloc de gestion des données et l’adresse bus
met à jour la mémoire tampon de données 32 bits et le tampon d’adresse de 16 bits. Sur la première transaction de la STM32, les 16 bits de données sont transférées vers le tampon adresse. Les deux opérations suivantes sont transférées dans la mémoire tampon de données 32 bits.
Dans le cas d’un transfert de données DMA contrôleur, il n’y a pas besoin d’une opération de trois écriture puisqu’il n’y a pas d’adresse et le bus de données 16 bits uniquement. Dans ce cas, le bus de données STM32 16 bits sont transférés vers le bus de données DMA. Nous avons utilisé le LSB de bus 26 bits d’adresse de l’EFM, appelé RS, dans un souci d’identification de l’emplacement du transfert de données (contrôleur DMA ou carte Enregistrer).
Données sont transférées depuis les tampons vers le bus disponible selon le type de transfert, détecté à l’aide de la NOE, NWE des signaux de l’EFM, comme indiqué dans la section précédente. Étant donné que ces signaux est asynchrones, nous avons ajouté à l’interface MCU un générateur de signal synchrone qui peut être utilisé pour synchroniser les autres blocs, mais avec un retard de 10 à 20 ns.
Gestion des demandes bus
Dans le cas d’un transfert de données depuis ou vers le bloc de carte inscrit, le bus de données doit être octroyée pour la transaction à être traitées avec succès. Si le bus n’est pas disponible, une demande doit être envoyée à l’onglet et le STM32 doit rester inactif jusqu'à ce que le bus devient disponible.
C’est pourquoi utilisé l’usage général d’entrée/sortie (GPIO), disponible à partir du connecteur LCD, est configurée pour envoyer un signal nommé occupé qui est raconte le STM32 que le FPGA est occupé et ne peut pas poursuivre l’opération jusqu'à ce que le signal d’occupation est remis à « 0 ». Cette procédure très simple garantit que tout transfert vers ou depuis la carte les registres est traité avec succès et sans aucune perte de données. Lorsque le bus est disponible, une activation de la sortie est envoyée aux registres dans le cas d’une opération de lecture. Si il s’agit d’une opération d’écriture, un signal de charge est envoyé aux registres en même temps que le bus d’adresses.
Démo
Dans cette démo, vous verrez comment nous avons réussi à tourner sous et hors tension de la LED sur la carte Nexys 3 de la carte MCU.