La version la plus sophistiquée des circuits logiques programmables est sans contredit le circuit intégré programmable (en anglais, Field Programmable gate array (FPGA)). Un FPGA est constitué d’une matrice de blocs polyvalents appelés blocs logiques programmables qui permettent, selon leur configuration, de réaliser n’importe quelle fonction logique. Un bloc logique est typiquement constitué d’une ou de quelques cellules logiques élémentaires.
La figure suivante montre une version simplifiée d’une cellule logique comportant:
Cellule logique
Le tableau de correspondance (LUT) à quatre entrées \(a, b, c, d\) est fractionné en deux LUT à trois entrées, combinés par un multiplexeur contrôlé par l’entrée \(d\). Pour des opérations arithmétiques, les sorties des LUT à trois entrées sont additionnées avec une retenue externe \(R_i\). Le multiplexeur du centre, commandé par le signal de sélection \(S_1\), sélectionne le résultat d’addition ou la fonction réalisée par la LUT à 4 entrées. Selon le signal de sélection \(S_2\), la valeur obtenue peut être acheminée directement en sortie de la cellule (cellule en mode combinatoire) ou être stockée dans la bascule D (cellule en mode séquentiel). Dans d’autres configuration typiques de cellules, l’additionneur complet est remplacé par un tableau de correspondance.
En plus de la matrice de blocs logiques, un circuit intégré programmable comporte également des composants consacrés aux entrées/ sorties, des lignes d’interconnexion programmables pour relier les blocs entre eux, des lignes de distribution de signaux d’horloge, et possiblement de la mémoire RAM supplémentaire.
Les LUTs font appel à de la mémoire RAM pour implémenter les tableaux de vérité, ce qui permet une configuration dynamique qui doit être chargée lors de la mise en route du circuit programmable. Un autre avantage est que ces mémoires permettent des vitesses de fonctionnement nettement plus rapides que si on utilisait des mémoires ROM. Les données de configuration peuvent être stockées dans de la mémoire flash externe par exemple. Le circuit FPGA peut donc être reconfiguré et adapté à différentes fonctions, simplement en écrivant de nouvelles données dans la mémoire externe qui contient ses informations de configuration.
La configuration et la programmation d’un circuit programmable FPGA se fait au moyen d’outils de synthèse spécialisés, souvent en fonction d’une spécification au moyen d’un langage descriptif de matériel (en anglais, Hardware Description Language (HDL)).