Maintenant qu’il est possible de mémoriser des données dans l’espace vidéo, nous allons commencer à produire l’image correspondante.
Pour cela il nous faut générer les signaux VGA : Synchronisation horizontale et verticale et les signaux Rouge, Vert et Bleu.
Synchronisation horizontale :

Il nous faut cependant adapter le nombre de pixel à notre résolution avec une ligne visible de 384 pixels. On obtient, dans le rapport de fréquence 15MHz/25,175MHz la correspondance suivante :

Afin de créer ce signal il nous faut compter les pixels nous allons utiliser les compteurs suivants :
MCY2-0 comptent les pixels d’un octet.
Nous pouvons compter maintenant les octets d’une ligne ; 480 / 8 = 60 octets. Six bascules T seront donc nécessaires pour créer un compteur synchrone qui sera remis à zéro lorsque la colonne 60 sera atteinte.
CPLD ADRESSES
NODE [MCL5..0] ; /* DECLARATION DES COMPTEURS DE COLONNE */
MCL0.d = MCY2 & MCY1 & MCY0 ; /* ON INCREMENTE LES COLONNES TOUS LES HUIT PIXELS */
MCL1.d = MCL0 & MCY2 & MCY1 & MCY0 ;
MCL2.d = MCL1 & MCL0 & MCY2 & MCY1 & MCY0 ;
MCL3.d = MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0 ;
MCL4.d = MCL3 & MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0 ;
MCL5.d = MCL4 & MCL3 & MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0 ;
MCL0.ck = !CLK ;
…
MCLx.ck = !CLK ;
MCL0.ar = MCL5 & MCL4 & MCL3 & MCL2 & !MCL1 & !MCL0 & !MCY2 & !MCY1 & !MCY0 ; /* 111100000 = $1E0 = 480 */
…
MCLx.ar = MCL5 & MCL4 & MCL3 & MCL2 & !MCL1 & !MCL0 & !MCY2 & !MCY1 & !MCY0 ;
La synchro horizontale est de polarité négative, elle passe au niveau ‘0’ à 384 + 10 = 394 ($18A) pixels et au niveau ‘1’ à 384 + 10 + 57 = 451 ($1C3).
CPLD ADRESSES
PIN = HSYNC ; /* DECLARATION DU SIGNAL DE SYNCHRONISATION HORIZONTALE */
HSYNC.d = ‘b’0 ;
HSYNC.ck = ‘b’0 ;
HSYNC.ap = MCL5 & MCL4 & !MCL3 & !MCL2 & !MCL1 & MCL0 & !MCY2 & MCY1 & !MCY0 ; /* $18A = 110001010 */
HSYNC.ar = MCL5 & MCL4 & MCL3 & !MCL2 & !MCL1 & !MCL0 & !MCY2 & MCY1 & MCY0 ; /* $1C3 = 111000011 */
Synchronisation verticale :

De la même manière que pour la synchronisation horizontale, il est nécessaire d’adapter au nombre de lignes. En effet afin de conserver des pixels carrés nous allons répéter chaque ligne une fois pour atteindre un total de 2 x 192 = 384 lignes. Nous allons également centrer ces lignes dans la zone visible. Cela nous donne 480-384 = 96 lignes soit 48 lignes de part et d’autre ce qui nous donne :

Pour générer ce signal nous avons besoin de compteurs de lignes capable d’aller jusqu’à 525 soit un compteur composé de 10 bascules T. Ce compteur s’incrémente à la fin de chaque ligne horizontale. Le compteur sera remis à zéro lorsqu’il atteindra 525 lignes ($20D).
CPLD ADRESSES
NODE [MLG9..0] ; /* DECLARATION DU COMPTEUR DE LIGNES */
MLG0.t = MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG1.t = MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG2.t = MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG3.t = MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG4.t = MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG5.t = MLG4 & MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG6.t = MLG5 & MLG4 & MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG7.t = MLG6 & MLG5 & MLG4 & MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG8.t = MLG7 & MLG6 & MLG5 & MLG4 & MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG9.t = MLG8 & MLG7 & MLG6 & MLG5 & MLG4 & MLG3 & MLG2 & MLG1 & MLG0 & MCL5 & MCL4 & MCL3 & !MCL2 & MCL1 & MCL0 & MCY2 & MCY1 & MCY0;
MLG0.ck = !CLK;
…
MLGx.ck = !CLK;
MLG0.ar = MLG9 & !MLG8 & !MLG7 & !MLG6 & !MLG5 & !MLG4 & MLG3 & MLG2 & !MLG1 & MLG0; /* $20D = 1000001101 */
…
MLGx.ar = MLG9 & !MLG8 & !MLG7 & !MLG6 & !MLG5 & !MLG4 & MLG3 & MLG2 & !MLG1 & MLG0;
Le signal de synchronisation verticale passe à un niveau ‘0’ à la ligne 384+59 = 443 ($1BB) puis revient au niveau ‘1’ à la ligne 384+59+2 = 443 ($1BD).
CPLD ADRESSES
PIN = VSYNC ; /* Declaration du signal de synchronisation horizontal */
VSYNC.d = ‘b’0 ;
VSYNC.ck = ‘b’0 ;
VSYNC.ar = !MLG9 & MLG8 & MLG7 & !MLG6 & MLG5 & MLG4 & MLG3 & !MLG2 & MLG1 & MLG0; /* $1BB = 110111011 */
VSYNC.ap = !MLG9 & MLG8 & MLG7 & !MLG6 & MLG5 & MLG4 & MLG3 & MLG2 & !MLG1 & MLG0; /* $1BD = 110111101 */
A ce stade, connecter la carte sur un écran permet, avec une grande satisfaction d’afficher un écran noir avec la reconnaissance du mode VGA 640x480 par le moniteur. En poussant un peu, et en se servant des compteurs MCLx, on peut générer des pixels dans la trame horizontale et composer une première image, juste pour le fun.


C’est plutôt encourageant.