Préambule:
Comme évoqué plus avant, afin de programmer les CPLD j'utilise la suite WINCUPL d'ATMEL. Le langage de programmation associé est spécifique, mais relativement simple à appréhender. Il est suffisamment documenté sur Internet et notamment sur le site de MICROCHIP qui commercialise les ATF1508 retenus.
Signaux de synchronisation
Avant toute chose, il faut réfléchir à ce qu’il possible de faire en terme d'organisation des transactions temporelles sur la mémoire. Après tout il s'agit d'un périphérique partagé entre le processeur, la génération de la vidéo et la mémorisation de la vidéo texte du TRS-80.
Si je souhaite afficher un octet issu de la mémoire avec une horloge de 15MHz j’ai besoin de d’une lecture toutes les 8/15 = 533ns ce qui me laisse 8 créneaux temporels de 66ns.
Je créé donc un compteur de cycles mémoire que je nomme MCY qui viendra définir quelle action peut être exécutée pour chacun de ces cycles. Les signaux générés par ces compteurs seront distribués aux deux CPLD afin qu'ils soient bien synchronisés.
Les signaux vidéo seront fabriqués par sérialisation des octets lus bit à bit sur les lignes Rouge, Vert, Bleu, ainsi que sur celle du quatrième plan vidéo.
Création du compteur de cycles synchrone à l’aide de bascules T :
CPLD ADRESSES
NODE [MCY2..0] ; /* DECLARATION DES BASCULES */
MCY0.t = ‘b’1 ; /* COMPTEUR DE CYCLES MEMOIRE */
MCY1.t = MCY0 ;
MCY2.t = MCY1 & MCY0 ;
MCY0.ck = !CLK ; /* INCREMENTATION SUR L’HORLOGE 15MHZ */
MCY1.ck = !CLK ;
MCY2.ck = !CLK ;
Il est important que les deux CPLD soient rigoureusement synchrones, il s’agit de présenter les données bien en phase avec les adresses. Malgré plusieurs tentatives je n’ai pas réussi à réaliser cette synchronisation avec un seul signal. Je me suis donc résolu à sortir directement ces trois signaux d’un CPLD à l’autre. Dans ce cas le retard est fixe et inférieur au temps de propagation de 10ns.
Afin de les raccorder aux entrées-sorties, la déclaration des bascules devient donc la suivante :
CPLD ADRESSES
PIN = MCY0 ; /* Déclaration des bascules */
PIN = MCY1 ;
PIN = MCY2 ;