La mémoire FIFO (First In, First Out) est l’une des méthodes de tampon les plus utilisées en électronique numérique car elle préserve l’ordre des données tout en permettant des transferts fiables entre appareils fonctionnant à des vitesses différentes. Comprendre le fonctionnement du FIFO, son architecture, ses spécifications, ses types et ses considérations de conception vous aide à construire des systèmes qui maintiennent un flux continu de données et préviennent la perte de données.

Qu’est-ce que la mémoire FIFO ?
La mémoire FIFO (First In, First Out) est un tampon de données temporaire qui stocke et libère les données dans le même ordre d’arrivée. Les premières données écrites dans le tampon sont les premières données lues, qui préservent la séquence de données originale lors du transfert. Il utilise une logique de contrôle intégrée pour gérer automatiquement les opérations de lecture et d’écriture, de sorte que le processeur n’a pas besoin de suivre manuellement les adresses mémoire. Cela rend la mémoire FIFO utile dans les systèmes numériques qui gèrent des flux de données continus ou transfèrent des données entre des appareils fonctionnant à des vitesses différentes.
Fonctionnement de la mémoire FIFO

La mémoire FIFO met en mémoire tampon les données entrantes tout en permettant de lire indépendamment les données précédemment stockées. Cela permet aux appareils fonctionnant à différentes vitesses d’échanger des données sans perdre d’informations ni modifier leur séquence. En interne, le FIFO utilise des opérations d’écriture et de lecture séparées, permettant ainsi de stocker de nouvelles données pendant que les anciennes sont récupérées en même temps, assurant un flux continu des données.
Opération d’écriture
Lorsque de nouvelles données arrivent, le contrôleur FIFO vérifie si de l’espace est disponible. Si le tampon n’est pas plein, les données sont écrites à l’emplacement mémoire indiqué par le pointeur d’écriture. Une fois l’écriture terminée, le pointeur d’écriture avance automatiquement vers l’emplacement disponible suivant.
Opération de lecture
Lorsque l’appareil récepteur demande des données, le contrôleur FIFO vérifie si le tampon contient des données stockées. Si le tampon n’est pas vide, il lit les données les plus anciennes depuis l’emplacement indiqué par le pointeur de lecture. Le pointeur de lecture avance ensuite vers l’élément stocké suivant, en conservant l’ordre original des données.
Pointeurs de lecture et d’écriture
La mémoire FIFO utilise deux pointeurs indépendants pour contrôler le mouvement des données. Le pointeur d’écriture identifie où les nouvelles données seront stockées, tandis que le pointeur de lecture identifie les données suivantes à récupérer. Parce que ces pointeurs fonctionnent indépendamment, FIFO prend en charge des opérations simultanées de lecture et d’écriture, permettant un transfert continu de données entre appareils à des vitesses de traitement différentes.
Drapeaux pleins et vides
Les contrôleurs FIFO surveillent la position des pointeurs de lecture et d’écriture pour déterminer l’état du tampon. Lorsque tous les emplacements mémoire sont occupés, le drapeau Full est utilisé pour empêcher d’autres opérations d’écriture. Lorsque toutes les données stockées ont été lues, le drapeau Empty est activé pour empêcher les opérations de lecture invalides. De nombreux dispositifs FIFO incluent également des drapeaux Presque Plein et Presque Vide, qui fournissent des alertes précoces afin que le système puisse ralentir les données entrantes ou augmenter la vitesse de lecture avant qu’il ne survienne un débordement ou un sous-débordement.
Exemple de flux de données
Considérons un capteur de température qui produit un échantillon de données chaque microseconde, tandis qu’un microcontrôleur traite un échantillon toutes les deux microsecondes. Le FIFO stocke temporairement les échantillons supplémentaires au fur et à mesure qu’ils arrivent. Lorsque le microcontrôleur devient disponible, il lit les données stockées dans le même ordre qu’elles ont été écrites, évitant ainsi la perte de données et maintenant une acquisition continue des données.
Composants internes FIFO

| Composant | Fonction |
|---|---|
| Tableau de mémoire | Stocke les données entrantes jusqu’à ce qu’elles soient lues. |
| Pointeur d’écriture | Marque le prochain emplacement pour de nouvelles données. |
| Lire Pointer | Marque le prochain emplacement de données à lire. |
| Logique de contrôle | Les coordonnées lisent, écrivent, réinitialisent et affectent les opérations de statut. |
| Logique du drapeau de statut | Génère des signaux plein, vide, presque plein et presque vide. |
| Logique de l’horloge | Prend en main le fonctionnement FIFO synchrone ou asynchrone. |
Spécifications clés du FIFO
| Spécification | Description | Considérations typiques |
|---|---|---|
| Profondeur du tampon | Le nombre maximal de mots de données que le FIFO peut stocker. | Choisissez en fonction de la taille de la rafale, du taux d’écriture, du taux de lecture et du délai maximal de traitement. |
| Largeur des données | Nombre de bits stockés dans chaque emplacement mémoire. | Les largeurs courantes incluent 8, 16, 32, 64, 128 bits ou plus. |
| Lire Horloge | Horloge qui contrôle les opérations de lecture. | C’est pareil pour l’horloge d’écriture dans le FIFO synchrone, ou indépendant dans le FIFO asynchrone. |
| Horloge d’écriture | Horloge qui contrôle les opérations d’écriture. | Détermine le débit maximal de données entrantes. |
| Fréquence maximale de fonctionnement | Fréquence d’horloge de lecture et d’écriture la plus élevée prise en charge. | Cela dépend de la mise en œuvre du FIFO, de la technologie mémoire et des contraintes de timing. |
| Débit de données | La quantité réelle de données que le FIFO peut transférer par seconde. | C’est plus pratique que la fréquence d’horloge seule car elle inclut la largeur de données et le débit de transfert. |
| Latence de lecture | Délai entre une requête de lecture et une donnée de sortie valide. | Généralement un ou plusieurs cycles d’horloge ; Une latence réduite est utile dans les systèmes temps réel. |
| Latence d’écriture | Délai avant que les nouvelles données écrites ne soient disponibles pour lecture. | Dépendant de l’appareil et influencés par l’architecture FIFO. |
| Chute du premier mot | Permet au premier mot stocké d’apparaître à la sortie sans cycle de lecture supplémentaire. | Utile lorsque le comportement de lecture à latence réduite est requis. |
| Protection contre les débordements | Empêche l’écriture lorsque le FIFO est plein. | Utilise les flags de statut Plein ou Presque Plein. |
| Protection contre le débordement | Empêche la lecture lorsque le FIFO est vide. | Utilise des drapeaux d’état Vide ou Presque Vide. |
| Drapeaux de statut | Indiquez l’état actuel du tampon. | Drapeaux de seuil Plein, Vide, Presque Plein, Presque Vide et programmables. |
| Seuils programmables presque pleins / presque vides | Niveaux d’avertissement configurables avant que le FIFO ne devienne complètement complet ou vide. | Cela aide le système à réagir tôt avant qu’il ne surpasse ou ne surpasse. |
| Latence des drapeaux | Le délai avant que les drapeaux de statut ne reflètent l’état réel FIFO. | Le délai de drapeau complet / vide peut affecter la logique de contrôle à haute vitesse. |
| Comportement de réinitialisation | Définit comment les pointeurs de lecture, d’écriture, de drapeaux et de données de sortie s’initialisent après réinitialisation. | Un comportement de réinitialisation incorrect peut corrompre l’état du pointeur ou créer des lectures invalides. |
| Prise en charge du croisement de domaines d’horloge | Indique si le FIFO peut transférer en toute sécurité des données entre des domaines d’horloge indépendants. | Nécessaire pour les conceptions asynchrones FIFO, les chemins FPGA CDC et les systèmes multi-fréquences. |
| Consommation d’énergie | Besoins en fonctionnement et en veille. | Important pour les systèmes à batterie ou à consommation réduite. |
| Technologie de la mémoire | Implémentation du stockage interne. | SRAM, RAM en bloc, RAM distribuée ou matériel FICO dédié. |
Types de mémoire FIFO
La mémoire FIFO est disponible sous plusieurs formes pour prendre en charge différents designs matériels, configurations d’horloge et exigences applicatives.
FIFO synchrone

Un FIFO synchrone utilise une seule horloge pour les opérations de lecture et d’écriture. Puisque les deux processus partagent le même domaine d’horloge, le timing est plus simple et la logique de contrôle plus facile à implémenter. Ces FIFO sont couramment utilisés à l’intérieur des processeurs, DSP et circuits logiques numériques.
FIFO asynchrone

Le FIFO asynchrone est utilisé lorsque le côté écriture et le côté lecture utilisent des horloges différentes. Il est courant dans les conceptions FPGA, les interfaces à haute vitesse, la capture de données ADC, le réseautage et les circuits de croisement du domaine d’horloge. Un FIFO asynchrone fiable utilise généralement des pointeurs en code gris synchronisés pour réduire le risque de métastabilité lors du transfert d’informations de pointeur entre domaines d’horloge.
FIFO matériel

Les FIFO matériels sont des blocs mémoire dédiés intégrés à des microcontrôleurs, périphériques de communication, FPGA, ASIC ou circuits intégrés FIFO autonomes. Puisque le matériel gère directement le tampon, ils assurent un fonctionnement rapide avec une implication très limitée du processeur.
FIFO logiciel (File d’attente)

Un FIFO logiciel implémente le même principe Premier entrant, Premier sorti en utilisant la RAM système au lieu du matériel dédié. Le logiciel met à jour les pointeurs de lecture et d’écriture, rendant cette approche adaptée aux firmwares embarqués, aux systèmes d’exploitation et aux applications sans support matériel FIFO.
Mémoire FIFO vs autres méthodes de tampon

| Fonctionnalité | Mémoire FIFO | Tampon circulaire | LIFO (Stack) | Tampon de registre |
|---|---|---|---|---|
| Ordre des données | Premier à entrer, premier sorti | Premier entrant, premier sorti avec rangement enveloppant | Dernier à entrer, premier sorti | Stockage direct |
| Taille du tampon | Défini par profondeur mémoire | Défini par la mémoire allouée | Défini par capacité de la pile | Un petit nombre de registres |
| Diffusion continue | Fort pour un flux de données stable | Fort pour le cycle répété des données | Utilisé pour la gestion de données imbriquées | Meilleur pour la conservation de données à court terme |
| Croisement du domaine de l’horloge | Courant dans les conceptions asynchrones FIFO | Nécessite une logique de contrôle supplémentaire | Nécessite une logique de contrôle supplémentaire | Nécessite une synchronisation séparée |
| Gestion du processeur | Géré par la logique de contrôle FIFO | Géré par logiciel ou firmware | Géré par logiciel ou firmware | Géré via un accès direct aux registres |
| Applications typiques | Mémoire tampon, pontage de bus, transfert ADC/processeur | Audio, vidéo, journalisation, files d’attente de paquets | Appels de fonction, interruptions et gestion d’expressions | Valeurs temporaires, bits de contrôle, données d’état |
Utilisez le FIFO lorsque la commande des données doit être conservée et que les vitesses producteur/consommateur sont différentes. Utilisez un tampon circulaire lorsque le logiciel nécessite un stockage répété dans une zone mémoire fixe. Utilisez une pile lorsque les données les plus récentes doivent être traitées en premier. Utilisez uniquement les tampons de registre pour les données de contrôle ou de statut à court terme.
Applications de la mémoire FIFO

| Application | FIFO résout ce problème | Type FIFO typique |
|---|---|---|
| Communication UART | Les données en rafale arrivent avant que le firmware ne les lise | Matériel ou logiciel FIFO |
| Interface SPI | Données de procédé maître et esclave à des vitesses différentes | FIFO matériel |
| Contrôleur USB | Les données de paquets nécessitent un stockage temporaire | FIFO matériel |
| Contrôleur Ethernet | Les paquets réseau arrivent par rafales | FIFO matériel |
| Capture de données ADC | Les échantillons à grande vitesse doivent être tampons avant le traitement | Asynchrone ou matériel FIFO |
| Croisement du domaine d’horloge FPGA | Croisements de données entre horloges non liées | FIFO asynchrone |
| Traitement audio | Les échantillons continus doivent éviter les espaces Tampon circulaire ou FIFO | |
| Transfert DMA | Les données circulent sans implication constante du processeur | FIFO matériel |
Comment calculer la profondeur FIFO
La profondeur FIFO détermine combien de données temporaires le tampon peut contenir avant de devenir plein. Choisir la bonne profondeur aide à prévenir la perte de données lorsque la vitesse d’écriture dépasse temporairement la vitesse de lecture.
Formule de profondeur FIFO
Lorsque le producteur peut générer des données plus rapidement que le consommateur ne les traite, la profondeur minimale FIFO peut être estimée comme suit :
Profondeur ≥ FIFO (Taux d’écriture − Débit de lecture) × Délai maximal
Où :
• Taux d’écriture = débit de données entrantes
• Taux de lecture = débit de données sortantes
• Délai maximal = la durée la plus longue pendant laquelle l’appareil récepteur peut s’arrêter ou ralentir
Si le dispositif de lecture fait une pause complète, la profondeur FIFO requise devient :
Profondeur ≥ Débit d’écriture × temps de pause maximal FIFO
Exemple de conception
Un ADC génère 20 millions d’échantillons par seconde (20 MSPS), tandis qu’un processeur peut s’arrêter de 50 μs lors du traitement des interruptions.
• Taux d’écriture = 20 000 000 échantillons/s
• Pause maximale = 50 μs
Profondeur FIFO requise :
20 000 000 × 50 × 10⁻⁶ = 1 000 échantillons
Un FIFO capable de stocker au moins 1 000 échantillons est nécessaire. En pratique, vous pouvez généralement choisir la taille standard suivante, comme 1024 ou 2048 mots, afin d’offrir une marge de sécurité supplémentaire en cas de retards imprévus ou de décharges de circulation.
Exemple pratique de conception FIFO : ADC vers tampon de données microcontrôleur

Un système d’acquisition de données industrielle utilise un ADC 16 bits fonctionnant à 50 MSPS pour capturer des données de capteurs à grande vitesse. L’ADC écrit des échantillons dans un tampon FIFO, tandis qu’un microcontrôleur lit les données en mémoire tampon et envoie les résultats traités via une interface de communication plus lente telle qu’Ethernet, UART ou RS-485.
Le FIFO est nécessaire car l’ADC peut produire des données plus rapidement que le microcontrôleur ou l’interface de communication ne peuvent les gérer. Si le microcontrôleur est occupé par le traitement des interruptions, le transfert de données ou une autre tâche, le FIFO stocke temporairement les échantillons entrants et empêche la perte immédiate de données.
Si le microcontrôleur peut cesser de lire pendant 20 μs pendant que l’ADC continue d’échantillonner à 50 MSPS, la profondeur minimale FIFO peut être estimée comme suit :
Profondeur ≥ Débit d’écriture × temps de pause maximal FIFO
Profondeur FIFO ≥ 50 000 000 × 20 × 10⁻⁶
FIFO Depth ≥ 1 000 échantillons
Dans ce cas, un FIFO de 1024 mots est le choix minimum pratique, tandis qu’un FIFO de 2048 mots offre une marge supplémentaire pour le délai d’interruption, la latence de signalement et le trafic en rafale. Comme chaque échantillon compte 16 bits, un FIFO de 2048 mots stocke 4096 octets de données ADC.
Si l’ADC et le microcontrôleur utilisent des fréquences différentes, un FIFO asynchrone doit être utilisé pour gérer le croisement du domaine d’horloge. Le drapeau Presque Plein peut avertir le contrôleur avant qu’un débordement ne survienne, permettant au système de lancer un transfert DMA, d’augmenter la priorité de lecture ou de ralentir la source de données si possible.
La mémoire FIFO ne peut pas corriger un décalage permanent de bande passante. Si l’ADC produit en continu des données plus rapidement que le processeur ne peut les lire, le FIFO finira par se remplir. Dans ce cas, la conception doit réduire la fréquence d’échantillonnage, augmenter la bande passante de lecture, utiliser la DMA, ajouter de la mémoire externe ou traiter les données dans un FPGA avant de les envoyer au microcontrôleur.
Erreurs courantes de conception FIFO et dépannage
| Problème | Cause possible | Solution |
|---|---|---|
| Débordement FIFO | Les données entrantes dépassent la vitesse de lecture | Augmenter la profondeur du FIFO ou améliorer la vitesse de traitement |
| Écoulement FIFO | Les données sont lues plus vite qu’elles ne sont écrites | Retarder la lecture jusqu’à ce que les données soient disponibles |
| Corruption des données | Défaillance de la synchronisation des pointeurs | Utiliser une logique de synchronisation appropriée ou des pointeurs Gray-code |
| Lectures invalides | Drapeau vide ignoré | Vérifiez le drapeau Vide avant de lire |
| Données perdues | Drapeau complet ignoré | Arrêtez d’écrire quand le FIFO est complet |
| Opération instable | Séquence de réinitialisation incorrecte | Réinitialiser les pointeurs de lecture et d’écriture lors de l’initialisation |
| Erreurs du domaine d’horloge | Croisement d’horloge non synchronisé | Utilisez un FIFO asynchrone avec des circuits de synchronisation appropriés |
Tester les performances FIFO dans des conditions de fonctionnement maximales permet d’identifier les problèmes de dépassement, de sous-débordement, de synchronisation et de synchronisation avant le déploiement du système.
Conclusion
La mémoire FIFO offre un moyen simple et fiable de tampon des données tout en préservant leur séquence d’origine. En sélectionnant le type FIFO approprié, la profondeur de tampon et les caractéristiques de fonctionnement appropriés, les concepteurs peuvent réduire les risques de débordement et de sous-bordement, améliorer la communication entre différents domaines d’horloge et maintenir un transfert de données stable et continu à travers une large gamme de systèmes embarqués et numériques.
Foire aux questions [FAQ]
Q1. Comment un FIFO asynchrone peut-il transférer en toute sécurité les données entre différents domaines d’horloge ?
Un FIFO asynchrone utilise des horloges de lecture et d’écriture séparées ainsi que de la logique de synchronisation, souvent des pointeurs en code gris, pour éviter les erreurs de temporisation et la métastabilité. Cela permet aux données de circuler de manière fiable entre des circuits fonctionnant à différentes fréquences tout en préservant l’ordre correct des données.
Q2. Comment déterminez-vous la profondeur FIFO correcte pour un design ?
La profondeur FIFO est déterminée par la différence entre les débits de données entrants et sortants ainsi que par le délai ou la pause de traitement le plus long. Vous pouvez généralement calculer la profondeur minimale requise puis choisir la taille standard supérieure suivante pour offrir une marge supplémentaire pour le trafic en rafale et les retards inattendus.
Q3. Pourquoi les drapeaux Presque Plein et Presque Vide sont-ils utiles au lieu de ne compter que sur les drapeaux Plein et Vide ?
Les drapeaux Presque Plein et Presque Vide fournissent un avertissement précoce avant que le FIFO n’atteigne ses limites. Cela donne au système suffisamment de temps pour ralentir les données entrantes, augmenter la vitesse de lecture ou ajuster le traitement avant que le débordement ou le sous-flux ne survienne.
Q4. Quand faut-il utiliser un FIFO matériel à la place d’un FIFO logiciel ?
Un FIFO matériel est préféré pour les applications à haute vitesse ou en temps réel car il gère le tampon avec une logique de contrôle dédiée et une implication minimale du processeur. Un FIFO logiciel est plus adapté aux systèmes ou applications à faible vitesse où le matériel dédié FIFO n’est pas disponible et où une plus grande flexibilité d’implémentation est nécessaire.
Q5. Quelles sont les causes les plus courantes de corruption des données FIFO, et comment peut-on les prévenir ?
La corruption des données FIFO est souvent causée par une synchronisation incorrecte des pointeurs, l’ignorance des drapeaux d’état Plein ou Vide, une initialisation de réinitialisation incorrecte ou une mauvaise conception du croisement du domaine d’horloge. En utilisant des techniques de synchronisation appropriées, en vérifiant les indicateurs d’état avant chaque opération de lecture ou d’écriture, et en testant minutieusement le FIFO dans des conditions de fonctionnement maximales, cela permet d’assurer un transfert de données fiable.