Articulo de referencia

FIFO (electrónico)

Circuito integrado, FIFO de 5048 palabras por 8 bits ( NEC D485505g-25) En electrónica digital , un FIFO ( acrónimo de first-in, first-out, primero en entrar, primero en salir )...

Circuito integrado, FIFO de 5048 palabras por 8 bits ( NEC D485505g-25)

En electrónica digital , un FIFO ( acrónimo de first-in, first-out, primero en entrar, primero en salir ) es un circuito digital que almacena los datos entrantes en memoria interna y los emite en el orden en que fueron recibidos. [ 1 ] Los datos se almacenan bajo demanda y los datos almacenados más antiguos se emiten bajo demanda, y ambas operaciones ocurren de forma independiente [ 2 ] y a velocidades potencialmente diferentes. [ 3 ] Esto contrasta con un registro de desplazamiento , que requiere que los datos se almacenen y emitan simultáneamente, y que los datos más antiguos se propaguen secuencialmente a través de la memoria antes de ser emitidos. [ 2 ]

Una FIFO consta principalmente de un par de contadores que funcionan como registros de direcciones de memoria de lectura y escritura, una matriz de memoria direccionable y lógica de estado y control. [ 4 ]

Los datos almacenados en una FIFO suelen tener un tamaño de palabra fijo (número de bits ), conocido como ancho de FIFO . El número máximo de datos que se pueden almacenar se denomina profundidad de FIFO . El ancho y la profundidad, en conjunto, determinan la capacidad de almacenamiento de una FIFO.

Las FIFO se utilizan para intercambiar datos entre dos dispositivos de hardware o entre un dispositivo de hardware y software. [ 5 ] Se utilizan comúnmente para intercambiar datos entre circuitos que operan en diferentes dominios de reloj, y para el almacenamiento en búfer y el control de flujo entre productores y consumidores de datos que, en intervalos finitos, operan a diferentes velocidades de datos. [ a ] ​​[ 1 ]

Puertos de interfaz

Una FIFO proporciona dos puertos a través de los cuales se conecta a un productor de datos externo y a un consumidor de datos.

Una FIFO tiene dos interfaces eléctricas conocidas como puerto de escritura y puerto de lectura , a través de las cuales intercambia datos e información de estado con circuitos externos. [ 6 ] [ 3 ]

Agentes de escritura y lectura

Los circuitos externos conectados a los puertos de una FIFO constan de un productor de datos (también llamado fuente de datos o agente de escritura ) que almacena datos en la FIFO y un consumidor de datos (también conocido como receptor de datos o agente de lectura ) que recupera los datos almacenados. [ 6 ] [ 7 ] Más específicamente, el productor envía datos al puerto de escritura y recibe información de estado del mismo, y el consumidor recibe tanto datos como estado del puerto de lectura.

dominio del reloj

Cada puerto opera en el dominio de reloj del circuito externo al que está conectado, lo que significa que el puerto y el circuito externo comparten una señal de reloj común. [ b ] El puerto de escritura opera en el dominio de reloj del productor y, por lo tanto, todas las señales del puerto de escritura están sincronizadas con el reloj del productor. De manera similar, el puerto de lectura opera en el dominio de reloj del consumidor.

tipos FIFO

Cada FIFO se clasifica como síncrono o asíncrono .

FIFO síncrono

Representación simbólica de una FIFO síncrona. Ambos puertos comparten un reloj común, lo que les permite compartir también información de estado.

Una FIFO síncrona es una FIFO electrónica que utiliza un reloj común para los puertos de lectura y escritura. [ 8 ]

Dado que las operaciones de lectura y escritura se realizan en el mismo dominio de reloj, las señales de estado de la FIFO (nivel del búfer, indicadores de umbral) pueden ser utilizadas de forma segura tanto por el productor como por el consumidor de datos sin causar metaestabilidad. En consecuencia, una FIFO síncrona emite un único grupo compartido de señales de estado.

FIFO asíncrono

Representación simbólica de una FIFO asíncrona. Cada puerto tiene un reloj único, por lo que requiere que genere señales de estado específicas para su dominio de reloj.

Una FIFO asíncrona es una FIFO electrónica que utiliza diferentes relojes para los puertos de lectura y escritura. [ 8 ]

Para evitar errores debidos a la metaestabilidad , se genera un conjunto específico de señales de estado (nivel de búfer, indicadores de umbral) para cada dominio de reloj. El circuito utilizado para evitar la metaestabilidad introduce una latencia adicional (en comparación con las FIFO síncronas) en las actualizaciones de los indicadores de estado cuando se escriben datos en una FIFO vacía o se leen de una FIFO llena.

Atributos de memoria

Para facilitar las operaciones concurrentes de lectura y escritura, la memoria en todas las FIFO asíncronas [ 1 ] y en muchas FIFO síncronas es de doble puerto, generalmente compuesta por un banco de registros o una RAM (memoria de acceso aleatorio) de doble puerto . En las FIFO asíncronas, la memoria es un circuito asíncrono accesible a la lógica que opera en cualquier dominio de reloj. [ 1 ]

Ancho

Los datos que se escriben y se leen de una FIFO suelen tener el mismo tamaño de palabra fijo (número de bits ), comúnmente conocido como ancho de FIFO [ 6 ] , que coincide con el tamaño de palabra nativo de la memoria interna.

Profundidad

El número máximo de palabras que se pueden almacenar en una FIFO se conoce como profundidad de FIFO . [ 6 ] Aunque no es obligatorio, la profundidad suele ser una potencia entera de dos, ya que esto tiende a simplificar los circuitos y mejorar el rendimiento de velocidad. [ 9 ]

Para evitar el desbordamiento, la profundidad de la FIFO debe ser lo suficientemente grande como para almacenar los datos resultantes de la diferencia en el peor de los casos entre las tasas de producción y consumo de datos, [ 10 ] y los anchos de banda promedio del productor y el consumidor deben coincidir. [ 1 ] Además, en las FIFO asíncronas, se suele proporcionar una pequeña cantidad de profundidad adicional para permitir la latencia de estado. [ 10 ]

registros de direcciones de memoria

Una FIFO se implementa como un búfer circular que emplea dos registros de direcciones de memoria (MAR) para almacenar las direcciones ( punteros ) de las siguientes ubicaciones de memoria a las que se accederá. [ 1 ] El MAR de lectura (RMAR) indica la siguiente ubicación de la que se leerán los datos, y el MAR de escritura (WMAR) indica la siguiente ubicación en la que se escribirán los datos. [ 11 ] Cada MAR está asociado a un puerto específico y, por lo tanto, opera en el dominio de reloj de ese puerto.

Cada MAR se implementa como un contador , cuyo valor se incrementa cada vez que se transfieren datos (WMAR se incrementa al escribir en la FIFO; RMAR se incrementa al leer en la FIFO). [ 3 ] Inicialmente, ambos MAR apuntan a la primera ubicación de memoria y la FIFO está vacía. [ 11 ] Una FIFO se llena cuando la dirección de escritura alcanza la dirección de lectura y se vacía cuando la dirección de lectura alcanza la dirección de escritura. [ 1 ] Cuando un MAR apunta a la última ubicación de memoria, automáticamente vuelve a la primera dirección de memoria en el siguiente incremento. [ 3 ]

Para cualquier FIFO en particular, los MAR pueden implementarse como contadores binarios o de código Gray. Los contadores binarios suelen preferirse en FIFOs síncronas, ya que simplifican el circuito. Los contadores de código Gray , o contadores binarios codificados en código Gray, se utilizan en FIFOs asíncronas para evitar errores debidos a la metaestabilidad.

Señales de estado

Nivel de búfer

Muchas FIFO generan un valor binario que indica el nivel actual del búfer (número de palabras almacenadas). [ 11 ] Dependiendo de su diseño, una FIFO puede hacerlo monitorizando el nivel con un contador o calculándolo mediante aritmética de punteros. Las FIFO síncronas pueden usar cualquiera de los dos métodos, mientras que las FIFO asíncronas se limitan a usar aritmética de punteros. [ 8 ]

Seguimiento mediante contador

Contador binario bidireccional (ascendente/descendente) utilizado para controlar el nivel del búfer. Este método puede utilizarse en FIFOs donde las operaciones de lectura y escritura comparten un reloj común, pero no es adecuado cuando las lecturas y escrituras operan en dominios de reloj diferentes.

En una FIFO síncrona, el nivel del búfer se puede monitorizar mediante un contador binario bidireccional . [ 8 ] El contador se incrementa al escribir datos en la FIFO y se decrementa al leerlos. El valor binario que muestra el contador indica directamente el nivel del búfer.

Este método no es adecuado para FIFOs asíncronos porque los puertos de lectura y escritura operan en dominios de reloj diferentes, lo que requeriría que el contador fuera controlado por dos relojes diferentes. [ 8 ]

Cálculo mediante aritmética de punteros

En las FIFO asíncronas, y en muchas síncronas, el nivel del búfer se calcula a partir de las direcciones de memoria actuales. Esto se hace fácilmente cuando la FIFO no está ni vacía ni llena, ya que el nivel es igual a la diferencia entre las direcciones de escritura y lectura. Sin embargo, cuando la FIFO está vacía o llena, las direcciones son iguales y, por lo tanto, serían ambiguas si se usaran para calcular el nivel. [ 11 ] En consecuencia, para distinguir entre vacía y llena, es común que cada MAR tenga un bit adicional más allá de lo necesario para direccionar la memoria. La dirección extendida resultante (XADDR) se usa para calcular el nivel de la FIFO, mientras que todos los bits de XADDR, excepto el bit más significativo (MSB) (es decir, los LSB), sirven como dirección de memoria.

En general, un MOD-norte{\displaystyle n}contador (un contador connorte{\displaystyle n}estados de salida distintos) se utiliza para una memoria FIFO que puede almacenarnorte/2{\displaystyle n/2}palabras de datos. Por ejemplo, un MOD-32 MAR se utiliza para generar direcciones en una FIFO con una memoria de 16 palabras.

En los casos en que los MAR son contadores binarios, el nivel del búfer es la diferencia entre los valores de salida de MAR:lmivmil=WMETROARRMETROAR{\displaystyle level=WMAR-RMAR}. Para otras codificaciones de salida (por ejemplo, código Gray), las salidas MAR deben convertirse a binario antes de calcular la diferencia. En cualquier caso, la diferencia se calcula normalmente mediante un MOD-norte{\displaystyle n}restador binario , descartando cualquier préstamo aritmético resultante (es decir, acarreo).

indicadores de umbral de búfer

Una FIFO emite señales de estado individuales (banderas) que indican si se cumplen determinados umbrales de nivel de datos. Todas las FIFO emiten banderas de lleno y vacío , y algunas también pueden emitir banderas adicionales como medio lleno , casi lleno y casi vacío . [ 1 ]

Las señales de estado pueden generarse comparando directamente las direcciones de lectura y escritura sincronizadas o, si está disponible, a nivel de FIFO. En este último caso, las señales de estado se derivan del nivel de FIFO mediante lógica combinacional o, en el caso de FIFO llena , extrayendo el bit más significativo (MSB). Dependiendo del diseño de la FIFO, los umbrales para los indicadores de casi llena y casi vacía (si se implementan) pueden ser constantes específicas de la aplicación o programables. [ 3 ]

Uso

Las señales de estado FIFO se utilizan para notificar al productor y consumidor de datos externos que se han alcanzado umbrales críticos. Normalmente, el productor y el consumidor responden a estas notificaciones suspendiendo o reanudando la escritura y lectura de la FIFO, respectivamente. El productor o consumidor (o ambos) puede ser un procesador que consulta el estado o lo recibe mediante interrupciones, o bien puede ser una entidad puramente de hardware que utiliza las señales de estado para gestionar el control de flujo.

En muchas memorias FIFO, los indicadores de llenado y vacío se utilizan internamente para calificar las señales de habilitación de escritura y lectura . La escritura se inhibe cuando se activa el indicador de llenado : no se escriben datos en la memoria y el contador MAR de escritura no se incrementa. De manera similar, la lectura se inhibe cuando se activa el indicador de vacío : el contador MAR de lectura no se incrementa y, por lo general, se emiten los datos leídos previamente.

Sincronización de direcciones

En las FIFO que calculan el nivel del búfer mediante aritmética de punteros, las direcciones de lectura y escritura deben estar sincronizadas con un reloj común para garantizar entradas estables para el restador binario. Este requisito se cumple de forma inherente en las FIFO síncronas, ya que los puertos de lectura y escritura utilizan el mismo reloj. Sin embargo, las FIFO asíncronas utilizan relojes diferentes para los puertos de lectura y escritura, por lo que el nivel del búfer debe calcularse de forma independiente para cada puerto en su propio dominio de reloj. Esto requiere que la dirección actual de cada puerto esté sincronizada con el reloj del otro puerto, un proceso conocido como cruce de dominios de reloj .

El cruce de dominios de reloj se implementa típicamente pasando secuencialmente la dirección actual de un puerto a través de una serie de dos o más registros sincronizados por el reloj del otro puerto. El primer registro sincroniza la dirección con el reloj del otro puerto, y los registros subsiguientes mitigan cualquier metaestabilidad resultante .

Codificación de código Gray

Cuando se incrementa, una dirección binaria en muchos casos cambiará en varios bits al mismo tiempo (por ejemplo, de 0111 a 1000). [ 10 ] Si los bits que cambian se muestrean demasiado cerca del momento en que cambian (y por lo tanto violan el tiempo de configuración o retención del registro de muestreo), algunos pueden muestrearse en su estado anterior y otros en su nuevo estado, produciendo así una dirección no válida en el dominio del reloj de destino que no coincide ni con la dirección anterior ni con la nueva. [ 10 ] Cuando esto sucede, el nivel del búfer calculado en el otro dominio del reloj será incorrecto.

Para evitar tales errores, la dirección se envía al otro dominio de reloj como un valor de código Gray. [ 10 ] Dado que cada incremento de dirección cambia solo un bit del código Gray, se garantiza que la dirección recibida por el otro dominio de reloj coincidirá con la dirección anterior o la nueva si se muestrea cuando el bit está cambiando.

En algunas FIFOs esto se hace implementando el MAR como un contador de código Gray que genera directamente direcciones de código Gray, como se muestra a continuación:

Como alternativa, se puede utilizar un MAR con salidas codificadas en binario junto con un convertidor de binario a código Gray. Esto requiere que la salida del convertidor se sincronice antes de que cruce los dominios de reloj, para eliminar las interferencias del código Gray causadas por cambios de bits binarios en momentos diferentes.

Procesamiento de direcciones

Cada puerto envía su dirección MAR al otro puerto y recibe la dirección del otro puerto en código Gray a través de un sincronizador de dominio de reloj. Dentro de cada puerto, la dirección recibida se convierte a binario y se utiliza para generar las señales de nivel de búfer e indicador de estado en el dominio de reloj del puerto. En las FIFO que utilizan MAR en código Gray, esto se implementa típicamente como se muestra a continuación:

Latencia de estado

Cuando se incrementa un registro de dirección de memoria, el cambio no se detecta inmediatamente en el otro dominio de reloj. [ 10 ] Esto se debe a que, durante el proceso de cruce de dominios de reloj, la dirección debe pasar secuencialmente por una serie de registros de sincronización, lo que retrasa su llegada al otro dominio. Este retraso, a su vez, aumenta la latencia de estado, ya que la dirección se utiliza para calcular el estado de la FIFO. Más específicamente, durante este retraso, el nivel aparente de la FIFO en el otro dominio de reloj permanece sin cambios y, en consecuencia, sus indicadores de umbral también pueden estar desactualizados.

En determinadas condiciones, esta mayor latencia de estado puede dificultar el flujo eficiente de datos a través de una FIFO. [ 10 ] Por ejemplo, cuando el consumidor lee una palabra de una FIFO llena, el indicador de llenado del puerto de escritura no se niega inmediatamente. Esto obliga al productor a retrasar momentáneamente las nuevas escrituras en la FIFO cuando podría estar escribiendo de forma segura, lo que resulta en una penalización de rendimiento si hay datos pendientes del productor. De manera similar, el indicador de vacío del puerto de lectura no se niega inmediatamente cuando el productor escribe en una FIFO vacía, lo que provoca que el consumidor retrase la lectura cuando hay datos disponibles.

Rebosar

Se producirá un desbordamiento si el productor de datos (escritor) escribe en una FIFO cuya memoria está llena. [ 1 ] [ 4 ] Si se permite que dicha escritura proceda normalmente, la nueva palabra de datos sobrescribirá la palabra almacenada más antigua y, en el proceso, el puntero de escritura (valor de salida del MAR de escritura) superará al puntero de lectura, corrompiendo así el nivel de la FIFO y haciendo que parezca que la FIFO contiene solo una palabra. [ 8 ] Para evitar esto, las FIFOs suelen diseñarse para mantener el nivel correcto de la FIFO descartando la nueva palabra o la palabra almacenada más antigua. En cualquier caso, se suele emitir una señal de notificación para informar a los circuitos externos de que se han perdido datos.

Mitigación mediante el bloqueo

Ante un desbordamiento inminente, la nueva palabra de datos puede descartarse bloqueando las escrituras en la FIFO. [ 4 ] Esto se implementa típicamente habilitando la escritura de la FIFO con el indicador de saturación [ 8 ], como se muestra a continuación. En estas implementaciones, el indicador de saturación indica que el búfer no aceptará nuevos datos. Este circuito opera exclusivamente en el dominio del reloj del puerto de escritura y, por lo tanto, es adecuado tanto para FIFOs síncronas como asíncronas.

Mitigación mediante sobrescritura

Alternativamente, ante un desbordamiento inminente, la memoria puede reasignarse para la nueva palabra de datos eliminando la palabra almacenada más antigua y reutilizando su ubicación de memoria. [ 4 ] Esto se realiza escribiendo la nueva palabra como de costumbre (sobrescribiendo así la palabra almacenada más antigua) mientras se incrementa simultáneamente el MAR de lectura. Dado que ambos MAR se incrementan simultáneamente, el nivel aparente del búfer permanece sin cambios. Ambos MAR se incrementan mediante el reloj del puerto de escritura; por consiguiente, este proceso no es adecuado para FIFOs asíncronas, que requieren que el MAR de lectura se incremente en el dominio del reloj del puerto de lectura.

Aplicaciones

Coincidencia de la velocidad de datos

Las FIFO se utilizan frecuentemente para conectar a productores y consumidores de datos con diferentes velocidades de transmisión. [ 9 ] Una FIFO cumple esta función almacenando en búfer los datos producidos pero aún no consumidos, desacoplando así las velocidades de producción y consumo. Esto permite al productor escribir datos en la FIFO a medida que están disponibles y al consumidor leerlos solo cuando sea necesario, satisfaciendo así los requisitos de sincronización de ambos agentes y evitando la pérdida de datos. [ 9 ]

Las tasas de producción y consumo de datos pueden diferir por diversas razones, incluidos los casos en los que:

  • El productor o el consumidor (pero no ambos) transfiere datos en ráfagas [ 1 ].
  • El consumidor requiere datos con una sincronización precisa, cuya sincronización no puede ser garantizada por el productor [ 4 ].
  • El consumidor requiere que se recopilen datos hasta que haya suficientes disponibles para su procesamiento [ 4 ].

cruce de dominios del reloj

Muchos sistemas se componen de múltiples circuitos lógicos, cada uno operando en un dominio de reloj diferente, que deben comunicarse entre sí. [ 1 ] Para lograr esto, cada circuito debe intercambiar datos con un circuito que opera en un dominio de reloj diferente. Sin embargo, enviar datos directamente a otro dominio de reloj no es confiable, ya que podría provocar corrupción de datos debido a la metaestabilidad. [ 9 ] Este problema se evita al pasar los datos a través de una FIFO asíncrona, lo que elimina la metaestabilidad y, por lo tanto, garantiza la integridad de los datos transmitidos. [ 9 ]

Marcado de tiempo de entrada de datos

Algunos sistemas requieren conocer los tiempos de llegada de las palabras provenientes de un productor de datos. [ 4 ] Ejemplos comunes de esto incluyen el radar , el sonar y la adquisición de datos en sistemas de control . Normalmente, este conocimiento se adquiere registrando el tiempo de llegada de cada palabra de datos (asociándola con la hora actual), creando así un par ordenado formado por la palabra de datos y su tiempo de llegada.

En algunos casos, un procesador no puede registrar la hora con la precisión suficiente (por ejemplo, debido a factores como la latencia variable de las interrupciones [ 4 ] o a que los datos llegan más rápido de lo que se pueden procesar). En tales casos, se puede utilizar una FIFO para registrar con precisión la hora de los datos entrantes. Al llegar, cada palabra de datos se concatena con la hora actual y el resultado se escribe en la FIFO como una sola palabra compuesta. Cuando el procesador lee la palabra compuesta de la FIFO (en un momento posterior conveniente), puede dividirla fácilmente en su palabra de datos y marca de tiempo componentes.

Registro de datos previo al disparo

En algunas aplicaciones, una FIFO debe recopilar datos previos a un evento. [ 2 ] Por ejemplo, un osciloscopio digital se usa comúnmente para registrar las muestras de la señal analógica inmediatamente anteriores a una señal de disparo, lo que le permite mostrar la forma de onda de la señal que ocurrió antes del disparo.

Para facilitar este registro, la cola FIFO está diseñada para sobrescribir la muestra más antigua al desbordarse. Esto permite que, cuando la cola FIFO está llena, continúe aceptando nuevos datos y retenga automáticamente solo los más recientes hasta alcanzar su capacidad máxima.

Durante el funcionamiento, se inicia la grabación y la cola FIFO comienza a llenarse con las muestras entrantes. Si se permite grabar durante el tiempo suficiente, la cola FIFO se llenará y, con cada nueva muestra entrante, se descartará la muestra registrada más antigua para dejar espacio a la nueva. Cuando se produce el disparo, la grabación se detiene y las muestras registradas pueden leerse desde la cola FIFO. Los desbordamientos se ignoran, ya que cualquier dato perdido (sobrescrito) anterior a los datos registrados es irrelevante.

Notas

  1. El productor y el consumidor de datos deben operar a la misma tasa de datos promedio para evitar un eventual desbordamiento o subdesbordamiento de FIFO. [ 1 ]
  2. Algunas FIFOs más antiguas no tienen reloj. Estas son menos comunes y no son el tema central de este artículo. [ 1 ]

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 Balch, Mike. Diseño digital completo / Una guía integral de electrónica digital y arquitectura de sistemas informáticos . McGraw-Hill Inc. ISBN 0-07-143347-3.
  2. 1 2 3 "Arquitectura, funciones y aplicaciones FIFO" (PDF) . Texas Instruments . Consultado el 25 de marzo de 2026 .
  3. 1 2 3 4 5 "FIFO de hardware administrado, funciones típicas del circuito FIFO" . RealDigital . Consultado el 13 de marzo de 2026 .
  4. 1 2 3 4 5 6 7 8 Ganssle, Jack. "Lo que entra debe salir" . Embedded Systems Programming . Recuperado el 25 de marzo de 2026 .
  5. Herbert, Tom. "FIFOs de hardware: edición de colas de dispositivos" . Medium . Consultado el 25 de marzo de 2026 .
  6. 1 2 3 4 "FIFO síncrono" . ChipVerify . Consultado el 9 de abril de 2026 .
  7. Guía del usuario del generador FIFO IP LogiCORE (edición V9.1 ). Xilinx Inc. 24 de abril de 2012. 
  8. 1 2 3 4 5 6 7 Cummings, Clifford E. "Técnicas de simulación y síntesis para el diseño de FIFO asíncrono" (PDF) . Sunburst Design, Inc. Recuperado el 25 de marzo de 2026 .
  9. 1 2 3 4 5 "Diseño e implementación de FIFO / Tutorial de SystemVerilog" . AICLAB . Consultado el 25 de marzo de 2026 .
  10. 1 2 3 4 5 6 7 Campos, Nelson. "FIFOs síncronas y asíncronas en hardware" . Recuperado el 25 de marzo de 2026 .
  11. 1 2 3 4 Nebhrajani, Vijay. "Arquitecturas FIFO asíncronas" (PDF) . Recuperado el 25 de marzo de 2026 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=FIFO_(electronic)&oldid=1363182159 "