Un FIFO es una memoria de Primero en entrar, primero en salir . Puede pensar que los datos se desplazan en un extremo y se desplazan por el otro, y se permite que la cantidad de datos en el FIFO crezca hasta un límite máximo.
Sin embargo, el hecho de cambiar datos en la memoria es costoso en hardware. Una mejor manera es usar una memoria más normalmente, pero hacer que se vea como un búfer circular mediante la manipulación de la siguiente dirección para escribir y leer. Estas direcciones viven en registros separados y, a menudo, se denominan indicador de lectura y indicador de escritura .
Aquí hay una ilustración del estado de un FIFO simple usando una memoria de 8 palabras:
La siguiente palabra entrante se escribirá en la palabra vacía en la dirección 1 (el valor del puntero de escritura), luego el puntero de escritura se incrementará a 2. La siguiente solicitud de lectura buscará la palabra en 5 (el valor de la lectura). puntero), entonces el puntero de lectura se incrementa en 1. En este ejemplo, las direcciones son automáticamente circulares si los punteros tienen 3 bits de ancho. Al agregar de 1 a 7 se obtiene 0 en matemáticas sin firmar de 3 bits.
Los sistemas FIFO completos necesitan formas de identificar las condiciones completas y vacías. Hay varios esquemas para esto. Se podría usar un registro separado para realizar un seguimiento de cuántas palabras hay en la FIFO, que es 4 en la instantánea que se muestra arriba.
Un esquema útil para una implementación de firmware es comparar los punteros de lectura y escritura. Podría, por ejemplo, decidir que ambos punteros iguales están FIFO vacíos, y escribir uno detrás de lectura (después del ajuste) está FIFO lleno. Tenga en cuenta que dichos esquemas dejarán sin uso una palabra del FIFO. Usted termina gastando una parte del estado en algún lugar para permitir la detección de contenido completo y vacío, ya sea un registro separado o una palabra inutilizable en el FIFO. La ventaja de este esquema es que las lecturas y escrituras pueden ocurrir independientemente sin conflicto, por lo que tal FIFO no necesita una exclusión mutua entre la lectura y la escritura. Por ejemplo, no tiene que deshabilitar las interrupciones al leer porque no se hace ningún daño si una rutina de interrupción inserta una palabra en el FIFO mientras el código en primer plano está intentando leer.