Hej gäst

Logga in / Registrera

Welcome,{$name}!

/ Logga ut
Svenska
EnglishDeutschItaliaFrançais한국의русскийSvenskaNederlandespañolPortuguêspolski繁体中文SuomiGaeilgeSlovenskáSlovenijaČeštinaMelayuMagyarországHrvatskaDanskromânescIndonesiaΕλλάδαБългарски езикGalegolietuviųMaoriRepublika e ShqipërisëالعربيةአማርኛAzərbaycanEesti VabariikEuskeraБеларусьLëtzebuergeschAyitiAfrikaansBosnaíslenskaCambodiaမြန်မာМонголулсМакедонскиmalaɡasʲພາສາລາວKurdîსაქართველოIsiXhosaفارسیisiZuluPilipinoසිංහලTürk diliTiếng ViệtहिंदीТоҷикӣاردوภาษาไทยO'zbekKongeriketবাংলা ভাষারChicheŵaSamoaSesothoCрпскиKiswahiliУкраїнаनेपालीעִבְרִיתپښتوКыргыз тилиҚазақшаCatalàCorsaLatviešuHausaગુજરાતીಕನ್ನಡkannaḍaमराठी
Hem > blogg > Komplett FIFO-guide: Arbetsprincip och designtekniker

Komplett FIFO-guide: Arbetsprincip och designtekniker

FIFO (Först in, Först ut) är en buffringsteknik som används i digitala system för att lagra och överföra data i samma ordning som den tas emot. Det hjälper till att hantera dataflödet mellan hårdvarublock som arbetar på olika hastigheter eller klockdomäner, vilket gör det till en väsentlig komponent i FPGA-, ASIC-, kommunikations- och databehandlingsapplikationer. Denna artikel förklarar FIFO:s driftsprinciper, strukturer, status-signaler, metoder för klockdomänskorsning, implementeringstekniker och praktiska tillämpningar.

Katalog

1. Vad är FIFO
2. FIFO-strukturer och deras skillnader
3. FIFO-funktioner i olika strukturer
4. Hur man använder FIFO i Altera FPGA
5. Slutsats

Complete FIFO Guide Working Principle and Design Techniques

Vad är FIFO?

Hur FIFO fungerar

FIFO (Först in, Först ut) är en datalagringsmetod där de första data som skrivs till en buffert också är de första data som läses ut. Driftsprincipen är liknande en kö. Data går in i bufferten i en specifik ordning och förblir lagrad tills den läses. De tidigaste data lämnar alltid bufferten först, medan nyare data väntar bakom dem.

I FPGA- och ASIC-system används FIFO vanligtvis som ett tillfälligt lagringsområde mellan kretsar som producerar data och kretsar som konsumerar data. Istället för att skicka data direkt från en block till ett annat lagras inkommande data först i FIFO. Den mottagande kretsen läser sedan de lagrade data när den är redo. Detta tillvägagångssätt hjälper till att upprätthålla ett kontinuerligt och pålitligt dataflöde.

Till skillnad från vanlig minne kräver FIFO inga externa adressledningar för att välja lagringsplatser. Under en skrivoperation placeras inkommande data automatiskt i nästa tillgängliga plats i bufferten. Under en läsoperation hämtas automatiskt de äldsta lagrade data och skickas till utgången.

Denna process hanteras av interna skrivpekare och läspekare. När nya data skrivs rör sig skrivpekaren till nästa lagringsplats. När data läses avancera läspekaren till nästa tillgängliga objekt. Eftersom dessa pekare fungerar automatiskt kräver FIFO mindre kontrolllogik än konventionellt minne.

Nackdelen är att data endast kan nås sekventiellt. Till skillnad från RAM kan FIFO inte direkt komma åt en specifik lagringsplats. Varje läsoperation följer exakt den ordning i vilken data ursprungligen skrevs.

Varför FIFO används i digitala system

FIFO används i stor utsträckning när olika delar av ett system fungerar med olika hastigheter. I många applikationer genererar en enhet kontinuerligt data medan en annan enhet bearbetar eller överför dessa data med en långsammare hastighet. Utan temporär lagring kan inkommande data ankomma snabbare än de kan hanteras, vilket orsakar dataloss.

Till exempel kan en analog-till-digital omvandlare (ADC) kontinuerligt generera digitala prover medan en processor, PCI-buss eller kommunikationsgränssnitt bearbetar dessa prover i en annan hastighet. En FIFO fungerar som en mellanliggande buffert som lagrar inkommande data och släpper dem när den mottagande kretsen är redo. Detta gör att båda sidor av systemet kan fungera oberoende utan att förlora information.

FIFO kan också lösa data-width mismatch mellan enheter. I vissa system kan en enhet leverera 8-bitarsdata medan en annan förväntar sig 16-bitarsdata. Direkt kommunikation kan kräva ytterligare konverteringslogik för att omorganisera data.

En FIFO kan förenkla denna process genom att tillfälligt lagra de inkommande data och presentera dem i ett format som matchar den mottagande enheten. Denna kapabilitet hjälper olika hårdvarublock att utbyta data effektivt medan den minskar gränssnittets komplexitet.

Typer av FIFO

FIFO-strukturer delas vanligtvis in i synkrona FIFO och asynkrona FIFO.

En synkron FIFO använder en enda klocksignal för både läs- och skrivoperationer. Eftersom alla aktiviteter sker under samma källklocka är tidrelationerna enklare att hantera och verifiera. Synkrona FIFOs används vanligtvis när data förblir inom ett enda klockdomän.

En asynkron FIFO använder separata klockor för skrivning och läsning. Data kan komma in i FIFO med en klockfrekvens och lämna med en annan. Eftersom de två klockorna fungerar oberoende av varandra används asynkrona FIFOs ofta för att överföra data mellan olika klockdomäner.

Denna kapabilitet är särskilt viktig i FPGA-system där processorer, kommunikationsgränssnitt, minneskontroller och perifera enheter ofta arbetar med olika frekvenser.

FIFO Statussignaler och Buffermanagement

Pålitlig FIFO-operation beror på att veta hur mycket data som för närvarande lagras i bufferten. Om ny data fortsätter att ankomma efter att FIFO har nått kapacitet kan giltig information skrivas över. På samma sätt ger försök att läsa data från en tom FIFO ogiltiga resultat.

För att förhindra dessa tillstånd använder FIFO-design flera status signaller.

Fulla flaggan indikerar att alla tillgängliga lagringsplatser är upptagna och att ingen ytterligare data kan skrivas. Den tomma flaggan indikerar att ingen giltig data återstår för läsning.

Många FIFO-implementationer tillhandahåller också nästan fulla och nästan tomma indikatorer. Dessa signaler fungerar som tidiga varningar innan FIFO når ett helt fullt eller helt tomt tillstånd. Kontrolllogik kan använda dessa signaler för att sakta ner, stoppa eller justera datatransfer innan överflöd eller underflöde inträffar.

Eftersom dessa statusindikatorer direkt påverkar dataintegritet och systemets pålitlighet är de en väsentlig del av FIFO-design.

FIFO-strukturer och deras skillnader

Huvud FIFO-strukturer

FIFO-strukturer delas vanligtvis in i Single Clock FIFO (SCFIFO) och Dual Clock FIFO (DCFIFO). Dessa strukturer är utformade för att stödja olika klockrelationer och datatransferkrav.

De vanligaste FIFO-strukturerna inkluderar:

• SCFIFO (Single Clock FIFO)

• DCFIFO (Dual Clock FIFO)

• DCFIFO Blandade Bredder (Dual Clock FIFO med olika läs- och skrivdatabredder)

I de flesta FPGA-dokumentationer kategoriseras standard dual-clock FIFOs och blandade bred dual-clock FIFOs båda som dual-clock FIFOs om det inte krävs någon åtskillnad.

SCFIFO and DCFIFO Symbol Diagrams

Valet av FIFO-struktur beror huvudsakligen på hur data kommer in i och lämnar bufferten. Förhållandet mellan skrivklockan och läsklockan är vanligtvis den viktigaste faktorn vid valet av lämplig FIFO-arkitektur.

Single Clock FIFO (SCFIFO)

En Single Clock FIFO använder en klocksignal för att kontrollera både skriv- och läsfunktioner. Eftersom båda processerna fungerar inom samma klockdomän är tidskontrollen relativt enkel och synkroniseringsproblem minimeras.

När giltig data ankommer vid FIFO-ingången och en skrivbegäran har bekräftats lagras data i nästa tillgängliga minnesplats vid aktiv klockkant. När mer data ankommer fortsätter skrivpekaren att röra sig framåt genom FIFO-lagringsområdet.

När en läsbegäran har bekräftats hämtar FIFO den äldsta lagrade datan och placerar den på utgången. Läspunkten avancerar sedan till nästa lagrade plats. Denna kontinuerliga rörelse av läs- och skrivpekare gör att data kan flöda genom FIFO i rätt ordning.

Single-clock FIFOs tillhandahåller också flera status signaler som hjälper till att övervaka buffertvillkor. Fulla flaggan indikerar att alla lagringsplatser är upptagna och ytterligare skrivningar måste stoppas. Den nästan fulla flaggan varnar för att FIFO närmar sig kapaciteten.

Den tomma flaggan indikerar att ingen giltig data återstår i bufferten, medan den nästan tomma flaggan varnar för att endast en liten mängd data återstår. Många implementationer inkluderar också en använd ord-räknare, som rapporterar hur mycket data som för närvarande lagras i FIFO.

Dessa indikatorer tillåter den omgivande logiken att fatta säkra läs- och skrivbeslut samtidigt som de upprätthåller pålitlig FIFO-operation.

Dual Clock FIFO (DCFIFO)

En Dual Clock FIFO använder separata klockor för skriv- och läsoperationer. Skridsidan fungerar inom en klockdomän, medan lässidan fungerar inom en annan.

Inkommande data skrivs in i FIFO med hjälp av skrivklockan. När den har lagrats förblir datan inuti bufferten tills lässidan hämtar den med hjälp av läsklockan. Eftersom de två klockorna är oberoende kan FIFO säkert överföra data mellan olika klockdomäner.

Denna kapabilitet gör dual-clock FIFOs till en av de mest vanliga lösningarna för klockdomänövergång i FPGA-system.

För att stödja pålitlig drift tillhandahåller dual-klock FIFOs statusindikatorer för båda sidor av gränssnittet. Skrivsidan använder vanligtvis signaler som wrfull och wrempty för att ange skrivsidans buffertförhållanden. Läsidan använder vanligtvis rdfull och rdempty för att indikera datatillgänglighet för läsning.

Separata räknare tillhandahålls också ofta så att varje klockdomän kan övervaka mängden lagrad data oberoende. Dessa indikatorer gör det möjligt för båda sidor av FIFO:n att fatta beslut utan att störa varandra.

Blandad Bredd Dual Klock FIFO

Vissa applikationer kräver olika datalängder på skrivsidan och läsidan av FIFO:n. I dessa situationer kan en Blandad Bredd Dual Klock FIFO användas.

Till exempel kan data skrivas in i FIFO:n som 16-bitars ord men läsas ut som 8-bitars ord. FIFO:n omorganiserar automatiskt den lagrade informationen och utför den nödvändiga breddkonverteringen samtidigt som den ursprungliga datasekvensen bevaras.

Denna funktion är användbar när enheter som använder olika bussbreddar kopplas samman. Istället för att lägga till separat konverteringskretsverk hanterar FIFO:n breddanpassningen internt.

När man ska använda varje FIFO-struktur

En Enkel Klock FIFO används vanligtvis när både läsning och skrivning sker inom samma klockdomän. Dess enklare arkitektur gör tidanalys och implementering lättare.

En Dual Klock FIFO föredras när data måste flyttas mellan oberoende klockdomäner. Den tillhandahåller pålitlig klockdomänövergång och hjälper till att eliminera synkroniseringsproblem.

När både klockdomänövergång och datalängdskonvertering krävs ger en Blandad Bredd Dual Klock FIFO en effektiv lösning genom att kombinera båda funktionerna inom en enda FIFO-struktur.

FIFO-funktioner i olika strukturer

Varför FIFO är viktigt i digitala system

FIFO fungerar som ett tillfälligt lagringsområde mellan olika delar av ett digitalt system. I många applikationer anländer och lämnar data inte med exakt samma hastighet. En enhet kan generera data kontinuerligt, medan en annan enhet kanske behandlar eller överför den datan i en långsammare takt. Utan en buffert mellan dem kan inkommande data samlas snabbare än den kan hanteras, vilket leder till dataloss.

En FIFO löser detta problem genom att lagra data när det anländer och släppa det när den mottagande kretsen är redo. Detta skapar ett jämnare informationsflöde och gör att olika delar av systemet kan fungera mer effektivt utan att kräva perfekt tidskoordinering.

Utöver enkel buffring hjälper FIFO också till att förbättra den övergripande systemprestandan. Genom att temporärt samla data innan överföring minskar FIFO antalet bussåtkomstoperationer och minimerar onödig kommunikationsöverhuvud. Detta gör att systemresurser kan användas mer effektivt.

FIFO kan också minska processorbelastningen. Istället för att tvinga CPU:n att hantera varje enskild datatransfer kan data samlas i FIFO:n och bearbetas i större block. Denna metod förbättrar effektiviteten och frigör processorresurser för andra uppgifter.

En annan viktig fördel är stöd för Direct Memory Access (DMA) operationer. I hög hastighetssystem låter DMA data flytta direkt mellan perifera enheter och minne utan konstant CPU-inblandning. FIFO tillhandahåller den tillfälliga lagring som behövs för att stödja dessa överföringar och upprätthålla ett kontinuerligt datastream.

Utan FIFO-buffring och DMA-stöd kan processorn spendera en betydande mängd tid på att hantera datarörelse, vilket kan minska den övergripande systemprestandan och öka risken för överföringsflaskhalsar.

Enkel Klock FIFO

En Enkel Klock FIFO används vanligtvis när både skrivoperationen och läsoperationen styrs av samma klocksignal. Eftersom båda sidor av FIFO:n fungerar inom samma klockdomän är tidsstyrning enklare och synkroniseringsproblem är lättare att undvika.

En vanlig tillämpning är sensor dataförvärv. I många system kan en sensor generera data mycket snabbare än kommunikationsgränssnittet som ansvarar för att överföra den datan till en annan enhet.

Till exempel kan en FPGA samla data från en sensor via ett hög hastighets SPI-gränssnitt. Varje sensorsample anländer snabbt och måste lagras omedelbart för att undvika att information går förlorad. Samtidigt kan de insamlade data behöva överföras genom ett UART-gränssnitt som fungerar vid en mycket lägre baudrate.

När sensordata kommer in i FPGA:n skrivs den direkt in i FIFO:n. Den lagrade datan väntar sedan inne i bufferten medan UART gradvis överför den med sin egen hastighet. När data lämnar FIFO:n fortsätter nya sensorsamples att komma in i bufferten. Denna kontinuerliga skriv- och läsprocess gör att båda sidor av systemet kan fungera vid olika datahastigheter samtidigt som de förblir synkroniserade av samma källklocka.

Genom att absorbera tillfälliga hastighetsskillnader mellan datainsamling och datatransmission hjälper en enkelklocka FIFO till att upprätthålla ett stabilt dataflöde och förhindrar dataloss.

Dubbelklocka FIFO

En dubbelklocka FIFO är utformad för system där skrivsidan och lässidan fungerar med olika klocksignaler. Denna situation är vanlig i FPGA-design eftersom många funktionsblock körs på olika frekvenser och tidskrav.

När data rör sig från en klockdomän till en annan kan direkta anslutningar skapa synkroniseringsproblem. Data kan anlända för tidigt, för sent eller under instabila tidsfönster, vilket leder till opålitlig drift.

En dubbelklocka FIFO ger en säker gräns mellan de två klockdomänerna. Inkommande data skrivs in i FIFO:n med hjälp av källklockan. När den är lagrad förblir datan i bufferten tills destinationssidan läser den med sin egen klocka. FIFO:n hanterar internt överföringsprocessen så att båda klockdomänerna kan fungera oberoende.

Ett videobehandlingssystem ger ett bra exempel. En kamera kan fånga bilddata med en klockfrekvens, medan en VGA-kontroller visar bilddata med en annan klockfrekvens. När bilddata genereras av kameran skrivs de kontinuerligt in i FIFO:n. VGA-kontrollern läser sedan de lagrade bilddata med den hastighet som krävs för visningsutgången.

Eftersom skrivklockan och läsklockan är helt oberoende fungerar FIFO:n som en bro mellan de två tidsystemen. Detta gör det möjligt för bilddata att röra sig på ett tillförlitligt sätt från kameragränssnittet till visningsgränssnittet utan synkroniseringsfel.

Av denna anledning används dubbelklocka FIFO:er i stor utsträckning för övergång mellan klockdomäner, hög hastighet för datatransfer, videobehandlingssystem, kommunikationsgränssnitt och andra applikationer där data måste röra sig mellan oberoende tidsmiljöer.

Hur man använder FIFO i Altera FPGA

Vanliga metoder för att implementera FIFO

Altera FPGA-enheter tillhandahåller flera sätt att implementera FIFO-funktionalitet. Den bästa metoden beror på designkraven, utvecklingsschemat och nivån på anpassning som behövs.

I de flesta projekt är målet detsamma. En FIFO måste läggas till mellan två funktionsblock så att data kan lagras tillfälligt, överföras på ett tillförlitligt sätt och behandlas med den nödvändiga hastigheten. Skillnaden ligger i hur FIFO:n skapas och integreras i FPGA-designen.

Tre vanliga implementationsmetoder används i stor utsträckning inom Altera FPGA-utveckling.

Skapa en anpassad FIFO med RTL-kod

Den första metoden är att bygga en FIFO direkt med RTL (Register Transfer Level) kod.

I detta tillvägagångssätt skapar designern den kompletta FIFO-strukturen, inklusive minnesmatris, läspointer, skrivpointer, logik för full upptäckte, logik för tom upptäckte och styrkretsar. Varje del av FIFO-operationen definieras manuellt inom HDL-koden.

Denna metod ger den högsta nivån av flexibilitet. FIFO-djup, data bredd, statusflaggor och styrbeteende kan alla anpassas för att matcha specifika applikationskrav. Ytterligare funktioner kan också läggas till om standard FIFO-implementationer inte tillhandahåller den nödvändiga funktionaliteten.

Men utveckling av en FIFO från grunden kräver en stark förståelse för FIFO-arkitektur, tidsanalys och FPGA-designtekniker. Mer verifiering och testning behövs också för att säkerställa pålitlig drift under alla förhållanden.

Av denna anledning är utveckling av anpassade FIFO:er vanligtvis reserverad för applikationer som kräver specialfunktioner eller unika prestandakrav.

Använda öppen källkod eller tredjeparts FIFO IP-kärnor

Den andra metoden är att använda en öppen källkod eller tredjeparts FIFO IP-kärna.

Istället för att designa FIFO:n från början importeras en befintlig FIFO-modul i projektet och ansluts till den omgivande logiken. Eftersom källkoden ofta är tillgänglig kan designen fortfarande ändras när ytterligare funktioner eller justeringar behövs.

Denna metod kan avsevärt minska utvecklingstiden. Mycket av FIFO-arkitekturen har redan skapats, testats och validerats, vilket gör att designer kan fokusera på systemintegration snarare än på låg nivå FIFO-utveckling.

När projektkraven skiljer sig något från standard FIFO-beteende kan källkoden redigeras för att stödja den önskade funktionaliteten samtidigt som man undviker den ansträngning som krävs för att skapa en helt ny FIFO-design.

Använda Quartus II FIFO IP-kärnan

Den vanligaste metoden är att använda FIFO IP-kärnorna som tillhandahålls av Quartus II-programvaran.

Quartus II inkluderar inbyggda FIFO-generatorer som gör det möjligt att skapa FIFO-strukturer genom ett grafiskt konfigurationsgränssnitt. Istället för att manuellt skriva FIFO-logik väljer designern de erforderliga parametrarna och låter programvaran automatiskt generera implementationen.

Under konfiguration kan flera viktiga inställningar definieras. Dessa inkluderar:

• FIFO-typ (enkelt klocka eller dubbelt klocka)

• Databredd

• FIFO-djup

• alternativ för minnesimplementering

• Signaler för full och tom status

• Nästan fulla och nästan tomma trösklar

• Inställningar för läs- och skrivklocka

När parametrarna har valts genererar Quartus II FIFO-filerna och den stödjande logik som krävs för FPGA-designen.

FIFO-generering och optimering

När FIFO-konfigurationen är klar skapar Quartus II automatiskt en optimerad implementation för den valda Altera FPGA-enheten.

Den genererade FIFO kan sedan kopplas direkt till den omgivande logiken. Inkommande data kopplas till skrivgränssnittet, utgående data kopplas till läsgränssnittet och statusignaler används för att styra dataflödet i hela systemet.

Eftersom den genererade designen är optimerad för den avsedda FPGA-arkitekturen, är resursutnyttjandet vanligtvis mer effektivt än många manuellt utvecklade implementationer. Utvecklingstiden minskas också eftersom mycket av design-, verifierings- och optimeringsarbetet hanteras automatiskt av mjukvaran.

För de flesta FPGA-projekt erbjuder Quartus II FIFO IP-kärnor den snabbaste och enklaste vägen för att implementera pålitlig FIFO-funktionalitet samtidigt som man upprätthåller effektiv användning av FPGA-resurser.

Slutsats

FIFO erbjuder ett enkelt och pålitligt sätt att buffra data, matcha överföringshastigheter och stödja kommunikation mellan olika systemkomponenter. Genom att förstå FIFO-arkitekturer, statusignaler, synkron och asynkron drift, samt implementeringsmetoder kan designers förbättra dataintegriteten, förhindra överflöden och underflöden, och bygga mer effektiva digitala system.






Vanliga frågor [FAQ]

1. Varför är FIFO-buffertar viktiga när olika delar av ett digitalt system fungerar vid olika hastigheter?

FIFO-buffertar fungerar som tillfällig lagring mellan datagenererande och datakonsumerande kretsar. När en enhet genererar data snabbare än vad en annan kan bearbeta den, lagrar FIFO den inkommande informationen och släpper den när den mottagande enheten är redo. Detta förhindrar dataloss, förbättrar systemets pålitlighet och tillåter båda kretsarna att fungera oberoende utan att behöva perfekt hastighetsanpassning.

2. Varför används asynkrona FIFOs i stor utsträckning för klockdomänövergångar i FPGA-design?

Asynkrona FIFOs använder separata klockor för skriv- och läsoperationer, vilket tillåter data att röra sig säkert mellan oberoende klockdomäner. Detta förhindrar tids- och synkroniseringsproblem som kan uppstå när signaler överförs direkt mellan kretsar som körs vid olika frekvenser. Som ett resultat används asynkrona FIFOs ofta i kommunikationsgränssnitt, videosystem, processorer och minneskontroller.

3. Hur hjälper FIFO-statussignaler att förhindra överflöden och underflöden?

FIFO-statussignaler ger realtidsinformation om buffertanvändning. Fulla och nästan-fulla flaggor varnar när lagringsutrymmet håller på att ta slut, medan tomma och nästan-tomma flaggor indikerar när lite eller ingen data förblir tillgänglig. Dessa signaler tillåter styrlogik att justera dataöverföringar innan fel uppstår, vilket hjälper till att upprätthålla dataintegriteten och stabil systemdrift.

4. Varför används dubbla klock FIFOs ofta i videobehandlingssystem?

Videosystem involverar ofta enheter som fungerar vid olika klockfrekvenser, såsom kameror och visningskontroller. En dubbelklocka FIFO lagrar inkommande bilddata med en klocka och tillåter det att läsas med en annan klocka. Detta skapar en pålitlig bro mellan de två tidsdomänerna och säkerställer en kontinuerlig bildöverföring utan synkroniseringsfel eller datakorruption.

5. Varför föredrar många FPGA-designers Quartus II FIFO IP-kärnor istället för att skapa FIFOs från grunden?

Quartus II FIFO IP-kärnor förenklar utvecklingen genom att automatiskt generera optimerad FIFO-logik baserat på användardefinierade inställningar som djup, bredd, klocktyp och statusignaler. Detta minskar design tiden, minimerar verifieringsinsatsen och ger ofta ett bättre resursutnyttjande än manuellt kodade implementationer, vilket gör det till den föredragna lösningen för de flesta FPGA-projekt.

Besläktad blogg