Guía de diseño de FPGA/VHDL: entradas intermitentes

Tengo un algoritmo:

y[n] = x[n] * sum(x[0:31])

x está en el flujo de entrada, y es el flujo de salida, ambos una muestra por ciclo de reloj. Una condición es que la entrada no sea contigua, hay un indicador válido que indica que cuando la entrada es válida. El paquete completo está contenido en x[0:255] y, por lo general, solo obtenemos un único paquete poco frecuente. Estoy tratando de averiguar cuáles son las estructuras lógicas correctas para implementar esto sin problemas.

Primero, pensé que solo usaría un registro de desplazamiento en la entrada, cambiando en la entrada válida. De esa manera puedo "detener" el flujo de entrada hasta que tenga una suma de 32 muestras. El problema que encontré con esto fue que después de recibir las 256 banderas válidas de entrada, todavía tenía 32 muestras atascadas en mi registro de desplazamiento y no entraban banderas válidas adicionales para cambiarlas.

La siguiente idea que tuve fue usar un FIFO. La línea de habilitación de lectura FIFO estaría controlada por una bandera que indica que la respuesta de suma está "lista" y que la entrada FIFO no está vacía.

¿Estoy pensando demasiado en esto? ¿Hay una solución simple para esto?

Un FIFO parece ser una buena solución para este caso. Pero también la solución SR está bien. No necesita la señal de entrada válida para seguir llegando si su lógica interna reconoce las señales válidas pasadas y opera con los datos.

Respuestas (2)

Parece que desea procesar cuando hay una tubería fija (32) de elementos disponibles, por lo que un registro de desplazamiento debería funcionar bien, y esa sería la forma más sencilla si se implementara en celdas lógicas. Pero 32 palabras pueden ser muchas celdas, por lo que es posible que desee implementar ese almacenamiento en la memoria. En ese caso, si lo llama FIFO o registro de desplazamiento solo depende de la manipulación de los punteros de entrada y salida. Entonces esto sería parte del esquema de ruta de datos.

Pasando al esquema de control, tiene alguna descripción del comportamiento deseado en la parte final, pero no mucho en la parte delantera. Así que voy a ignorar la parte delantera. Desea comenzar a procesar y generar una palabra cuando hay 32 palabras, por lo que es natural tener un contador para contar la cantidad de palabras almacenadas en la ruta de datos (FIFO o registro de desplazamiento). Cuando el contador llega a 32, la salida comienza y el contador se mantiene en 32. Entonces, para el final, simplemente significa dejar que el contador vuelva a cero antes de detenerse.

Una forma bastante obvia de sumar los elementos es agregarlos tal como vienen en una palabra a la vez. Cuando el conteo llegue a 32 y se mantenga en 32, agregue el nuevo mientras resta el anterior que se derrama en el otro extremo (supongo que así es como quiere que funcione).

Un registro de desplazamiento obliga a que la temporización de salida se bloquee con la temporización de entrada. Las brechas en los datos de entrada válidos también impondrán brechas en la salida, dejando los datos atascados en la canalización de longitud fija como ha notado. Un FIFO funciona como una tubería de longitud variable, lo que permite desacoplar el tiempo de salida del tiempo de entrada.

Los FIFO se usan con mucha frecuencia, y todos los proveedores de FPGA tienen herramientas que facilitan la configuración de FIFO tanto síncronos como asíncronos, utilizando LUT RAM o RAM de bloque, según el tamaño, etc.