[AUDIO_VIDE] Bonjour, nous allons continuer le cours sur les enseignes et afficheurs à LED. Aujourd'hui, nous allons aborder la commande d'une matrice à LED, avec une carte FPGA. Dans cette leçon, nous allons d'abord vous faire une petite présentation de la matrice à LED, ensuite, un deuxième point présentera le principe du contrôle de la matrice, nous allons ensuite présenter une mise en œuvre sur une matrice RGB 32 fois 32, avec une carte FPGA, et un dernier point présentera quelques simulations des signaux de contrôle. Une matrice à LED est un panneau où des LED sont arrangées en grille, lignes, colonnes. Cette version de la matrice 32 fois 32 présente une LED tous les six millimètres. Elle compte 1024 LED RGB, c'est-à -dire une combinaison des couleurs, rouge, bleu et vert, permet de contrôler la couleur de chaque pixel. Voici les spécifications de la matrice. Elle compte 1024 LED RGB, rangées sous forme de carré 32 fois 32, les longueurs d'onde pour chaque couleur, rouge, vert et bleu, sont présentées ici, elle est alimentée en cinq volts, et peut consommer jusqu'à quatre ampères, nécessite 13 pins pour la commande, 6 pour les données et 7 pour le contrôle. La commande de cette matrice se fait par étapes, on ne peut pas commander toutes les LED en même temps. On contrôle uniquement une ligne à la fois, parmi plusieurs. On joue donc sur la fréquence de scrutation de l'affichage pour tromper l'oeil humain. Ce principe est appelé le scanning. Il représente le nombre de ligne que l'on peut rafraîchir pour présenter une image. Cette version de la matrice est constituée de deux parties. Une première partie constituée de 16 fois 32 pixels, et une deuxième partie constituée de 16 fois 32 pixels. On peut donc contrôler deux lignes à la fois pour la matrice globale. En résumé, quand on contrôle une ligne, L, de la matrice, on contrôle également la ligne L + 16. Par exemple, ici, le contrôle de la ligne zéro contrôle en même temps la ligne 16, qui correspond à la ligne zéro de la deuxième moitié. Le chargement des données de la matrice se fait à travers deux fois trois registres à décalages. Nous avons ici trois registres à décalages 32 bits, pour la première moitié, et trois registres à décalages 32 bits, pour la deuxième moitié. Ces deux registres sont contrôlés par le même signal, le clock. Le chargement des données se fait donc sur fond du clock, en séries de 32 bits par couleur. Pour présenter le fonctionnement du chargement des trois couleurs, nous avons ici un registre à décalages 32 bits, le chargement des données des trois couleurs se fait à chaque front montant de l'horloge. Lorsque le registre série est plein, une activation du pin LAT permet de transférer les données série en parallèle, sur un registre de mémorisation 32 bits. Et une activation du OE, Output Enable, permet de transférer les données sur le pixel de la matrice. Il faut juste noter que le Enable Output est activé niveau bas. Les deux moitiés de la matrice partagent les données de sélection, le, clock, le Enable Output et le LAT. La sélection des lignes se fait à travers les pins A, B, C et D. Le tableau suivant donne les 16 combinaisons sur A, B C et D, permettant de sélectionner chacune des 16 lignes. La sélection de la ligne, L, permet de sélectionner également la ligne, L + 16. En résumé, le contrôle de la matrice se fait à travers six données de couleurs. Nous avons les trois pour la première moitié, et les trois pour la deuxième moitié. Quatre lignes d'adresse, A, B, C et D, et trois sillons de contrôle, le, clock, qui rythme le contrôle de chaque bit de données chargé, le LAT qui permet de transférer les données à la fin de chaque chargement, et le, Output Enable, qui permet d'activer ou de verrouiller l'affichage. Pour contrôler la matrice avec une carte FPGA, D E zéro nano d'ALTERA, nous avons choisi cette assignation des pins. Ce tableau donne, sur la première colonne, les pins de la matrice, sur la deuxième colonne, les pins que nous avons choisis sur la carte FPGA. Pour vous permettre de vous repérer sur les pins, nous avons donné ici le schéma, où nous avons, ici, en rouge, les pins GPI zéro, que nous avons utilisés, et ici les noms des pins choisis et le brochage. Le Top Level Matrix 32 fois 32 RGB, délivre les signaux de commande qui vont être connectés à la matrice RGB. Et ces signaux sont délivrés par un composant, scan_matrice, qui est rythmé par une horloge. L'entité, Matrix 32 fois 32 RGB, dispose de deux signaux d'entrée, l'horloge interne de la carte FPGA, le reset, et de 13 sorties, qui vont être connectées à la matrice à LED. Nous avons ici les six données de couleurs, le, clock série, qui permet de rythmer le chargement des données de couleurs, le, clock parallèle, qui permet de faire le transfert lorsque le chargement est plein, le, Enable Output, qui permet de, d'afficher ou de verrouiller l'affichage, et ligne sel, qui permet d'adresser les différentes lignes. L'architecture de, Matrix 32 fois 32 RGB, permet de lancer en parallèle l'horloge et le, scan_matrice, en leur fournissant également les différents signaux manipulés. Nous avons ici au niveau de l'horloge, le reset, le, clock_in, qui représente le clock de la carte FPGA, le, horloge_bit, qui représente la sortie de l'horloge, et qui commande le composant, scan_matrice, et nous avons ici les 13 lignes permettant de contrôler la matrice. L'entité, horloge, dispose de trois signaux, deux entrées, le clock et le reset, et une sortie, le, clock_out. Il s'agit en réalité d'un diviseur de fréquence, qui nous permet de diviser la fréquence interne, de 50 mégahertz, en une fréquence de 10 mégahertz, que nous avons choisie pour commander la matrice. Au niveau de l'architecture de l'horloge, nous avons le, Process, qui gère la division de fréquence. Il est sensible aux signaux, clock_in, qui représentent le clock interne de la carte FPGA et le reset. Et au niveau de la sortie de notre horloge, nous avons un 1, trois périodes sur cinq, et un zéro, deux périodes sur cinq. Au niveau de l'entité, scan_matrice, nous avons deux ports d'entrée, le clock et le reset, et 13 ports permettant de commander le composant, Matrix 32 fois 32 RGB. Ce shéma illustre les signaux de sortie de, scan_matrice, qui vont commander les ports de, Matrix RGB 32 fois 32. Et au niveau de l'architecture de, scan_matrice, nous avons le, clock série, qui rythme le chargement des données, le, clock_parallel, le Enable Output, le, Count, qui permet de gérer le chargement au niveau des lignes, et le délai d'attente, aussi, au niveau de l'affichage, et les lignes qui permettent d'adresser les différentes lignes. Au niveau de ce process, chaque front montant de l'horloge, ici, si le compteur atteint la valeur 1 023, le compteur est réinitialisé, sinon, le compteur est incrémenté. Et lorsque le compteur atteint la valeur 1 023, on scrute les lignes. Si la ligne atteint la valeur 15, la ligne est réinitialisée, sinon la ligne est incrémentée. La dernière partie du process permet de gérer les signaux de contrôle. Si le compteur est inférieur à 32, le clock série est mis à 1, sinon le clock série est mis à zéro. Si le compteur est égal à 32, le clock parallèle est mis à 1, sinon le clock parallèle est à zéro. Et si le compteur est supérieur à 32, le, output enable, est mis à 1, sinon le, output enable, est mis à zéro. Nous allons terminer ce projet par le chargement des données de couleur et la génération des signaux de contrôle, dans un process pour afficher des motifs fixes avec un opérateur, ET logique. Pour la génération des signaux de contrôle, un, ET logique, avec le, clock in, permet d'avoir d'avoir des fronts sur clock série et un, ET logique, avec le, clock parallèle, permet d'avoir également des fronts sur le clock parallèle. Il faut noter l'inversion de, output enable, puisqu'il est activé niveau bas. Pour la gestion des chargements des données de couleur, nous avons voulu avoir des motifs fixes, avec des damiers de tailles différentes, en fonction des couleurs, et nous avons fait un, ET logique, entre le bit zéro de, count, et de bit zéro de ligne ; le bit 1 de, count, et le bit 1 de ligne, le bit 2 de, count, et le bit 2 de ligne. La même chose est répétée sur la deuxième moitié de la matrice. Ceci produira des motifs fixes, de couleurs différentes, et de tailles différentes. Nous avons simulé avec Modelsim le projet, et voici les chronogrammes des signaux, qui montrent, ici, que toutes les LED sont éteintes, les données de couleur sont toutes à zéro, sur la première ligne. Nous avons au niveau de la ligne une, la deuxième ligne, des chargements de la couleur rouge, une fois sur deux. Au niveau de la ligne 2, nous avons des chargements de la couleur verte, deux fois sur quatre. Nous avons, ici, au niveau de la ligne 3, un mélange de couleur rouge et de couleur verte, une fois sur deux, deux fois sur quatre. Et au niveau de la ligne 4, nous avons un chargement de la couleur bleue, quatre fois sur huit. Un zoom sur le chargement de la ligne une, et de la ligne 17 montre ici le, latch, qui est activé lorsque le registre atteint la valeur 32, c'est-à -dire que le registre est plein, et l'activation de, oe, activé niveau bas, ici, pour afficher les données chargées. Nous allons maintenant ajouter au projet une mémoire pour les données à afficher sur chaque pixel. Nous avons intégré au projet un composant, memoire_vive, qui fournit au composant, scan_matrice, les données de couleur et les données d'adresse. Cela a nécessité quelques modifications de, scan_matrice, et de, matrix RGB, que nous venons de présenter. Au niveau des modifications sur le composant, matrix RGB, nous avons ajouté, ici, une adresse et une donnée. L'adresse est représentée, ici, sur neuf bits, pour avoir les 512 pixels de chaque moitié, et les données sur six bits pour les six données de couleur. Matrix RGB permet d'instancier les deux composants, memoire_vive, scan_matrice, et l'horloge qui n'est pas représentée, ici, puisqu'elle n'est pas modifiée. Au niveau de l'entité, scan_matrice, nous avons ajouté l'adresse, représentée sur les neuf bits, et les données, représentées sur les six bits. Des modifications ont été apportées au niveau du process qui gère le chargement des données et la génération des signaux de contrôle. Le chargement des données au niveau de, scan_matrice, et des adresses provient de la mémoire. Les cinq bits de poids faible de l'adresse correspondent aux cinq bits de poids faible du compteur. Et les quatre bits de poids fort de l'adresse correspondent aux quatre bits des lignes d'adresse. Le chargement des données de couleur se fait à travers le vecteur, data, fourni par la mémoire. Et la génération des signaux de contrôle n'a pas changé. Au niveau de l'entité, mémoire, nous avons l'adresse, ici, et le, output, en plus du, clock, et du reset. L'adresse qui est représentée sur les neuf bits et le, output, qui va fournir les données sur six bits. L'architecture utilise ici une mémoire, MEM, qui est un tableau de 512 éléments et que chaque élément contient six bits. Ce tableau permet d'adresser et de charger les données de chaque pixel de la matrice. Il faut noter que le chargement des données peut se faire avec un processeur, NIOS, interne de la carte FPGA ou bien fourni par un micro contrôleur. Un deuxième processus permet de charger à chaque front descendant de l'horloge les six données de couleur, pour chaque pixel. Et enfin, nous pouvons, ici, faire le chargement des données et modifier les données de la mémoire, au niveau de cette section. Voici les résultats des tests que nous avons effectués sur la matrice 32 fois 32. Comme vous pouvez le constater, sur la première ligne que nous appellerons la ligne zéro, toutes les LED sont éteintes. Sur la colonne zéro, également, toutes les LED sont éteintes. Sur la ligne une, nous avons une LED sur deux qui est allumée en rouge. Sur la ligne 2, nous avons deux LED sur quatre qui sont allumées en vert. Sur la ligne 3, nous avons un mélange au niveau de ce pixel. Sur la ligne 4, nous avons quatre LED bleues sur huit qui sont allumées. Remarquez qu'une combinaison des trois couleurs donne la couleur blanche. Il faut remarquer aussi que les mêmes motifs se reprennent, au niveau des lignes et au niveau des colonnes. Nous venons d'aborder la commande d'une matrice à LED, avec une carte FPGA. Après une présentation de la matrice, nous vous avons proposé un projet qui permet de contrôler une matrice RGB, avec une carte FPGA. Nous avons par la suite intégré la gestion du chargement des données, à travers une mémoire, qui peut être chargée par un composant externe, tel qu'un micro contrôleur, ou un processeur interne de la carte, un processeur, NIOS. On peut maintenant envisager une extension de l'application, en chaînant plusieurs matrices, ce qui nécessiterait une vitesse de contrôle plus élevée, à l'image des grands murs de LED ou des grands afficheurs qui sont, effectivement, commandés par des cartes FPGA.