Le bus : servir chaque cycle de la 6502
Tout commence ici : à chaque cycle, la 6502 demande un octet, et le RP2040 doit répondre à temps. Comment Eliott65 est passé de 0,3 MHz à 8 MHz, et pourquoi les cœurs ARM ne participent plus.
Dans cette page
Le problème à résoudre
À chaque cycle d’horloge, la 6502 place une adresse sur ses broches et attend une donnée (lecture) ou en propose une (écriture). Sur la Neo6502kbd, c’est le RP2040 qui doit, dans le même cycle :
- lire l’adresse, en deux moitiés, à travers deux des tampons ;
- trouver l’octet correspondant dans le tableau de 64 Kio qui joue la mémoire de la 6502 ;
- le présenter à travers le troisième tampon, ou recopier l’octet écrit par la 6502 ;
- produire les fronts de l’horloge PHI2.
Le tout plusieurs millions de fois par seconde, sans jamais se tromper ni prendre de retard.
Les outils du RP2040 : PIO et DMA
Le RP2040 possède deux blocs PIO : de minuscules processeurs spécialisés, qui exécutent des programmes de quelques instructions au rythme de l’horloge système et pilotent les broches avec une précision d’un cycle. Il possède aussi un contrôleur DMA, qui copie des données d’un endroit à l’autre de la mémoire sans occuper les cœurs ARM.
Première version : la PIO et un cœur ARM (v0.2)
Au premier démarrage, la PIO lisait l’adresse et la passait à un cœur ARM, qui allait chercher l’octet et le rendait à la PIO. La 6502 a démarré du premier coup : test de 52 Kio de mémoire sans erreur, somme de contrôle juste.
Puis il a fallu accélérer. Les mesures racontent l’histoire :
| Réglage | Vitesse de la 6502 |
|---|---|
| RP2040 à 125 MHz, PIO prudente | ≈ 0,3 MHz |
| PIO à pleine vitesse | 2,0 MHz |
| RP2040 à 200 MHz | 3,4 MHz |
| RP2040 à 252 MHz | 4,3 MHz |
| boucle ARM allégée, délais réduits | 6,26 MHz |
Au-delà, rien ne bougeait : l’aller-retour entre la PIO et le cœur ARM coûtait environ 40 cycles du RP2040 par cycle de la 6502. C’était le goulot d’étranglement.
Ce que la fiche technique dit vraiment
Une question revenait : « cette 6502 ne monte-t-elle pas à 14 MHz ? » La fiche de WDC est claire. Les 14 MHz sont garantis sous 5 V. Sous 3,3 V, la tension de la carte, la garantie est de 8 MHz, avec des phases d’horloge d’au moins 62 ns.
Or notre réglage à 6,26 MHz laissait une phase basse de 16 à 32 ns seulement : il marchait, mais hors spécification. Les essais ont aussi montré que la vraie limite venait de la 6502 elle-même : il lui faut environ 32 ns après la descente de l’horloge pour présenter une adresse valide.
D’où la règle pour la suite : lire l’adresse pendant la phase basse, servir la donnée pendant la phase haute, comme la fiche le décrit.
Combien cette puce tient-elle vraiment ?
Un banc séparé a mesuré la limite de notre exemplaire : la PIO seule répond NOP à toutes les
lectures, et la fréquence monte par paliers jusqu’à l’échec.
- Cette 6502 tourne au moins à 10,5 MHz sous 3,3 V, bien au-delà des 8 MHz garantis.
- Ce qui la fait échouer n’est pas la fréquence, mais la largeur de la phase haute : 12 ns passent, 8 ns échouent, même à vitesse lente.
Le banc ne teste que des lectures de NOP : les écritures et les instructions complexes restaient à
valider avec le vrai bus.
La version actuelle : PIO + DMA, sans cœur ARM (v0.3)
Le bus d’Eliott65 ne fait plus intervenir aucun cœur ARM. Pour chaque cycle :
- pendant la phase basse, la PIO lit l’adresse et fabrique un petit descripteur de transfert (d’où copier, où copier) ;
- un premier canal DMA recopie ce descripteur dans la configuration d’un second canal ;
- le second canal transfère un octet : de la mémoire de la 6502 vers la PIO pour une lecture, de la PIO vers la mémoire pour une écriture ; puis il réarme le premier.
Une astuce rend les écritures possibles : pour copier « la valeur d » avec une DMA qui ne sait
copier que des adresses, Eliott65 garde une table de 256 octets où l’octet numéro d vaut d.
Copier depuis l’adresse table + d, c’est copier la valeur d.
Premier essai sur la carte : tout fonctionne. Et les deux cœurs ARM sont désormais libres, l’un pour le noyau, l’autre pour la vidéo.
Les modes de vitesse
Les délais de la PIO se règlent à la compilation. Trois réglages sont proposés :
| Mode | Vitesse mesurée | Ce qu’il garantit |
|---|---|---|
| SPEC | 6,48 MHz | respecte la fiche WDC à la lettre |
| TURBO (défaut) | 7,52 MHz | une marge d’un cycle sur la limite mesurée |
| MAX | 8,00 MHz | à la limite, sans marge |
Au-delà, deux échecs ont été observés, chacun avec sa cause : à 8,50 MHz l’adresse est lue trop tôt, à 8,37 MHz la donnée arrive trop tard avant la descente de l’horloge.
Ces chiffres ont été mesurés à 252 MHz. À 270 MHz, les mêmes délais vont plus vite : la 6502 a mesuré 7,72 MHz, vidéo allumée (v0.52.0), puis 7,707 MHz avec la marge ajoutée plus bas (v0.59.1).
270 MHz : une marge qui disparaît (v0.52.1)
Après le passage à 270 MHz, un défaut est apparu sur la carte : la démonstration GRAPHE cesse d’appeler le noyau au bout de quelques minutes. La 6502 tourne encore, mais ne fait plus rien d’utile ; une fois, le hub USB a compté 10 appareils au lieu de 4. Cause inconnue au départ.
Sans carte pour la séance suivante, l’enquête s’est faite au modèle du bus de l’émulateur. Le modèle reproduit d’abord les mesures connues à 252 MHz (les réglages qui passent et ceux qui échouent), puis il est poussé à 270 MHz, contrainte par contrainte. Une seule perd sa marge : la bascule des tampons 74LVC245 qui séparent l’adresse et la donnée sur la carte.
- Le firmware laisse 4 cycles avant de lire l’adresse après la bascule. Les mesures à 252 MHz placent le temps de bascule de ces tampons entre 11,9 et 15,9 ns.
- À 270 MHz, 4 cycles ne font plus que 14,8 ns : si les tampons de cette carte sont lents, une adresse est lue fausse de temps en temps.
- Correction candidate : un cycle de plus au-dessus de 252 MHz (18,5 ns). Coût prédit : environ 3 %, soit 7,49 MHz au lieu de 7,72, toujours plus vite qu’à 252 MHz.
Sur la carte (v0.59.1). La correction est dans le firmware flashé, et la 6502 mesure 7,707 MHz (trois mesures concordantes). Le coût réel n’est que de 0,1 %, contre 2,9 % prédits : on ne sait pas pourquoi le modèle surestime ce coût. L’émulateur a été recalé sur cette mesure. GRAPHE tourne désormais sous la surveillance de la sonde sans fil, qui relève seule chaque seconde le nombre d’appels au noyau et figera l’état de la machine s’il cesse d’avancer : le résultat n’est pas encore connu.
Mesurer sans voir passer les cycles
Petit casse-tête : comment compter les cycles quand aucun cœur ne les voit plus ? Un compteur matériel branché sur la broche d’horloge ne voit rien, puisque la broche appartient à la PIO. La solution retenue : une machine PIO supplémentaire suit l’horloge et décompte, et le cœur 1 relève son compteur.
Pour aller plus loin : Les appels système, qui reposent sur la même mécanique.