Sur notre radio logicielle, deux composants font l'essentiel : un FPGA (qui embarque aussi deux processeurs ARM), le Zynq 7010, collé à une puce radio, l'AD9363. Le reste de ce billet, c'est ce qu'on peut vraiment en tirer.
01
Le FPGA
Le Zynq 7010 réunit deux mondes sur une même puce. D'un côté, deux cœurs ARM Cortex-A9 à 667 MHz et un petit Linux : le logiciel classique. De l'autre, de la logique qu'on câble soi-même, fil à fil.
- Cellules logiques (LUT)
- 17 600
- Bascules
- 35 200
- Multiplieurs matériels (DSP)
- 80
- Mémoire rapide (Block RAM)
- 270 Ko
- Processeur
- 2 × ARM Cortex-A9 @ 667 MHz
Ces 80 multiplieurs sont le nerf de la guerre : ils calculent tous en même temps, à chaque coup d'horloge. C'est ce qui permet de faire vivre toute la chaîne de mesure (corrélateur, mélangeurs, asservissement) directement dans le matériel, au rythme des échantillons, sans jamais attendre un processeur. C'est petit, mais c'est entièrement à nous, et déterministe à la nanoseconde.
Pas évident de voir ce qu'on peut faire avec toutes ces tables de vérité ; c'est vrai qu'on pourrait faire des trucs classiques de traitement de données, ou de triage de paquets, ou autres. Mais essayons autre chose : et si on essayait un modèle neuronal ? La question qu'on se pose forcément. D'abord, pourquoi ? La structure du FPGA n'est pas forcément adaptée, et c'est d'autant plus complexe d'ajuster les paramètres du modèle, comme sa température ou autres ; le temps d'inférence en vaut-il vraiment la peine ? Et surtout, quelle taille max ?
Sur un FPGA, la vraie question n'est pas la puissance, c'est la latence. Un perceptron minuscule, quatre entrées, huit neurones, une sortie, c'est une quarantaine de multiplications. La puce en a 80, câblées en dur : on pourrait faire tout le réseau d'un coup, en quelques coups d'horloge. Une inférence en quelques dizaines de nanosecondes, une nouvelle à chaque cycle si on l'enchaîne, et toujours le même temps, sans cache ni système.
On l'a bien fait tourner, mais sur un cœur ARM de la puce, à 2,3 microsecondes par inférence : un processeur qui aligne les multiplications l'une après l'autre. La logique, elle, les ferait toutes en même temps, cent fois plus vite. C'est tout l'intérêt d'un FPGA.
Quant à la taille : 80 multiplieurs et 270 Ko de mémoire, ça borne à un petit réseau quantifié, pas un transformeur. Mais c'est bien assez pour notre besoin, prédire la phase pendant le court instant où la carte n'écoute pas, voire pour un réseau de graphes sur la poignée de nœuds que sont nos cartes.
02
La puce : AD9363, ou AD9361 ?
La radio elle-même tient dans une seule puce, l'AD9363, de la famille AD936x d'Analog Devices, celle qui équipe le Pluto et quantité de cartes SDR. Détail amusant : l'AD9361, l'AD9363 et l'AD9364 sont le même silicium. Le fondeur les trie selon leurs performances en haut du spectre, puis les marque différemment. L'AD9363 est le plus modeste sur le papier : garanti de 325 MHz à 3,8 GHz, une vingtaine de mégahertz de bande.
D'où la combine connue : dire au pilote que c'est un AD9361. Une ligne dans le device tree, et la carte ouvre 70 MHz à 6 GHz et jusqu'à 56 MHz de bande. Comme c'est la même puce, ça marche souvent très bien. Mais le tri n'est pas arbitraire : hors de la plage garantie, plus rien n'est promis, et pour une mesure de temps fine, la bande réellement exploitable est restée modeste sur nos exemplaires. C'est justement le mur sur lequel le projet a buté plus tard.
Sur la carte, la grosse puce sombre est le FPGA ; l'AD9363, bien plus petite, se niche juste devant les connecteurs SMA. Le reste, c'est de l'alimentation et quelques filtres.
03
Pourquoi des câbles, et le scotch cuivre
Sur le banc, le signal passe d'une carte à l'autre par un câble, avec un atténuateur, pas par l'air. Ça paraît contre-intuitif pour un projet de radio sans fil, mais c'est volontaire : un câble donne un couplage propre, stable et reproductible, et isole le comportement du firmware de tout ce que la pièce ajoute.
Car l'air, ici, est un piège. Deux cartes sur la même fréquence : chacune s'entend elle-même fuir en interne, d'une vingtaine de décibels, ce qui simule un lien qui n'est en réalité qu'un bavardage avec soi-même. La masse partagée par l'USB devient une antenne et une référence de phase accidentelles. Ajoutez les trajets multiples et l'évanouissement. Beaucoup de premiers résultats étaient des artefacts de ce genre. Le seul test honnête en l'air : couper une carte et vérifier que l'autre l'entend pour de bon.
Le scotch cuivre sert à ça : un blindage de fortune qui étouffe les couplages parasites et la fuite interne, pour des mesures qu'on peut croire.
Le boîtier qui protège tout ça, justement, sort de l'imprimante 3D posée à côté du banc.
04
La toile
Voilà le support : minuscule, un peu bricolé, et largement suffisant pour faire de la vraie radio distribuée. Les prochains billets ouvrent les mécanismes qui tournent dessus, à commencer par le two-way time transfer. La page du projet en donne la vue d'ensemble.