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

0

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 generalmente solo obtenemos un paquete único y 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 32 sumas de muestra. El problema que encontré con esto fue que después de recibir las 256 banderas de entrada válidas, todavía tenía 32 muestras atascadas en mi registro de turnos y no había banderas extra válidas para cambiarlas.

La siguiente idea que tuve fue usar un FIFO. La línea de habilitación de lectura FIFO se controlaría mediante un indicador que indica que la respuesta de la suma está "lista" y que la entrada FIFO no está vacía.

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

    
pregunta user2913869

2 respuestas

0

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 implementa 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, el hecho de que llame a un FIFO o un registro de desplazamiento solo depende de la manipulación de los punteros de entrada y salida. Así que esto sería parte del esquema de ruta de datos.

Pasando al esquema de control, tiene una descripción del comportamiento deseado en el extremo de la cola, pero no mucho en el extremo delantero. Así que voy a ignorar el extremo delantero. Desea comenzar a procesar y generar una palabra cuando hay 32 palabras, por lo que es natural tener un contador para contar el número 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 de la cola, simplemente significa dejar que el contador vuelva a cero antes de detenerse.

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

    
respondido por el rioraxe
0

Un registro de desplazamiento hace que la sincronización de salida se bloquee en la sincronizació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 tubería de longitud fija, como se ha señalado. Un FIFO funciona como una tubería de longitud variable, permitiendo que la temporización de salida se desacople de la temporización de entrada.

Los FIFO son muy utilizados, y todos los proveedores de FPGA tienen herramientas que facilitan la configuración de los FIFO sincrónicos y asíncronos, utilizando LUT RAM o bloque RAM, dependiendo del tamaño, etc.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas