Size: 12727
Comment:
|
← Revision 14 as of 2008-03-05 07:37:35 ⇥
Size: 294
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
= Objectifs = L'objectif du projet est de réaliser un "économiseur d'écran multi-écrans". Le travail sera réparti entre 2 binomes. Le premier binome étant en charge de la gestion des écrans, le deuxième binome étant en charge de la communication entre les écrans. |
|
Line 5: | Line 3: |
Le système final à réaliser sera le suivant : deux écrans vidéo seront pilotés par deux maquettes Xilinx nommées "MMaster" et "MSlave". Un triangle se déplacera lentement sur l'espace constitué des deux écrans considérés. En mode test, une mire pourra être utilisée pour vérifier le fonctionnement de la génération des signaux graphiques. == Modules à réaliser == . Le circuit FPGA de chacune des maquettes contiendra les modules suivants : * MMaster * '''vga_gen''' : Module de génération de signaux de synchronisation pour un écran en mode VESA 800x600 (600 lignes de 800 pixels) avec fréquence pixel de 50Mhz. * '''mire''' : Génération d'une mire (cadrillage de lignes espacées régulièrement sur l'écran) permettant de vérifier le bon fonctionnement de vga_gen. La sélection ddu mode mire se fera via un bouton de la carte FPGA. * '''triangle_gen''' : Module de génération des sommets d'un triangle se déplaçant lentement dans un espace 1600x600 (600 lignes de 1600 pixels) correspondant aux deux écrans considérés. Les sommets du triangle rebondirons sur les bords de l'espace considéré (lois de descartes). Les sommets du triangle évoluerons "lentement" (par exemple tous les 1/10eme de seconde) * '''inside_triangle''' : Module de test permettant de savoir si les coordonnées courantes d"un point de l'écran sont à l'intérieur ou à l'extérieur du triangle courant. Le résultat obtenu (O/1) commandera directement l'affichage (blanc ou noir de l'écran). * '''send_coord''': Module de ''transmission'' permettant d'envoyer les coordonnées courantes du triangle à la carte MSlave. Le protocole de transmission est un protocole série pour minimiser les fils nécessaires. * MSlave * '''vga_gen''' : Module identique au précédent * '''mire : '''module identique au précédent * '''inside_triangle''' : Module identique au précédent * '''recv_coord''' : Module de ''réception'' permettant de recevoir les coordonnées du triangle en provenance de la carte MMaster. Dans une première étape, * le binome 1 est en charge des modules ('''vga_gen et mire''') et devra démonter le bon fonctionnement de la génération vidéo. * le binome 2 est en charge des modules '''send_coord''' et '''recv_coord''' et devra démontrer que ces deux modules, rebouclés sur une même maquette sont à même de transmettre les données voulues. Dans une deuxième étape, * Les binomes se répartirons le travail entre "'''triangle_gen'''" et "'''inside_triangle'''"... == Cahier des charges des modules == Les différents modules devront respecter les interfaces et protocoles suivants: * '''Tous les modules''' seront réalisés en '''logique synchrone''' (pas de bloc combinatoire) de manière à bien sépararer les tâches. * '''Toutes les sorties''' des modules seront constituées de registres ('''bacules D''') fonctionnant avec l'horloge 50Mhz (clk_50) des cartes * Lorsque des données "signées (en complément à 2) sont nécessaires, la syntaxe Verilog correspondante est '''reg (ou wire) signed [xxx:yyy]toto''' * '''vga_gen''' ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_50 ||entrée ||1 ||horloge 50 Mhz active sur front montant || ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||rgb_in[2:0] ||entrée ||3 || Couleur entrante || ||hsync ||sortie ||1 || Synchro horizontale respectant les timings VESA 800x600 72Hz|| ||vsync ||sortie ||1 || Synchro verticale respec|| ||rgb_out[2:0] || sortie || 3 || Couleur sortante (=couleur entrante + blanking)|| ||xcmpt[15:0] ||sortie ||16 || Compteur définissant la position horizontale du pixel courant, doit valoir 0 pour le premier pixel affichable et doit valoir 799 pour le dernier. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable)|| ||ycmpt[15:0] || sortie || 16|| Compteur définissant la position verticale du pixel courant, doit valoir 0 pour la première ligne affichable et 599 pour la dernière. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable) || Quelques Liens sur l'affichage VGA:(la version choisie est Vesa 800x600 @ 72Hz) |
Quelques Liens sur l'affichage VGA: |
Line 50: | Line 6: |
* '''mire''' ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_50 ||entrée ||1 ||horloge 50 Mhz active sur front montant || ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||xcmpt[15:0] ||entrée ||16 || Compteur définissant la position horizontale du pixel courant, doit valoir 0 pour le premier pixel affichable et doit valoir 799 pour le dernier. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable)|| ||ycmpt[15:0] || entrée || 16|| Compteur définissant la position verticale du pixel courant, doit valoir 0 pour la première ligne affichable et 599 pour la dernière. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable) || ||rgb_out[2:0] ||sortie ||3 || Couleur sortante || * '''triangle_gen''' ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_50 ||entrée ||1 ||horloge 50 Mhz active sur front montant || ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||x0[15:0] ||sortie ||16 || abcisse courante du sommet 0 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y0[15:0] ||sortie ||16 || ordonnée courante du sommet 0 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x1[15:0] ||sortie ||16 || abcisse courante du sommet 1 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y1[15:0] ||sortie ||16 || ordonnée courante du sommet 1 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x2[15:0] ||sortie ||16 || abcisse courante du sommet 2 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y2[15:0] ||sortie ||16 || ordonnée courante du sommet 2 (doit rester comprise entre 0 et 599) (nombre signé)|| ||newdata ||sortie || 1 || Drapeau indiquant que les coordonnées du triangle ont été mises à jour, ce signal ne doit durer qu'un seul cycle de l'horloge "clk_50" || * '''inside_triangle''' ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_50 ||entrée ||1 ||horloge 50 Mhz active sur front montant || ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||x0[15:0] ||entrée ||16 || abcisse courante du sommet 0 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y0[15:0] ||entrée ||16 || ordonnée courante du sommet 0 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x1[15:0] ||entrée ||16 || abcisse courante du sommet 1 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y1[15:0] ||entrée ||16 || ordonnée courante du sommet 1 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x2[15:0] ||entrée ||16 || abcisse courante du sommet 2 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y2[15:0] ||entrée ||16 || ordonnée courante du sommet 2 (doit rester comprise entre 0 et 599) (nombre signé)|| ||xcmpt[15:0] ||entrée ||16 || Compteur définissant la position horizontale du pixel courant, doit valoir 0 pour le premier pixel affichable et doit valoir 799 pour le dernier. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable)|| ||ycmpt[15:0] || entrée || 16|| Compteur définissant la position verticale du pixel courant, doit valoir 0 pour la première ligne affichable et 599 pour la dernière. On utilisera une représentation '''signée''' (le compteur sera négatif avant la zone affichable) || ||inside || sortie ||1 || Drapeau indiquant si le pixel courant est dans le triangle || * '''send_coord''' Le protocole de transmission des coordonnées entre les deux cartes FPGA est un protocole série (transmission bit à bit des 6*16bits de coordonnées). Deux signaux sont à générer. Le premier '''clk_serie''' est une horloge de transmission utilisable par le recepteur pour échantillonner les données. Elle sera obtenue par une simple division de fréquence à partir de clk_50 , le facteur de division retenu sera de 2048. Le deuxième signal "data_serioe" servira à la transmission bit à bit des coordonnées. Les deux signaux doivent respecter les chronogrammes suivants (l'important étant de garantir la stabilité des données lorsque clk_serie passe 0 à 1): Pour indiquer au recpeteur le début d'une transmission, il faudra respecter les règles suivantes : * le signal '''clk_serie''' est toujours actif * au reset le signal '''data_serie''' doit être forcé à '''1''' * L'envoi d'un bit à '''0''' détermine le début d'une transmission * les 6*16bits sont transmis bit à bit * à la fin de la transmission le signal '''data_serie''' doit revenir à '''1''' * Le récepteur connait implicitement le nombre de bits à recevoir. ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_50 ||entrée ||1 ||horloge 50 Mhz active sur front montant || ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||x0[15:0] ||entrée ||16 || abcisse courante du sommet 0 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y0[15:0] ||entrée ||16 || ordonnée courante du sommet 0 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x1[15:0] ||entrée ||16 || abcisse courante du sommet 1 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y1[15:0] ||entrée ||16 || ordonnée courante du sommet 1 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x2[15:0] ||entrée ||16 || abcisse courante du sommet 2 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y2[15:0] ||entrée ||16 || ordonnée courante du sommet 2 (doit rester comprise entre 0 et 599) (nombre signé)|| ||newdata ||entrée ||1 || Drapeau indiquant que de nouvelles coordonnées du triangle sont disponibles, ne dure qu'un seul cycle de clk_50|| ||clk_serie|| sortie || 1 || Horloge de transmission pour le protocole série || ||data_serie || sortie || 1 || donnée série sortie au rythme de clk_serie || * '''rcv_coord''' ||'''Nom''' ||'''Type''' ||'''Bits''' ||'''Fonction''' || ||clk_serie|| entrée || 1 || Horloge de transmission pour le protocole série acive sur le front montant|| ||rst_n ||entrée ||1 || réinitialisation active sur état bas || ||data_serie || entrée|| 1 || donnée série recue au rythme de clk_serie || ||x0[15:0] ||sortie ||16 || abcisse courante du sommet 0 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y0[15:0] ||sortie||16 || ordonnée courante du sommet 0 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x1[15:0] ||sortie ||16 || abcisse courante du sommet 1 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y1[15:0] ||sortie ||16 || ordonnée courante du sommet 1 (doit rester comprise entre 0 et 599) (nombre signé)|| ||x2[15:0] ||sortie ||16 || abcisse courante du sommet 2 (doit rester comprise entre 0 et 1599) (nombre signé)|| ||y2[15:0] ||sortie ||16 || ordonnée courante du sommet 2 (doit rester comprise entre 0 et 599) (nombre signé)|| '''Attention''': * pour éviter des comportements aléatoires du générateur vidéo, il ne faut valider les coordonnées en réceptions qu'à la fin de la transmission. Pour cela, il faudra prévoir un "double registre" pour contenir les coordonnées. Le premier registre fonctionnera en registre à chargement série, le deuxième (qui correspondra à la sortie du bloc) sera mis à jour avec le contenu du premier juste après la réception du dernier bit. * Exceptionnelement, le bloc '''rcv_coord''' sera le seul bloc à utilisant '''clk_serie''' comme horloge principale. == Travaux suplémentaires si vous êtes forts.... == * Gérer plusieurs objets (deux triangles de couleurs différentes, l'un recouvrant l'autre partiellement) * Intégrer un objet "rond" (modification du rayon et déplacement) * Seul le contour de l'objet est à tracer... * rendre le système modulaire pour pouvoir l'étendre à 3 , 4 ou 5 écrans... |
Quelques Liens sur l'affichage VGA:
Les timings des standards VGA :http://www.epanorama.net/documents/pc/vga_timing.html
Un calculateur de paramètres VGA :http://www.tkk.fi/Misc/Electronics/faq/vga2rgb/calc.html