Vraag:
FIFO proberen te begrijpen in hardwarecontext
gpuguy
2014-01-22 19:52:17 UTC
view on stackexchange narkive permalink

Wikipedia definieert de FIFO in elektronica als onder:

FIFO's worden vaak gebruikt in elektronische schakelingen voor buffering en datatransportbesturing, van hardware tot software. In zijn hardwarevorm bestaat een FIFO voornamelijk uit een set lees- en schrijfwijzers, opslag- en besturingslogica.

Ik begrijp in hardware wat opslag is en wat besturingslogica is. Maar in deze definitie begrijp ik de betekenis van lees- en schrijfwijzers niet. Is dit gewoon een soort Programmateller ?

Drie antwoorden:
Olin Lathrop
2014-01-22 20:31:16 UTC
view on stackexchange narkive permalink

Een FIFO is een First In First Out -geheugen. U kunt zich voorstellen dat gegevens aan het ene uiteinde worden verschoven en aan de andere kant worden verschoven, waarbij de hoeveelheid gegevens in de FIFO een maximumlimiet kan bereiken.

Het feitelijk verschuiven van gegevens in het geheugen is echter duur om te doen in hardware. Een betere manier is om een ​​geheugen normaler te gebruiken, maar het te laten lijken op een circulaire buffer door het volgende adres te manipuleren om naar te schrijven en van te lezen. Deze adressen leven in aparte registers en worden vaak de leeswijzer en de schrijfwijzer genoemd.

Hier is een illustratie van de toestand voor een eenvoudige FIFO met een 8-woordgeheugen:

Het volgende inkomende woord wordt geschreven naar het lege woord op adres 1 (de waarde van de schrijfwijzer), en vervolgens naar de schrijfwijzer verhoogd tot 2. Het volgende leesverzoek haalt het woord op 5 (de waarde van de leeswijzer), daarna wordt de leeswijzer verhoogd met 1. In dit voorbeeld zijn de adressen automatisch cirkelvormig als de aanwijzers 3 bits breed zijn . Het toevoegen van 1 tot 7 levert 0 op in 3-bits ongetekende wiskunde.

Volledige FIFO-systemen hebben manieren nodig om de volledige en lege voorwaarden te identificeren. Hiervoor zijn verschillende schema's. Een apart register kan worden gebruikt om bij te houden hoeveel woorden er in de FIFO staan, namelijk 4 in de bovenstaande momentopname.

Een handig schema voor een firmware-implementatie is om de lees- en schrijfaanwijzers te vergelijken. Je zou bijvoorbeeld kunnen besluiten dat beide aanwijzers gelijk FIFO leeg is, en schrijf er een achter read (na wrapping) is FIFO vol. Merk op dat dergelijke schema's één woord van de FIFO ongebruikt laten. Je besteedt uiteindelijk een stukje staat ergens om detectie van vol en leeg mogelijk te maken, of dat nu een apart register is of een onbruikbaar woord in de FIFO. Het voordeel van dit schema is dat lezen en schrijven onafhankelijk en zonder conflicten kan gebeuren, dus zo'n FIFO heeft geen mutex nodig tussen lezen en schrijven. U hoeft interrupts bijvoorbeeld niet uit te schakelen tijdens het lezen, omdat er geen schade wordt toegebracht als een interruptroutine een woord naar de FIFO pusht terwijl de voorgrondcode probeert te lezen.

Dit is wat ik zocht - inderdaad een uitstekende uitleg !!
Ik heb een beetje moeite met de laatste zin. Het lijkt erop dat, om te voorkomen dat de onderbreking waar het schrijven plaatsvindt, moet worden uitgeschakeld, de vergelijking van pointers voor het lezen in een enkele instructie zou moeten worden uitgevoerd en dat de toename van de leeswijzer (na het lezen) ook zou moeten worden bereikt met een enkele instructie. Voor een 8-bits processor zou dit waarschijnlijk vereisen dat de array 256 bytes groot is. Elke maskering van de pointers (of het controleren en corrigeren van overflow) zou aanvullende instructies vereisen, waarbij de interrupt niet mag plaatsvinden. Heb ik het fout?
@Tut: Ja, het verhogen en lezen van de pointers zouden in dat geval atomaire bewerkingen moeten zijn. Meestal garandeert de hardware dat. Op een 8 bit-machine zou je over het algemeen sowieso niet meer RAM dan 256 locaties voor de FIFO willen gebruiken. Op een 16 bit machine krijg je 64k. Het punt is dat het schrijven en lezen van de FIFO niet atomair hoeft te zijn bij het bijwerken van de pointers, zolang de pointers maar worden bijgewerkt na het lezen of schrijven. Dit geldt niet voor andere schema's om FIFO vol / leeg te volgen.
Ahhh! Ik denk dat ik de weg zie. Ik was bang dat de pointers in een enkele instructie zouden moeten worden bijgewerkt, maar dat zou kunnen worden bereikt als de nieuwe pointerwaarde wordt berekend in een afzonderlijke variabele en vervolgens met een enkele instructie naar de daadwerkelijke pointer wordt overgebracht ... bedankt!
Zoals u zei, worden zowel de leeswijzer als de schrijfwijzer opgehoogd na de respectievelijke lees- en schrijfbewerking.Dat betekent dat beide aanwijzerwaarden hetzelfde moeten zijn voor zowel de volledige als de lege toestand.Hoe kunnen we dan onderscheid maken tussen een volledige en lege toestand?
Vasiliy
2014-01-23 03:42:34 UTC
view on stackexchange narkive permalink

Olin's antwoord dekt het volledig.

Ik wil alleen maar toevoegen dat in digitale HW FIFO's vaak worden gebruikt om multi-bit data over te dragen tussen asynchrone klokdomeinen ( Clock Domain Crossing - CDC). Dit onderwerp is op dit moment misschien niet interessant voor je (het is nogal een gevorderd onderwerp), maar ik denk dat het volledig moet worden behandeld.

Deze speciale FIFO's worden asynchrone (asynchrone) FIFO's genoemd, en hoewel ze qua structuur vergelijkbaar zijn met basis-FIFO's, zijn er twee belangrijke toevoegingen:

  • Lees- / schrijfopdrachten worden omgezet in grijze code voordat ze worden overgedragen tussen asynchrone klokdomeinen
  • De geconverteerde waarden worden gesynchroniseerd met de klok van het bestemmingsdomein met behulp van synchronizers.

Dit schema zorgt ervoor dat multi-bit gegevens worden overgedragen zonder metastabiliteit problemen en het vermijden van datacorruptie als gevolg van onafhankelijke synchronisatie van bits.

Een logische structuur van async FIFO: enter image description here

Phil Frost
2014-01-22 19:56:13 UTC
view on stackexchange narkive permalink

Een programmateller houdt de laatste instructie bij die in een programma is uitgevoerd. In een FIFO volgen de lees- en schrijfwijzers de laatste bit of byte die het laatst is gelezen of geschreven. Het zijn dus vergelijkbare concepten, maar voor verschillende dingen.

Het concept is niet zo moeilijk als je het jargon weghaalt. Als iemand u een lange lijst met nummers heeft gegeven en u heeft gevraagd ze op volgorde te lezen, kunt u uw vinger op de pagina plaatsen om uw plaats te helpen bepalen. Je vinger is een leesteller.

Ik weet niet zeker waarom je het woord "laatste" blijft gebruiken. In de meeste ISA's verwijst de pc naar de * volgende * instructie die moet worden uitgevoerd, en in de meeste FIFO's verwijzen de aanwijzers voor lezen en schrijven naar de * volgende * posities die respectievelijk moeten worden gelezen en geschreven.
@DaveTweed of het de "laatste" of de "volgende" is, hangt af van precies wanneer u in de instructiecyclus kijkt.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...