Red de conocimientos sobre prescripción popular - Colección de remedios caseros - ¿Qué es una cola de caché FIFO? FIFO es la abreviatura de First In First Out en inglés y es un buffer de datos de primero en entrar, primero en salir. La diferencia entre FIFO y la memoria normal es que no hay una línea de dirección externa para lectura y escritura, y es muy simple de usar. Pero la desventaja es que los datos solo se pueden escribir secuencialmente y la dirección de datos se agrega automáticamente con 1 mediante el puntero interno de lectura y escritura. A diferencia de la memoria normal, no puede leer ni escribir direcciones específicas a través de líneas de dirección. FIFO se usa generalmente para la transmisión de datos entre diferentes dominios de reloj, como la adquisición de datos AD en un extremo y el bus PCI de la computadora en el otro extremo. Suponiendo que la tasa de adquisición de AD es de 16 bits 100 K SPS, la cantidad de datos por segundo es 100 k × 16 bits = 1,6 Mbps y la velocidad del bus PCI es de 33 MHz Mbps. El ancho del bus es de 32 bits y la velocidad de transferencia máxima es de 1056Mbps. FIFO se puede utilizar como búfer de datos entre dos dominios de reloj diferentes. Además, FIFO también se puede utilizar para interfaces de datos de diferentes anchos, como la salida de datos de 8 bits de microcontroladores y la entrada de datos de 16 bits de DSP. Cuando el microcontrolador está conectado al DSP, se puede utilizar FIFO para lograr la coincidencia de datos. 3. Algunos parámetros importantes de FIFO: El ancho, que se ve a menudo en materiales en inglés, es solo un bit de datos para operaciones de lectura y escritura FIFO, al igual que MCU tiene 8 y 16 bits, ARM de 32 bits, etc. En los circuitos integrados monolíticos, el ancho del FIFO es fijo y seleccionable. Si se implementa un FIFO utilizando FPGA, usted mismo puede definir sus bits de datos, es decir, su ancho. Profundidad de FIFO: la profundidad se refiere a la cantidad de datos de N bits que se pueden almacenar en el FIFO (si el ancho es N). Por ejemplo, la profundidad de un FIFO de 8 bits es 8, que puede almacenar 8 ^ 8 datos de 8 bits. La profundidad es 12, que puede almacenar 12 datos de 8 bits. La profundidad del FIFO puede ser grande o pequeña. Personalmente, creo que no existe una fórmula fija para calcular la profundidad FIFO. En el trabajo real de FIFO, su indicador de datos llenos/vacíos puede controlar la escritura o lectura continua de datos. En aplicaciones específicas, también es imposible calcular la profundidad FIFO requerida exacta a través de ciertos parámetros. Esto es factible en un estado ideal donde la velocidad de escritura es mayor que la velocidad de lectura, pero la profundidad FIFO real utilizada suele ser mayor que el valor calculado. . En términos generales, basándose en las condiciones específicas del circuito y teniendo en cuenta el rendimiento del sistema y el coste FIFO, es suficiente estimar un ancho y una profundidad aproximados. Para aplicaciones donde la velocidad de escritura es más lenta que la velocidad de lectura, la profundidad del FIFO debe determinarse en función de los requisitos específicos de la estructura de datos de lectura y los datos de lectura. Indicador completo: cuando el FIFO está lleno o a punto de estarlo, el circuito de estado FIFO envía una señal para evitar que la operación de escritura FIFO continúe escribiendo datos en el FIFO y provoque un desbordamiento. Bandera vacía: cuando el FIFO está vacío o a punto de estar vacío, el circuito de estado FIFO envía una señal para evitar que el FIFO lea datos del FIFO, lo que provoca un desbordamiento insuficiente de datos no válidos. Leer reloj: el reloj después de la operación de lectura, los datos se leen temporalmente en cada flanco del reloj. Reloj de escritura: el reloj que siguen las operaciones de escritura, los datos se escriben temporalmente en cada flanco del reloj. Puntero de lectura: apunta a la siguiente dirección de lectura. Agrega 1 automáticamente después de leer. Puntero de escritura: apunta a la siguiente dirección que se escribirá y se incrementa automáticamente en 1 después de escribir. El puntero de lectura y escritura es en realidad la dirección de lectura y escritura, pero esta dirección no se puede seleccionar arbitrariamente, sino que es continua. 4. La clasificación de FIFO se puede dividir en FIFO síncrono y FIFO asíncrono según el dominio del reloj en el que funciona. FIFO síncrono significa que el reloj de lectura y el reloj de escritura son el mismo reloj. Cuando llega el flanco del reloj, las operaciones de lectura y escritura se producen simultáneamente. FIFO asincrónico significa que el reloj de lectura y el reloj de escritura son inconsistentes e independientes entre sí. 5. La dificultad en el diseño FIFO es cómo juzgar el estado vacío/lleno de FIFO. Para garantizar que los datos se puedan escribir o leer correctamente sin generar beneficios o lecturas vacías, es necesario garantizar que el FIFO no se pueda escribir incluso si está lleno. No se puede leer en estado vacío. Cómo determinar si el FIFO está lleno o vacío se ha convertido en una cuestión central en el diseño del FIFO. Dado que los FIFO síncronos rara vez se utilizan, aquí solo se describe el problema de la generación de indicadores vacíos/llenos para los FIFO asíncronos. Suplemento: en el diseño de flip-flops, es inevitable encontrar el problema de la metaestabilidad (la metaestabilidad no se presenta aquí, puede consultar la información relevante). En los circuitos que involucran flip-flops, la metaestabilidad no se puede eliminar por completo, por lo que solo podemos encontrar formas de minimizar la probabilidad de que ocurra. Una forma es utilizar el código Gray.

¿Qué es una cola de caché FIFO? FIFO es la abreviatura de First In First Out en inglés y es un buffer de datos de primero en entrar, primero en salir. La diferencia entre FIFO y la memoria normal es que no hay una línea de dirección externa para lectura y escritura, y es muy simple de usar. Pero la desventaja es que los datos solo se pueden escribir secuencialmente y la dirección de datos se agrega automáticamente con 1 mediante el puntero interno de lectura y escritura. A diferencia de la memoria normal, no puede leer ni escribir direcciones específicas a través de líneas de dirección. FIFO se usa generalmente para la transmisión de datos entre diferentes dominios de reloj, como la adquisición de datos AD en un extremo y el bus PCI de la computadora en el otro extremo. Suponiendo que la tasa de adquisición de AD es de 16 bits 100 K SPS, la cantidad de datos por segundo es 100 k × 16 bits = 1,6 Mbps y la velocidad del bus PCI es de 33 MHz Mbps. El ancho del bus es de 32 bits y la velocidad de transferencia máxima es de 1056Mbps. FIFO se puede utilizar como búfer de datos entre dos dominios de reloj diferentes. Además, FIFO también se puede utilizar para interfaces de datos de diferentes anchos, como la salida de datos de 8 bits de microcontroladores y la entrada de datos de 16 bits de DSP. Cuando el microcontrolador está conectado al DSP, se puede utilizar FIFO para lograr la coincidencia de datos. 3. Algunos parámetros importantes de FIFO: El ancho, que se ve a menudo en materiales en inglés, es solo un bit de datos para operaciones de lectura y escritura FIFO, al igual que MCU tiene 8 y 16 bits, ARM de 32 bits, etc. En los circuitos integrados monolíticos, el ancho del FIFO es fijo y seleccionable. Si se implementa un FIFO utilizando FPGA, usted mismo puede definir sus bits de datos, es decir, su ancho. Profundidad de FIFO: la profundidad se refiere a la cantidad de datos de N bits que se pueden almacenar en el FIFO (si el ancho es N). Por ejemplo, la profundidad de un FIFO de 8 bits es 8, que puede almacenar 8 ^ 8 datos de 8 bits. La profundidad es 12, que puede almacenar 12 datos de 8 bits. La profundidad del FIFO puede ser grande o pequeña. Personalmente, creo que no existe una fórmula fija para calcular la profundidad FIFO. En el trabajo real de FIFO, su indicador de datos llenos/vacíos puede controlar la escritura o lectura continua de datos. En aplicaciones específicas, también es imposible calcular la profundidad FIFO requerida exacta a través de ciertos parámetros. Esto es factible en un estado ideal donde la velocidad de escritura es mayor que la velocidad de lectura, pero la profundidad FIFO real utilizada suele ser mayor que el valor calculado. . En términos generales, basándose en las condiciones específicas del circuito y teniendo en cuenta el rendimiento del sistema y el coste FIFO, es suficiente estimar un ancho y una profundidad aproximados. Para aplicaciones donde la velocidad de escritura es más lenta que la velocidad de lectura, la profundidad del FIFO debe determinarse en función de los requisitos específicos de la estructura de datos de lectura y los datos de lectura. Indicador completo: cuando el FIFO está lleno o a punto de estarlo, el circuito de estado FIFO envía una señal para evitar que la operación de escritura FIFO continúe escribiendo datos en el FIFO y provoque un desbordamiento. Bandera vacía: cuando el FIFO está vacío o a punto de estar vacío, el circuito de estado FIFO envía una señal para evitar que el FIFO lea datos del FIFO, lo que provoca un desbordamiento insuficiente de datos no válidos. Leer reloj: el reloj después de la operación de lectura, los datos se leen temporalmente en cada flanco del reloj. Reloj de escritura: el reloj que siguen las operaciones de escritura, los datos se escriben temporalmente en cada flanco del reloj. Puntero de lectura: apunta a la siguiente dirección de lectura. Agrega 1 automáticamente después de leer. Puntero de escritura: apunta a la siguiente dirección que se escribirá y se incrementa automáticamente en 1 después de escribir. El puntero de lectura y escritura es en realidad la dirección de lectura y escritura, pero esta dirección no se puede seleccionar arbitrariamente, sino que es continua. 4. La clasificación de FIFO se puede dividir en FIFO síncrono y FIFO asíncrono según el dominio del reloj en el que funciona. FIFO síncrono significa que el reloj de lectura y el reloj de escritura son el mismo reloj. Cuando llega el flanco del reloj, las operaciones de lectura y escritura se producen simultáneamente. FIFO asincrónico significa que el reloj de lectura y el reloj de escritura son inconsistentes e independientes entre sí. 5. La dificultad en el diseño FIFO es cómo juzgar el estado vacío/lleno de FIFO. Para garantizar que los datos se puedan escribir o leer correctamente sin generar beneficios o lecturas vacías, es necesario garantizar que el FIFO no se pueda escribir incluso si está lleno. No se puede leer en estado vacío. Cómo determinar si el FIFO está lleno o vacío se ha convertido en una cuestión central en el diseño del FIFO. Dado que los FIFO síncronos rara vez se utilizan, aquí solo se describe el problema de la generación de indicadores vacíos/llenos para los FIFO asíncronos. Suplemento: en el diseño de flip-flops, es inevitable encontrar el problema de la metaestabilidad (la metaestabilidad no se presenta aquí, puede consultar la información relevante). En los circuitos que involucran flip-flops, la metaestabilidad no se puede eliminar por completo, por lo que solo podemos encontrar formas de minimizar la probabilidad de que ocurra. Una forma es utilizar el código Gray.

El código Gray solo cambia un bit entre dos símbolos adyacentes (en muchos casos, muchos símbolos cambian simultáneamente en códigos binarios). Esto evitará la metaestabilidad cuando el contador esté sincronizado con el reloj. Sin embargo, una desventaja del código Gray es que solo puede definir la profundidad de 2 n y no puede definir la profundidad de FIFO arbitrariamente como el código binario, porque el código Gray debe recorrer 2 n; de lo contrario, no puede garantizar la condición de que dos símbolos adyacentes difieren en un bit. Por lo tanto, no es un código de trueno real. El segundo es usar flip-flops redundantes. Suponiendo que la probabilidad metaestable de un flip-flop es p, entonces la probabilidad metaestable de dos flip-flops paralelos es p al cuadrado, pero esta vez el retraso aumenta. La aparición de metaestabilidad provocará errores FIFO y el puntero de dirección muestreado por el reloj de lectura/escritura será diferente del valor real, lo que dará como resultado una dirección de escritura o lectura incorrecta. Debido a la latencia, el indicador vacío/lleno no aparece necesariamente cuando el FIFO está realmente vacío/lleno. Quizás la bandera vacío/lleno aparezca antes del FIFO vacío/lleno. Esto está bien siempre y cuando el FIFO no se desborde ni se desborde por defecto. Muchos artículos sobre FIFO en realidad analizan diferentes algoritmos para indicadores vacíos/llenos. En el artículo de Vijay A. Nebhrajani "Estructura FIFO asincrónica", el autor propuso dos algoritmos para el indicador FIFO vacío/lleno. El primer algoritmo: construya un FIFO con un ancho de puntero de N + 1 y una profundidad de 2 n bytes (para facilitar la conversión de punteros de código Gray en punteros binarios). Cuando los bits más significativos en el código binario del puntero son inconsistentes y los otros n bits son iguales, el FIFO está lleno (en el artículo de Clifford E. Cummings, los dos primeros bits son inconsistentes y los dos últimos LSB están llenos, lo cual es diferente de el MSB representado por el binario, y los demás están llenos). Cuando los punteros son exactamente iguales, el FIFO está vacío. Puede que esto no sea fácil de ver. Tomemos un ejemplo para ilustrar cómo funciona un FIFO de 8 bytes de profundidad (utilizando un puntero convertido a binario). FIFO_WIDTH = 8, complementado con FIFO_profundidad = 2 n = 8, N = 3, el ancho del puntero es N + 1 = 4. Al principio, tanto rd_ptr_bin como wr_ptr_bin son "0000". En este momento, se escriben 8 bytes de datos en FIFO. wr_ptr_bin="1000", rd_ptr_bin="0000". Por supuesto, esta es una condición suficiente. Ahora supongamos que la operación de lectura se ejecuta 8 veces, de modo que rd_ptr_bin = "1000", que es una condición vacía. Las otras 8 escrituras harían que wr_ptr_bin fuera igual a "0000", pero rd_ptr_bin seguiría siendo igual a "1000", por lo que el FIFO está lleno. Obviamente, el puntero de inicio no tiene por qué ser "0000". Suponiendo que es "0100" y el FIFO está vacío, entonces 8 bytes harán que WR_PTR_bin = "1100" y rd_ptr_bin siga siendo "0100". Esto nuevamente significa que el FIFO está lleno. Si los dos msbs superiores del puntero de escritura son mayores que los dos msbs superiores del puntero de lectura, el FIFO está casi vacío. En el artículo de la tercera parte de "Estructura FIFO asincrónica" de Vijay A. Nebhrajani, también se menciona un método, es decir, símbolos de dirección y umbrales. El 75% de la capacidad FIFO se establece como límite superior y el 25% de la capacidad FIFO se establece como límite inferior. Cuando el símbolo de dirección excede un umbral, se genera un símbolo lleno/vacío, similar al estilo n.° 2 mencionado en el artículo de Clifford E. Cummings. Todos ellos son juicios conservadores y vacíos. De hecho, el FIFO que genera la bandera vacía en este momento no está necesariamente vacío/lleno. Dicho esto, hemos visto claramente que la clave del diseño FIFO es que diferentes algoritmos de generación de banderas vacías/llenas producen diferentes FIFO.