Découvrez ce qu'est un FPGA, comment il fonctionne, ses différences avec CPU et GPU, ses avantages et inconvénients, ainsi que ses applications dans l'industrie, les télécommunications et l'intelligence artificielle. Ce guide complet vous aide à saisir pourquoi les FPGA occupent une place unique entre processeurs universels et ASIC spécialisés.
FPGA, ou "Field Programmable Gate Array", désigne une puce électronique programmable dont la logique interne peut être configurée même après sa fabrication. Contrairement à un processeur classique, où le programme s'exécute sur des cœurs prédéfinis, le FPGA permet de modifier la structure même des connexions matérielles, rendant possible la création d'un circuit numérique sur mesure pour une tâche spécifique.
L'acronyme FPGA signifie " matrice de portes programmables sur le terrain ". Ces composants occupent une place singulière à mi-chemin entre les CPU polyvalents et les ASIC dédiés : ils peuvent être reconfigurés à volonté tout en offrant des performances proches de celles d'un matériel conçu sur mesure pour certaines opérations.
Découvrons en détail ce qu'est un FPGA, comment il fonctionne, comment il est programmé, et pourquoi il peut surpasser CPU et GPU dans des contextes spécifiques.
L'appellation Field Programmable Gate Array illustre la caractéristique essentielle de cette technologie. Le terme " Field Programmable " indique que la configuration de la puce peut être modifiée après sa fabrication et son intégration dans un appareil, sans nécessiter de nouvelle production en usine.
Un FPGA se compose de nombreux petits éléments logiques programmables. Ceux-ci peuvent être configurés pour exécuter des opérations logiques et interconnectés afin de former le circuit numérique requis.
On peut comparer le FPGA à un immense jeu de construction électronique. Le fabricant fournit des blocs logiques, de la mémoire et des lignes de connexion, tandis que le concepteur choisit les blocs à utiliser et définit leurs interactions.
La plupart des circuits numériques possèdent une architecture fixe. Par exemple, un processeur dispose d'un nombre défini de cœurs, de caches et d'unités d'exécution, éléments qui ne peuvent être modifiés par logiciel. Le programme se contente de donner des instructions à ce matériel prédéfini.
Le FPGA adopte une approche différente. Après chargement de la configuration, certains éléments logiques deviennent des compteurs, d'autres des contrôleurs d'interface ou des blocs de traitement du signal, selon les besoins. Les connexions entre ces éléments sont elles aussi paramétrées par le développeur.
Modifier un projet FPGA revient donc à transformer une seule et même puce en un nouvel appareil numérique. Un jour, elle traite des flux vidéo, le lendemain, après reconfiguration, elle gère des paquets réseau ou pilote un système industriel.
Cette transformation n'implique pas le déplacement physique des transistors : leur disposition reste inchangée, seule la configuration logicielle des blocs et connexions est modifiée, ce qui redirige le parcours des signaux électriques.
Le principal atout du FPGA se manifeste dans les tâches nécessitant une latence ultra-faible ou un traitement de multiples flux de données en parallèle.
Par exemple, lorsqu'un flux de données doit traverser plusieurs étapes de traitement, il est possible de créer un pipeline matériel au sein du FPGA. Tandis qu'un fragment de données est traité à une étape, le suivant est déjà pris en charge à l'étape précédente, permettant de délivrer des résultats à chaque cycle une fois le pipeline rempli.
Autre avantage crucial : la latence prédictible. Contrairement à un processeur généraliste, le FPGA n'a pas à gérer le multitâche logiciel en continu. Si la structure du circuit est conçue pour une opération précise, le signal suit un chemin matériel bien défini.
Ainsi, les FPGA sont utilisés là où le traitement en temps réel, la réactivité élevée et la possibilité de modifier l'appareil après sa fabrication sont essentiels : équipements réseau, télécommunications, automatismes industriels, traitement vidéo, mesures, centres de données et accélérateurs spécialisés.
Au cœur du FPGA se trouvent les blocs logiques programmables, composés principalement de LUT (tables de correspondance), de bascules (flip-flops) et de logique auxiliaire. Ces composants permettent d'assembler des circuits numériques très complexes.
Un LUT fonctionne comme une petite table qui mémorise à l'avance le résultat d'une opération logique selon diverses combinaisons d'entrées. Un même bloc peut donc réaliser des fonctions logiques variées, en fonction de la configuration chargée.
Les bascules servent à stocker un bit d'état et à synchroniser le fonctionnement du circuit. En combinant LUT, bascules et autres éléments, on conçoit des compteurs, registres, automates finis, contrôleurs d'interface e t même des cœurs processeur complets.
Les éléments logiques seuls ne suffisent pas : il faut les interconnecter. Une large portion du FPGA est donc dédiée à un réseau de lignes et commutateurs programmables.
Lors de la configuration, on définit à la fois le rôle de chaque bloc logique et le trajet des signaux entre eux. Le FPGA forme ainsi un circuit numérique spécifique à la tâche.
Contrairement à un CPU où les routes entre les unités sont figées, le FPGA donne au développeur un contrôle approfondi sur la structure des calculs. Cela permet l'exécution simultanée de plusieurs opérations sur différentes parties de la puce, sans concurrence pour le même cœur processeur.
Les FPGA modernes intègrent également des composants spécialisés pour optimiser certaines opérations.
Avant de fonctionner, le FPGA reçoit un fichier de configuration (bitstream) qui définit l'état des blocs logiques, LUT, connexions et composants programmables.
À ce stade, la structure matérielle voulue est en place. C'est là que le FPGA diffère fondamentalement du CPU : là où le processeur lit et exécute les instructions séquentiellement, le FPGA, une fois configuré, possède un circuit matériel dédié à l'exécution directe des opérations.
Par exemple, pour traiter plusieurs flux de données indépendants, un FPGA peut héberger plusieurs pipelines matériels en parallèle, chacun utilisant ses propres ressources logiques.
Cette architecture permet d'atteindre des latences très faibles et prévisibles, sous réserve d'une conception optimale et d'une bonne allocation des ressources.
La programmation des FPGA diffère radicalement de celle des CPU. Au lieu d'écrire une séquence d'instructions, on décrit le circuit numérique à réaliser sur la puce.
Pour cela, on utilise des langages de description matérielle (HDL) tels que Verilog ou VHDL. Ils servent à décrire registres, opérations logiques, conditions, connexions et comportements temporels du circuit.
Le code HDL peut ressembler à un langage de programmation, mais il décrit en réalité des blocs matériels fonctionnant en parallèle, contrairement au traitement séquentiel du code classique.
Développer pour FPGA exige donc une autre façon de penser : il faut imaginer non seulement l'algorithme, mais aussi la structure matérielle qui en découlera après compilation.
Le code HDL ne peut pas être chargé directement dans le FPGA. Il subit d'abord plusieurs étapes :
La validité logique ne suffit pas : il faut aussi respecter les contraintes de temps de propagation des signaux. Si le chemin est trop long, l'opération risque de ne pas tenir dans un cycle d'horloge. Les outils analysent donc les délais pour garantir la stabilité à la fréquence visée.
Après placement et routage réussis, le bitstream est généré : c'est le fichier chargé dans la puce qui configure blocs logiques, mémoire et connexions.
En résumé, le processus est : description de la logique matérielle → synthèse du circuit → placement sur la puce → routage des signaux → création de la configuration finale.
La conception sur FPGA ne se limite plus à Verilog ou VHDL. Les technologies de High-Level Synthesis (HLS) permettent de décrire des algorithmes en langages de haut niveau (C, C++), puis de les traduire automatiquement en circuits matériels.
Ceci rend l'accès aux FPGA plus facile, notamment pour l'accélération d'algorithmes mathématiques, le traitement d'images ou de flux de données.
Néanmoins, HLS ne transforme pas le FPGA en processeur standard. Le code est toujours converti en une structure matérielle qui doit respecter les ressources disponibles et les exigences de timing.
De plus, la synthèse automatique n'est pas toujours optimale. Pour obtenir les meilleures performances, il faut tenir compte des spécificités de l'architecture du FPGA : largeur des bus, capacité mémoire, nombre de blocs DSP, profondeur de pipeline, parallélisme...
La programmation FPGA se situe donc à la frontière entre développement logiciel et conception électronique. Il ne suffit pas d'écrire un bon algorithme : il faut aussi comprendre la transformation du code en structure matérielle.
Les CPU, GPU et FPGA peuvent traiter des tâches similaires, mais selon des approches radicalement différentes. La principale divergence réside dans le degré de rigidité de l'architecture et la façon dont les calculs sont organisés.
Le CPU est un processeur universel conçu pour exécuter une grande variété de programmes. Ses cœurs lisent séquentiellement les instructions, les décodent et les transmettent à des unités d'exécution spécialisées.
Les processeurs modernes peuvent exécuter plusieurs instructions et flux en parallèle grâce à plusieurs cœurs. Toutefois, la structure interne du CPU est figée par le constructeur. Le développeur peut changer le programme, mais pas les blocs matériels pour l'adapter à un algorithme particulier.
La force du CPU, c'est la polyvalence : il peut faire tourner un OS, un navigateur, un jeu, etc. Mais cette universalité implique une gestion complexe (cache, prédiction de branchement...), ce qui peut limiter l'efficacité sur des tâches très spécialisées et répétitives.
La tendance actuelle est à la spécialisation des tâches sur différents blocs matériels. Ce sujet est approfondi dans l'article Pourquoi l'avenir du calcul appartient aux processeurs spécialisés.
Le GPU possède lui aussi une architecture fixe, mais optimisée pour le calcul massif en parallèle. Plutôt que quelques gros cœurs, la carte graphique compte de nombreux blocs capables d'exécuter simultanément des opérations similaires sur de gros volumes de données.
Ce modèle est né de la nécessité de générer de l'image, tâche qui implique d'effectuer d'innombrables opérations similaires sur pixels et textures. Il s'est révélé tout aussi adapté aux calculs scientifiques ou à l'apprentissage automatique.
Dès qu'une opération doit être appliquée à des millions d'éléments, le GPU surpasse souvent le CPU, à condition que l'algorithme se prête au parallélisme massif.
Néanmoins, le développeur utilise toujours une architecture graphique prédéfinie : il répartit les calculs entre les blocs existants, sans pouvoir modifier leur organisation physique.
Le FPGA adopte une approche unique. Au lieu d'exécuter un programme sur des cœurs prévus à l'avance, le concepteur façonne une structure matérielle personnalisée à partir des blocs logiques disponibles.
Supposons qu'un algorithme se compose de plusieurs étapes séquentielles : réception des données, vérification, multiplication, transformation, export. Le CPU exécute chaque instruction sur ses unités universelles, le GPU traite simultanément de nombreux ensembles sur ses cœurs parallèles.
Avec un FPGA, on crée un bloc matériel dédié à chaque étape et on les relie en pipeline. Une fois le pipeline rempli, chaque portion du circuit traite des données différentes en parallèle, sans exécution répétée d'instructions logicielles.
Le FPGA permet également de dupliquer une même structure si les ressources le permettent, le degré de parallélisme dépendant de la configuration matérielle définie, et non du nombre de cœurs prédéterminés.
| Caractéristique | CPU | GPU | FPGA |
|---|---|---|---|
| Architecture | Fixe | Fixe | Reconfigurable |
| Principe principal | Exécution d'instructions séquentielles | Exécution massive en parallèle | Création d'un circuit matériel dédié |
| Universalité | Très élevée | Élevée | Dépend de la configuration |
| Parallélisme | Limité par le nombre de cœurs et de threads | Très élevé | Défini par la structure créée |
| Latence | Dépend du programme et du système | Efficace sur les gros volumes | Très faible et prévisible |
| Développement | Relativement simple | Nécessite programmation parallèle | Nécessite conception matérielle |
| Efficacité énergétique (tâches spécialisées) | Moyenne | Élevée | Peut être très élevée |
Un FPGA n'est donc pas toujours plus rapide qu'un CPU ou un GPU : tout dépend de la tâche. Si l'algorithme change souvent ou implique une logique séquentielle complexe, le CPU reste plus pratique. Pour les opérations matricielles massives, le GPU est souvent gagnant.
Le FPGA se distingue lorsqu'on peut concevoir un pipeline matériel spécialisé avec une latence minimale. C'est pourquoi il occupe une niche entre processeurs universels et puces entièrement spécifiques.
Les FPGA sont idéaux pour les systèmes traitant des flux continus de données avec une exigence de latence minimale. On les trouve donc fréquemment dans l'équipement réseau et télécom.
Ils permettent d'implémenter des blocs matériels pour le traitement des paquets, la filtration du trafic, le codage/décodage des signaux ou la gestion d'interfaces haut débit, avec des étapes de traitement parallélisées et peu d'intervention du CPU.
Un atout majeur est la possibilité de mettre à jour la logique de l'équipement après sa mise en service : un nouveau protocole ou une fonctionnalité supplémentaire peut parfois être ajouté par une simple reconfiguration, sans remplacer le matériel.
Autre domaine phare : les systèmes temps réel industriels. Un FPGA peut lire des données de capteurs, piloter des actionneurs et traiter des signaux numériques simultanément.
La latence prédictible y est souvent plus cruciale que la puissance brute. Si une réaction doit intervenir dans un délai strict, le FPGA permet d'éliminer certaines latences liées aux systèmes d'exploitation et à la gestion logicielle.
On retrouve la même logique dans les instruments de mesure, systèmes vidéo, radars, électroniques automobiles et dispositifs de traitement du signal, où chaque partie de la puce peut être dédiée à une tâche précise et fonctionner en parallèle.
Les FPGA sont présents dans certains centres de données comme accélérateurs spécialisés. Le processeur central gère l'application, mais délègue les opérations répétitives à la logique programmable.
Par exemple, un FPGA peut être configuré pour traiter des flux réseau, compresser ou chiffrer des données, ou exécuter des étapes d'inférence de réseaux neuronaux. Cela soulage le CPU et offre un pipeline matériel dédié sans avoir à développer une puce spécifique.
De plus en plus, les systèmes de calcul modernes s'articulent autour de plusieurs accélérateurs. Pour approfondir ce principe, consultez l'article Systèmes informatiques hybrides : comment CPU, GPU, NPU et FPGA fonctionnent comme une architecture unifiée.
Cela dit, le FPGA n'est pas toujours la meilleure solution pour l'IA : le GPU est bien plus facile à programmer et dispose d'un riche écosystème, tandis que les accélérateurs IA spécialisés surpassent souvent les FPGA pour des tâches bien déterminées.
Le principal avantage d'un FPGA : la combinaison entre spécialisation et reprogrammabilité. On peut créer une structure matérielle sur mesure pour une tâche, puis la modifier sans refabriquer la puce.
Cette flexibilité permet d'obtenir une latence minimale, avec des calculs transitant par un chemin matériel optimisé. Les FPGA sont aussi très adaptés au traitement en flux, chaque étape du pipeline fonctionnant en parallèle.
Le parallélisme est un autre point fort : plutôt que de basculer un même cœur universel d'une tâche à l'autre, on peut dédier plusieurs blocs matériels à des opérations simultanées, tant que les ressources logiques le permettent.
Dans certains scénarios spécialisés, cela offre un excellent rapport performance/consommation, surtout quand la complexité générale d'un CPU n'est pas nécessaire.
Le principal inconvénient : la complexité du développement. Il ne suffit pas de connaître l'algorithme : il faut aussi gérer les délais de propagation des signaux, la mémoire, la synchronisation, la largeur des bus et les ressources matérielles disponibles.
Une erreur dans un programme classique se corrige souvent en modifiant quelques lignes de code. Sur FPGA, changer la logique peut affecter le placement des éléments et les routes de signaux, nécessitant une resynthèse et de nouveaux tests.
Les FPGA sont aussi moins efficaces que les puces entièrement spécialisées : pour une tâche bien définie et une production de masse, il vaut mieux concevoir un ASIC, créé sur mesure pour l'algorithme cible.
Ce sujet est détaillé dans l'article ASIC : pourquoi ils sont plus rapides et plus efficaces que les puces classiques.
Les ASIC n'intègrent pas le réseau programmable de connexions ou les ressources de reconfiguration, ce qui les rend plus compacts, rapides et économes. Mais leur architecture est figée après fabrication, et leur développement est bien plus coûteux.
C'est pourquoi les FPGA occupent une position intermédiaire : plus flexibles que les ASIC, capables d'une adaptation matérielle plus fine que CPU ou GPU, mais au prix d'une complexité accrue et d'une écosystème logicielle moins familière.
Le FPGA se distingue des CPU et GPU en offrant au concepteur la possibilité de configurer non seulement l'algorithme, mais aussi la structure matérielle même des calculs. Les blocs logiques, la mémoire et les connexions peuvent être assemblés en un circuit spécialisé, traitant les données en parallèle et avec une latence prévisible.
Le CPU reste incontournable pour les programmes généralistes et la logique séquentielle complexe, le GPU pour le calcul de masse parallèle. Le FPGA prend tout son sens lorsqu'il faut un pipeline matériel dédié, une réactivité maximale ou la faculté de modifier l'appareil sans refabriquer la puce.
Mais le FPGA n'est pas une solution universelle. Son développement est plus complexe et son efficacité dépend beaucoup du type de charge. En pratique, les puces programmables travaillent donc aux côtés des CPU, GPU et autres accélérateurs, prenant en charge les tâches qui tirent le meilleur parti de leur architecture unique.