Le processeur et le bus
Trois composants forment le cœur de la machine : le processeur, la mémoire, et le contrôleur système qui les fait travailler ensemble. C’est ce trio que la carte de validation doit d’abord prouver.
Dans cette page
Le W65C816S
Le processeur est un W65C816S de WDC, en boîtier DIP40 ou PLCC44, utilisé en mode natif 65816 (16 bits). Il est alimenté en 3,3 V, comme tout le reste de la machine. En 3,3 V, sa vitesse maximale est de 8 MHz (un cycle de 125 ns au moins) ; les essais démarreront plus lentement, entre 2 et 4 MHz. Avec la mémoire choisie (voir ci-dessous), la vitesse effective dépendra des accès : voir La vitesse, estimée puis mesurée.
La mémoire : 16 Mo de PSRAM, pas de ROM
Toute la mémoire est faite de deux PSRAM APS6404L de 8 Mo chacune, soit 16 Mo : tout l’espace d’adressage 24 bits du 65816. Une PSRAM se pilote par une liaison série rapide à quatre fils de données, le QSPI. Il n’y a pas de ROM : le code de démarrage est écrit en PSRAM avant que le processeur ne démarre.
La PSRAM n’est reliée qu’à la 9K, qui devient le contrôleur mémoire. Le processeur ne la voit jamais directement : à chaque accès, la 9K lit ou écrit la PSRAM pour lui, et prolonge la phase haute de l’horloge le temps de l’opération.
Le premier choix était une SRAM parallèle de 2 Mo (IS61WV20488) ; la décision de passer à 16 Mo de PSRAM date du 15 octobre 2026.
Le contrôleur système (« la 9K »), maître du bus
Le contrôleur système est un FPGA Gowin GW1NR-LV9QN88P, soudé directement sur la carte : c’est la puce de la Tang Nano 9K de Sipeed, sans le module. La spécification continue de l’appeler « la 9K ». Il :
- fabrique l’horloge PHI2 du processeur, avec sa PLL, à partir d’un quartz de 27 MHz placé sur la carte ;
- capture la banque (les 8 bits hauts de l’adresse) à chaque cycle ;
- décode les adresses : elle sait si un accès vise la mémoire, ses propres registres, la vidéo, le Pico ou l’extension ;
- sert la mémoire : c’est le seul circuit relié à la PSRAM, en QSPI ;
- produit le son et fait des transferts de mémoire (DMA).
La règle du bus
Le 65816 n’a que 16 broches d’adresse. Pendant la phase basse de l’horloge, il pose la banque (A16 à A23) sur ses broches de données D0 à D7. D’où trois règles :
- Personne d’autre que le processeur ne pilote le bus de données pendant la phase basse.
- La 9K capture la banque juste avant la montée de l’horloge.
- Pendant la phase haute, la 9K sert l’accès : elle lit ou écrit la PSRAM et, en lecture, pose la donnée sur D0 à D7 ; elle prolonge la phase haute le temps de l’accès.
Enfin, chaque accès est qualifié par les signaux VDA ou VPA du processeur : les cycles où ni l’un ni l’autre n’est actif sont des cycles « fantômes », que la 9K ignore.
Les contraintes à ne pas oublier
- RDY n’est jamais piloté en sortie active : l’instruction
WAIdu 65816 tire elle-même cette ligne à l’état bas. Elle est reliée à la 9K en drain ouvert, avec une résistance de tirage. - IRQB et NMIB, les deux lignes d’interruption, sont tirées en drain ouvert par la 20K, le Pico et l’extension, sans passer par la 9K : c’est un « ET câblé ».
- ABORTB a obligatoirement une résistance de tirage vers le 3,3 V.
- Au démarrage, RESB et BE sont tirés vers la masse : le processeur reste en reset et hors du bus jusqu’à ce que la 9K le libère.
Le brochage complet est dans Brochage du W65C816S.
Pourquoi une puce soudée plutôt qu’un module
Le projet prévoyait d’abord le module Tang Nano 9K sur des barrettes. Le relevé de son brochage, le 15 octobre 2026, a montré qu’il n’offre que 29 entrées-sorties en 3,3 V utilisables directement (37 après une modification du module). Or le contrôleur en demande 47 : les 44 du budget initial, plus les adresses A5 à A7, sans lesquelles la 9K ne peut pas adresser la SRAM pendant le DMA audio. Même avec les replis prévus (SRAM de 512 Ko, codec sur le Pico), cela ne tenait pas.
Sept options ont été comparées : modules Tang Nano 9K et 20K, puce GW1NR-9 soudée, FPGA ECP5 soudé, module Tang Primer 20K, Cmod A7 de Digilent, RP2350B. Décision du 15 octobre 2026 : souder la puce de la Tang Nano 9K directement sur la carte.
- Rien ne change côté logique : même Verilog, mêmes outils (Gowin EDA, ou Yosys, nextpnr et Apicula), même quantité de logique (8 640 LUT).
- Les 71 entrées-sorties du boîtier deviennent accessibles, dans la limite des tensions de leurs banques (voir plus bas).
- Les replis sont abandonnés : le codec reste relié à la 9K, et le DMA dispose de toutes les adresses.
- Le montage des composants par JLCPCB était déjà prévu : un boîtier QFN ne se soude pas à la main.
La vitesse, estimée puis mesurée
Le processeur donne l’adresse complète (banque comprise) 40 ns après la descente de l’horloge. La 9K peut donc lancer l’accès à la PSRAM dès la phase basse, puis prolonger l’horloge jusqu’à ce que la donnée soit prête. Un modèle, tiré des fiches techniques, donne la vitesse effective du processeur selon la fréquence de la liaison QSPI :
| Liaison QSPI | Lecture isolée | Écriture | Lecture séquentielle |
|---|---|---|---|
| 50 MHz | 2,27 MHz | 3,33 MHz | 7,14 MHz |
| 66 MHz | 2,87 MHz | 4,22 MHz | 8,00 MHz |
| 84 MHz | 3,49 MHz | 5,13 MHz | 8,00 MHz |
| 100 MHz | 4,00 MHz | 5,88 MHz | 8,00 MHz |
| 109 MHz | 4,27 MHz | 6,28 MHz | 8,00 MHz |
- Les accès isolés (données, sauts) plafonnent vers 4 MHz.
- Les lectures séquentielles (le flux d’instructions) atteignent 8 MHz dès 66 MHz de liaison, si la 9K garde la lecture ouverte d’un octet à l’autre. C’est le levier principal, et il ne demande que du Verilog.
- La vitesse moyenne dépend du mélange des accès de chaque programme.
Ce mélange a été relevé sur un vrai programme 65816 : le noyau OricOS, exécuté sous l’émulateur Phosphoric du projet Oric 2 (78 056 instructions).
| Type d’accès | Part |
|---|---|
| lecture qui suit la précédente (servie en salve) | 62,7 % |
| lecture isolée | 28,0 % |
| écriture | 6,5 % |
| entrées-sorties | 2,8 % |
D’où une vitesse moyenne attendue, sur ce programme, d’environ 6 MHz avec une liaison QSPI à 100 MHz, et de 5 MHz à 66 MHz (4,3 MHz à 50 MHz ; 6,3 MHz à 109 MHz).
Le budget de broches
Un premier bilan comptait 53 entrées-sorties générales, en supposant toutes les banques de la puce en 3,3 V. Cette hypothèse était fausse. La documentation de Gowin (UG803) montre que, sur ce boîtier, la banque 3 alimente aussi une petite PSRAM intégrée au FPGA (sans rapport avec les 16 Mo de la machine) : sa tension est imposée à 1,8 V. Ses broches ne peuvent donc pas se relier directement au bus en 3,3 V.
| Entrées-sorties du boîtier | en 3,3 V | en 1,8 V (banque 3) |
|---|---|---|
| générales | 38 | 15 |
| broches de configuration utilisables en entrées-sorties | 7 | — |
| broches de configuration dont cet usage n’est pas confirmé | 2 | — |
| réservées (JTAG, modes, entrée du quartz…) | 1 | 8 |
Deux décisions ont ensuite permis de tenir : le codec audio en 1,8 V sur la banque 3, et la PSRAM à la place de la SRAM.
| Besoin en 3,3 V | Broches |
|---|---|
| données D0 à D7 | 8 |
| adresses A0 à A15 | 16 |
| entrées de contrôle (RWB, VDA, VPA, /BUSREQ) | 4 |
| sorties (PHI2, RESB, RDY, BE) | 4 |
| PSRAM en QSPI (horloge, 4 données, 2 sélections) | 7 |
| sélections de la vidéo et du Pico | 2 |
| sélection de l’extension (/IOSEL) | 1 |
| total en 3,3 V | 42 sur 45 disponibles : marge de 3 (5 avec les broches non confirmées) |
Avec les 8 broches du codec en 1,8 V (ci-dessous), la 9K utilise 50 broches au total.
Le premier budget comptait « 4 broches pour l’I²S » : il oubliait l’horloge maître, l’I²C de commande et le reset du codec. Et la PSRAM remplace les 7 broches de la SRAM (bits d’adresse hauts, /OE, /WE) par les 7 de sa liaison QSPI, tout en supprimant la sélection /MEMSEL de l’extension. Les 7 broches restantes de la banque 3 ne devront jamais être reliées à un composant en 3,3 V : le schéma sera vérifié par domaine de tension.
Les variantes de la puce dont toutes les banques acceptent le 3,3 V existent, mais n’étaient pas en stock chez LCSC le 15 octobre 2026. Le choix de souder le FPGA sur la carte reste en vigueur.
Ce que la carte reçoit en plus
Sans le module, il faut fournir à la puce ce que la Tang Nano 9K lui apportait : un régulateur 1,2 V pour son cœur, un régulateur 1,8 V pour la banque 3 et la PSRAM interne du FPGA, le quartz de 27 MHz, un connecteur JTAG 1 × 8 en 1,8 V et les condensateurs de découplage. Le FPGA se configure depuis sa flash interne, programmée par JTAG. Comme le JTAG est sur la banque 3, en 1,8 V, le projet a retenu une sonde qui accepte cette tension, la Tigard, pilotée par openFPGALoader (alternative : Digilent JTAG-HS2).
Le raisonnement complet et le comparatif sont dans le dépôt : docs/choix-controleur-systeme.md.