
FIFO (First In, First Out) je metoda ukládání dat, při které jsou první data zapsaná do vyrovnávací paměti také prvními daty, která jsou přečtena. Provozní princip je podobný frontě. Data vstupují do vyrovnávací paměti v určitém pořadí a zůstávají uložena, dokud nejsou přečtena. Nejstarší data vždy opouští vyrovnávací paměť jako první, zatímco novější data čekají vzadu.
V systémech FPGA a ASIC se FIFO běžně používá jako dočasná úložná oblast mezi obvody, které generují data, a obvody, které tato data spotřebovávají. Místo přímého odesílání dat z jednoho bloku do druhého, jsou přicházející data nejprve uložena v FIFO. Příjmový obvod poté čte uložená data, když je připraven. Tento přístup pomáhá udržovat kontinuální a spolehlivý tok dat.
Na rozdíl od běžné paměti, FIFO nevyžaduje externí adresní linky pro výběr úložných míst. Během operace zápisu jsou přicházející data automaticky umístěna na další dostupné místo v vyrovnávací paměti. Během operace čtení jsou nejstarší uložená data automaticky načtena a odeslána na výstup.
Tento proces je řízen interními ukazateli zápisu a ukazateli čtení. Když jsou zapsána nová data, ukazatel zápisu se posune na další úložné místo. Když jsou data čtena, ukazatel čtení se posune na další dostupný prvek. Protože tyto ukazatele fungují automaticky, FIFO vyžaduje méně řídicí logiky než konvenční paměť.
Kompromis spočívá v tom, že data lze přistupovat pouze sekvenčně. Na rozdíl od RAM, FIFO nemůže přímo přistupovat k specifickému úložnému místu. Každá operace čtení následuje přesně v pořadí, v jakém byla data původně zapsána.
FIFO se široce využívá, když různé části systému pracují různými rychlostmi. V mnoha aplikacích jeden přístroj generuje data neustále, zatímco jiný přístroj tato data zpracovává nebo přenáší pomalejším rychlostním tempem. Bez dočasného úložiště může přicházející data přijít rychleji, než mohou být zpracována, což může vést ke ztrátě dat.
Například analogově-digitální převodník (ADC) může neustále generovat digitální vzorky, zatímco procesor, PCI sběrnice nebo komunikační rozhraní zpracovává tyto vzorky jinou rychlostí. FIFO slouží jako mezilehlá vyrovnávací paměť, která ukládá přicházející data a uvolňuje je, když je přijímací obvod připraven. To umožňuje oběma stranám systému fungovat nezávisle, aniž by došlo ke ztrátě informací.
FIFO může také řešit problémy s nesouladem šířky dat mezi zařízeními. V některých systémech může jedno zařízení vyprodukovat 8bitová data, zatímco jiné očekává 16bitová data. Přímá komunikace může vyžadovat další konverzní logiku k reorganizaci dat.
FIFO může zjednodušit tento proces tím, že dočasně ukládá přicházející data a prezentuje je ve formátu, který odpovídá přijímacímu zařízení. Tato schopnost pomáhá různým hardwarovým blokům efektivně vyměňovat data a zároveň snižuje složitost rozhraní.
Struktury FIFO jsou obecně rozděleny na synchronní FIFO a asynchronní FIFO.
Synchronní FIFO využívá jeden signál hodin pro operace čtení i zápisu. Protože všechny činnosti probíhají pod stejným zdrojem hodin, časové vztahy jsou snáze říditelné a ověřitelné. Synchronní FIFO jsou běžně používány, když data zůstávají v rámci jedné hodinové domény.
Asynchronní FIFO využívá oddělené hodiny pro zápis a čtení. Data mohou do FIFO vstoupit pomocí jedné frekvence hodin a opustit ji pomocí jiné. Protože obě hodiny pracují nezávisle, asynchronní FIFO se široce používají pro přenos dat mezi různými hodinovými doménami.
Tato schopnost je obzvlášť důležitá v systémech FPGA, kde procesory, komunikační rozhraní, paměťové řadiče a periferní zařízení často pracují na různých frekvencích.
Spolehlivý provoz FIFO závisí na vědění, kolik dat je aktuálně uloženo v bufferu. Pokud nová data pokračují v příjmu poté, co FIFO dosáhne kapacity, platné informace mohou být přepsány. Podobně pokus o čtení dat z prázdného FIFO produkuje neplatné výsledky.
Aby se předešlo těmto podmínkám, návrhy FIFO používají několik signálů stavu.
Signál plnosti indikuje, že všechna dostupná místa pro uložení jsou obsazena a nelze zapsat další data. Signál prázdnosti indikuje, že žádná platná data nejsou k dispozici pro čtení.
Mnoho implementací FIFO také poskytuje indikátory téměř plného a téměř prázdného stavu. Tyto signály fungují jako včasná varování před tím, než FIFO dosáhne stavu zcela plného nebo zcela prázdného. Řídící logika může tyto signály použít k zpomalení, zastavení nebo úpravě přenosu dat před tím, než dojde k přetečení nebo podtečení.
Protože tyto indikátory stavu přímo ovlivňují integritu dat a spolehlivost systému, jsou nedílnou součástí návrhu FIFO.
Struktury FIFO jsou obecně rozděleny na FIFO s jedním hodinovým signálem (SCFIFO) a FIFO s dvojitým hodinovým signálem (DCFIFO). Tyto struktury jsou navrženy tak, aby podporovaly různé vztahy hodin a požadavky na přenos dat.
Mezi nejběžnější struktury FIFO patří:
• SCFIFO (FIFO s jedním hodinovým signálem)
• DCFIFO (FIFO s dvojitým hodinovým signálem)
• DCFIFO smíšené šířky (FIFO s dvojitým hodinovým signálem s různými šířkami dat pro čtení a zápis)
Ve většině dokumentace k FPGA jsou standardní FIFO s dvojitým hodinovým signálem a FIFO s dvojitým hodinovým signálem smíšené šířky obvykle kategorizovány jako FIFO s dvojitým hodinovým signálem, pokud není nutné rozlišení.

Výběr struktury FIFO závisí hlavně na tom, jak data vstupují a opouštějí buffer. Vztah mezi hodinovým signálem pro zápis a hodinovým signálem pro čtení je obvykle nejdůležitějším faktorem při výběru vhodné architektury FIFO.
FIFO s jedním hodinovým signálem používá jeden hodinový signál k řízení jak operací zápisu, tak čtení. Protože oba procesy probíhají v rámci stejné hodinové domény, řízení času je relativně jednoduché a problémy se synchronizací jsou minimalizovány.
Když platná data dorazí na vstup FIFO a je potvrzena žádost o zápis, data jsou uložena na dalším dostupném paměťovém místě na aktivním hodinovém okraji. Jak přicházejí další data, ukazatel pro zápis se stále posouvá vpřed v úložné oblasti FIFO.
Když je potvrzena žádost o čtení, FIFO získá nejstarší uložená data a umístí je na výstup. Ukazatel pro čtení se poté posune na další uložené místo. Tento nepřetržitý pohyb ukazatelů pro čtení a zápis umožňuje datům plynout skrze FIFO ve správném pořadí.
FIFO s jedním hodinovým signálem také poskytuje několik signálů stavu, které pomáhají monitorovat podmínky bufferu. Signál plnosti indikuje, že všechna úložná místa jsou obsazena a další zápisy musí být zastaveny. Signál téměř plného stavu varuje, že FIFO se blíží kapacitě.
Signál prázdnosti indikuje, že v bufferu nezůstává žádná platná data, zatímco signál téměř prázdného stavu varuje, že zbývá pouze malé množství dat. Mnoho implementací také zahrnuje čítač použitých slov, který hlásí, kolik dat je aktuálně uloženo v FIFO.
Tyto indikátory umožňují okolní logice činit bezpečná rozhodnutí o čtení a zápisu, zatímco udržují spolehlivý provoz FIFO.
FIFO s dvojitým hodinovým signálem využívá oddělené hodiny pro zápis a čtení. Zápisová strana funguje v rámci jedné hodinové domény, zatímco čtecí strana funguje v rámci jiné.
Příchozí data jsou zapisována do FIFO pomocí hodinového signálu pro zápis. Jakmile jsou uložena, data zůstávají uvnitř bufferu, dokud je čtecí strana nezíská pomocí hodinového signálu pro čtení. Protože obě hodiny jsou nezávislé, FIFO může bezpečně přenášet data mezi různými hodinovými doménami.
Tato schopnost činí FIFO s dvojitým hodinovým signálem jedním z nejběžnějších řešení pro překračování hodinových domén v systémech FPGA.
Pro podporu spolehlivého provozu poskytují duální hodinkové FIFO signály stavu pro obě strany rozhraní. Přírůstková strana obecně používá signály jako wrfull a wrempty k indikaci podmínek vyrovnávací paměti na straně zápisu. Čtecí strana běžně používá rdfull a rdempty k indikaci dostupnosti dat pro čtení.
Oddělené čítače jsou také často poskytovány, takže každá hodinová doména může nezávisle sledovat množství uložených dat. Tyto indikátory umožňují oběma stranám FIFO činit rozhodnutí, aniž by si navzájem překážely.
Některé aplikace vyžadují různé šířky dat na straně zápisu a čtení FIFO. V těchto situacích lze použít smíšenou šířku duálního hodinového FIFO.
Například mohou být data zapisována do FIFO jako 16bitová slova, ale čtena jako 8bitová slova. FIFO automaticky reorganizuje uložené informace a provádí požadovanou konverzi šířky, přičemž zachovává původní sekvenci dat.
Tato funkce je užitečná, když se připojují zařízení, která používají různé šířky sběrnice. Místo přidávání samostatné konverzní elektroniky se šířková adaptace provádí interně ve FIFO.
Jednohodinové FIFO se obecně používá, když se čtení a zápis provádí v rámci stejné hodinové domény. Jeho jednodušší architektura usnadňuje analýzu časování a implementaci.
Duální hodinové FIFO je preferováno, když data musí přecházet mezi nezávislými hodinovými doménami. Poskytuje spolehlivý přechod mezi hodinovými doménami a pomáhá eliminovat problémy se synchronizací.
Když jsou vyžadovány jak překročení hodinové domény, tak konverze šířky dat, smíšená šířka duálního hodinového FIFO poskytuje účinné řešení kombinací obou funkcí v rámci jedné struktury FIFO.
FIFO funguje jako dočasná úložná oblast mezi různými částmi digitálního systému. V mnoha aplikacích data nepřicházejí a neopouštějí systém přesně stejnou rychlostí. Jeden zařízení může generovat data nepřetržitě, zatímco jiné zařízení může tato data zpracovávat nebo přenášet pomalejší rychlostí. Bez vyrovnávací paměti mezi nimi mohou příchozí data akumulovat rychleji, než je možné je zpracovat, což vede ke ztrátě dat.
FIFO tento problém řeší tím, že ukládá data, jakmile dorazí, a uvolňuje je, když je přijímací obvod připraven. To vytváří hladší tok informací a umožňuje různým částem systému fungovat efektivněji, aniž by bylo nutné dokonalé časování.
Kromě jednoduchého vyrovnávání FIFO také pomáhá zlepšit celkový výkon systému. Shromážděním dat dočasně před přenosem FIFO snižuje počet operací přístupu na sběrnici a minimalizuje zbytečné komunikační náklady. To umožňuje, aby byly systémové zdroje využívány efektivněji.
FIFO může také snížit zátěž procesoru. Místo toho, aby byla CPU nucena zpracovávat každý jednotlivý přenos dat, mohou být data akumulována ve FIFO a zpracovávána ve větších blocích. Tento přístup zvyšuje efektivitu a uvolňuje zdroje procesoru pro jiné úkoly.
Další důležitou výhodou je podpora operací přímého přístupu do paměti (DMA). V systémech s vysokou rychlostí umožňuje DMA, aby data přecházela přímo mezi periferie a pamětí bez neustálé účasti CPU. FIFO poskytuje dočasné úložiště potřebné pro podporu těchto přenosů a udržení nepřetržitého toku dat.
Bez vyrovnávací paměti FIFO a podpory DMA může procesor trávit značné množství času řízením pohybu dat, což může snížit celkový výkon systému a zvýšit riziko přetížení přenosu.
Jednohodinové FIFO se obvykle používá, když jsou operace zápisu a čtení řízeny stejným hodinovým signálem. Protože obě strany FIFO fungují v rámci stejné hodinové domény, je správa časování jednodušší a problémy se synchronizací jsou snadněji vyhnout.
Jedna běžná aplikace je akvizice dat ze senzorů. V mnoha systémech může senzor generovat data mnohem rychleji než komunikační rozhraní mající na starosti přenos těchto dat do jiného zařízení.
Například FPGA může shromažďovat data ze senzoru prostřednictvím vysokorychlostního SPI rozhraní. Každý vzorek senzoru přichází rychle a musí být okamžitě uložen, aby nedošlo ke ztrátě informací. Současně mohou být shromážděná data potřebována pro přenos prostřednictvím UART rozhraní fungujícího na mnohem nižším přenosovém hmotnosti.
Když data ze senzorů vstupují do FPGA, jsou ihned zapisována do FIFO. Uložená data pak čekají uvnitř vyrovnávací paměti, zatímco UART je postupně přenáší svou vlastní rychlostí. Jakmile data opouští FIFO, nové vzorky senzorů pokračují v přicházení do vyrovnávací paměti. Tento nepřetržitý proces zápisu a čtení umožňuje oběma stranám systému fungovat při různých rychlostech dat, přičemž zůstávají synchronizovány stejným zdrojem hodin.
Absorbováním dočasných rozdílů ve rychlosti mezi sběrem dat a přenosem dat, FIFO s jedním hodinovým signálem pomáhá udržovat stabilní tok dat a zabraňuje ztrátě dat.
FIFO s dvojitým hodinovým signálem je navrženo pro systémy, ve kterých funguje zapisovací a čtecí strana s různými hodinovými signály. Tato situace je běžná v návrzích FPGA, protože mnoho funkčních bloků pracuje na různých frekvencích a požadavcích na časování.
Když se data přesouvají z jedné hodinové domény do druhé, přímé spojení může vytvářet problémy se synchronizací. Data mohou dorazit příliš brzy, příliš pozdě, nebo během nestabilních časových oken, což vede k nespolehlivému provozu.
FIFO s dvojitým hodinovým signálem poskytuje bezpečnou hranici mezi dvěma hodinovými doménami. Příchozí data jsou zapisována do FIFO pomocí hodinového signálu zdroje. Jakmile jsou uložena, data zůstávají v bufferu, dokud je strana určení nečte pomocí svého vlastního hodinového signálu. FIFO interně spravuje proces přenosu tak, aby obě hodinové domény mohly fungovat nezávisle.
Systém zpracování videa poskytuje dobrý příklad. Kamera může zachytit obrazová data pomocí jedné hodinové frekvence, zatímco VGA ovladač výstupuje obrazová data pomocí jiné hodinové frekvence. Jakmile jsou obrazová data generována kamerou, jsou kontinuálně zapisována do FIFO. VGA ovladač potom čte uložená obrazová data rychlostí požadovanou pro výstup na displeji.
Protože hodinový signál pro zápis a hodinový signál pro čtení jsou zcela nezávislé, FIFO funguje jako most mezi dvěma časovými systémy. To umožňuje, aby obrazová data spolehlivě přecházela z rozhraní kamery do rozhraní displeje bez chyb synchronizace.
Z tohoto důvodu jsou FIFO s dvojitým hodinovým signálem široce používány pro překračování hodinových domén, přenos vysokorychlostních dat, systémy zpracování videa, komunikační rozhraní a další aplikace, kde musí data přecházet mezi nezávislými časovými prostředími.
Zařízení Altera FPGA poskytují několik způsobů, jak implementovat funkčnost FIFO. Nejlepší metoda závisí na požadavcích návrhu, časovém plánu vývoje a úrovni potřebné přizpůsobitelnosti.
Většina projektů má stejný cíl. FIFO musí být přidáno mezi dva funkční bloky, aby bylo možné data dočasně ukládat, spolehlivě je přenášet a zpracovávat požadovanou rychlostí. Rozdíl spočívá v tom, jak je FIFO vytvořeno a integrováno do návrhu FPGA.
Tři běžné metody implementace jsou široce používány ve vývoji FPGA Altera.
První metoda spočívá ve výstavbě FIFO přímo pomocí RTL (úroveň přenosu registru) kódu.
V tomto přístupu návrhář vytváří kompletní strukturu FIFO, včetně paměťového pole, ukazatele pro čtení, ukazatele pro zápis, logiky pro detekci plnosti, logiky pro detekci prázdnoty a ovládacích obvodů. Každá část operace FIFO je definována ručně v HDL kódu.
Tato metoda poskytuje nejvyšší úroveň flexibility. Hloubka FIFO, šířka dat, stavové příznaky a chování ovládání mohou být přizpůsobeny konkrétním požadavkům aplikace. Další funkce mohou být také přidány, pokud standardní implementace FIFO neposkytují požadovanou funkčnost.
Vyvíjet FIFO od základu však vyžaduje silné chápání architektury FIFO, analýzy časování a technik návrhu FPGA. Další ověřování a testování jsou také potřebná k tomu, aby byla zajištěna spolehlivá činnost za všech podmínek.
Z tohoto důvodu je vývoj vlastního FIFO obvykle vyhrazen pro aplikace, které vyžadují specializované funkce nebo jedinečné požadavky na výkon.
Druhá metoda je použití otevřeného nebo třetího stranu FIFO IP jádra.
Místo navrhování FIFO od začátku je existující FIFO modul importován do projektu a připojen k okolní logice. Protože je často k dispozici zdrojový kód, design může být stále upraven, když jsou potřebné další funkce nebo úpravy.
Tento přístup může výrazně zkrátit čas vývoje. Velká část architektury FIFO byla již vytvořena, testována a validována, což umožňuje návrhářům zaměřit se na systémovou integraci spíše než na nízkoúrovňový vývoj FIFO.
Když se požadavky projektu mírně liší od standardního chování FIFO, může být zdrojový kód upraven tak, aby podporoval požadovanou funkčnost, zatímco se stále vyhne úsilí potřebnému k vytvoření zcela nového návrhu FIFO.
Nejčastější metodou je použití FIFO IP jader poskytovaných softwarem Quartus II.
Quartus II obsahuje vestavěné generátory FIFO, které umožňují vytvářet struktury FIFO prostřednictvím grafického konfiguračního rozhraní. Místo ručního psaní logiky FIFO si návrhář vybírá požadované parametry a nechává software, aby implementaci vygeneroval automaticky.
Během konfigurace lze definovat několik důležitých nastavení. Patří sem:
• Typ FIFO (jednoklokový nebo dvouk clockový)
• Šířka dat
• Hlubokost FIFO
• Možnosti implementace paměti
• Signály stavu plnosti a prázdnosti
• Prahy téměř plnosti a téměř prázdnosti
• Nastavení hodin pro čtení a zápis
Po výběru parametrů Quartus II vygeneruje soubory FIFO a podporující logiku potřebnou pro návrh FPGA.
Jakmile je konfigurace FIFO dokončena, Quartus II automaticky vytvoří optimalizovanou implementaci pro vybraný zařízení Altera FPGA.
Vygenerované FIFO může být poté přímo připojeno k okolní logice. Příchozí data jsou připojena k rozhraní pro zápis, odchozí data jsou připojena k rozhraní pro čtení a signály stavu se používají k řízení toku dat v celém systému.
Protože je vygenerovaný návrh optimalizován pro cílovou architekturu FPGA, využití zdrojů je obvykle efektivnější než u mnoha ručně vyvinutých implementací. Doba vývoje je také zkrácena, protože většinu návrhu, ověřování a optimalizační práce provádí automaticky software.
Pro většinu projektů FPGA poskytuje jádro FIFO IP Quartus II nejrychlejší a nejjednodušší cestu k implementaci spolehlivé funkčnosti FIFO při zachování efektivního využití zdrojů FPGA.
FIFO poskytuje jednoduchý a spolehlivý způsob, jak buferovat data, sladit přenosové rychlosti a podporovat komunikaci mezi různými komponenty systému. Porozuměním architekturám FIFO, signálům stavu, synchronnímu a asynchronnímu provozu a metodám implementace mohou návrháři zlepšit integritu dat, zabránit přetečení a podtečení a vytvořit efektivnější digitální systémy.
FIFO buffery fungují jako dočasné úložiště mezi obvody, které produkují data, a obvody, které je konzumují. Když jedno zařízení generuje data rychleji, než je druhé může zpracovat, FIFO uchovává příchozí informace a uvolňuje je, když je přijímací zařízení připraveno. To zabraňuje ztrátě dat, zlepšuje spolehlivost systému a umožňuje oběma obvodům provozovat nezávisle, aniž by vyžadovaly dokonalé sladění rychlosti.
Asynchronní FIFO používají oddělené hodiny pro zapisování a čtení, což umožňuje bezpečný pohyb dat mezi nezávislými hodinovými doménami. To zabraňuje problémům s časováním a synchronizací, které mohou nastat, když jsou signály přenášeny přímo mezi obvody běžícími na různých frekvencích. Výsledkem je, že asynchronní FIFO se běžně používají v komunikačních rozhraních, video systémech, procesorech a řadičích pamětí.
Signály stavu FIFO poskytují informace o využití bufferu v reálném čase. Signály plnosti a téměř plnosti varují, když se uvolňuje místo pro ukládání, zatímco signály prázdnosti a téměř prázdnosti ukazují, když zbývá málo nebo žádná data. Tyto signály umožňují řídící logice upravit přenosy dat předtím, než dojde k chybám, což pomáhá udržovat integritu dat a stabilní provoz systému.
Video systémy často zahrnují zařízení, která pracují na různých frekvencích hodin, jako jsou kamery a řadiče obrazovek. Dvouk clockové FIFO uchovává příchozí obrazová data pomocí jedněch hodin a umožňuje čtení pomocí jiných hodin. To vytváří spolehlivý most mezi dvěma časovými doménami a zajišťuje kontinuální přenos obrazu bez chyb synchronizace nebo poškození dat.
Jádra FIFO IP Quartus II zjednodušují vývoj automatickým generováním optimalizované logiky FIFO na základě nastavení definovaných uživateli, jako jsou hloubka, šířka, typ hodin a signály stavu. To zkracuje dobu návrhu, minimalizuje úsilí na ověřování a často poskytuje lepší využití zdrojů než ručně kódované implementace, čímž se stává preferovaným řešením pro většinu projektů FPGA.
2024/07/29
2024/08/28
2024/10/6
2024/07/4
2025/09/20
2024/04/22
2024/07/15
2023/12/28
2024/11/15
2025/09/15









