FIFO asíncrono para escritura rápida y lectura lenta

No estoy muy seguro de cómo generar una señal completa en un FIFO con escritura rápida y lectura lenta. Por ejemplo, si f_wr=10*f_rd, cuando el puntero de escritura actualizado se sincroniza con el lado de lectura usando metodologías simples para la sincronización del dominio de reloj rápido al dominio de reloj lento (por ejemplo, al extender la vida útil de los datos en el dominio de reloj rápido), varios los datos podrían haber sido escritos en el FIFO. En tales casos, la señal completa no está actualizada y puede hacer que se sobrescriban los datos en FIFO. ¿Qué tipo de procesamiento especial se debe tomar aquí?

Como traté de generar una IP FIFO en Xilinx ISE, no hay opción para ingresar los parámetros de los relojes si elijo no usar FIFO integrado, es decir, no sabe de qué lado (escritura/lectura) va más rápido. ¿Cómo hace la IP dicha sincronización correctamente?

Respuestas (1)

Si las tasas de datos de entrada y salida promedio son fijas y diferentes, eventualmente se desbordará o se desbordará un FIFO. No hay 'procesamiento' que pueda usar para evitar corromper los datos.

Lo que hace un FIFO es actuar como un búfer flexible para absorber variaciones temporales en la tasa de llegada y consumo de datos. El FIFO tiene que ser lo suficientemente profundo (¿largo?) para que pueda almacenar todos los datos en exceso, y un poco más para el margen.

Si sus tasas de entrada y/o salida no están fijadas externamente, entonces puede usar FIFO para controlar una u otra. Un FIFO tendrá indicadores llenos y vacíos, y los de Xilinx también tienen indicadores programables de "casi lleno" y "casi vacío". Estos se pueden realimentar a su fuente de datos y/o sumidero para indicarles que esperen. Cuanto más profundo sea el FIFO, más tiempo podrá permitir que persista una diferencia en la tasa de entrada/salida antes de tener que acelerar la conexión más rápida.

Gracias por la respuesta. Entiendo que con diferentes velocidades de lectura/escritura, el receptor del remitente debe hacer una pausa cuando el FIFO está lleno/vacío, lo cual es similar al control de flujo en las redes.
(Lo siento, tuve que dividir el comentario en dos debido a la limitación del número de caracteres). Mi pregunta sobre el núcleo FIFO de Xilinx es sobre la generación de señales llenas/vacías. Creo que la sincronización de wr_ptr y rd_ptr debería usar diferentes enfoques cuando f_wr y f_rd son diferentes (dominio de rápido a lento y dominio de lento a rápido), y dicha información no se requiere en el generador Xilinx FIFO (es decir, no (No sé cuál es rápido y qué tan rápido es), ¿cómo puede FIFO sincronizar wr_ptr/rd_ptr con el otro dominio de reloj y generar lleno/vacío correctamente?
La información no se requiere en el generador de Xilinx porque no es relevante. No necesita saber qué lado es rápido o lento, más que nada, porque no hay un lado rápido y otro lento. Cada lado opera en el mismo promedio. Cualquiera de los lados puede trabajar más rápido que el otro por períodos cortos. El objetivo de un FIFO es que desacopla el tiempo entre los dos lados. Solo necesita sincronización y temporización local, es decir, de 'este lado' para sus accesos, mientras ignora totalmente el otro lado. Las banderas completamente vacías simplemente salen con el tiempo local, correctamente, no importa lo que haga el otro lado