Xilinx IP para retrasar datos

Estoy trabajando en un diseño de bloques para calcular la coordenada en el conjunto complejo representado por un píxel. Dado un valor de píxel x e y, el tamaño del paso, y comenzando x y comenzando y, necesito calcular una coordenada en el plano complejo. Por ejemplox' = start_x + step * x

Dado que x es un número entero, primero lo paso a través de un módulo de conversión de coma flotante y luego a través de una suma de multiplicación fusionada de coma flotante. Esto tiene una latencia total de 24 ciclos. El problema es que también necesito proporcionar una dirección de memoria al principio y sacarla 24 ciclos más tarde antes de pasarla al módulo que obtiene x' y' y la dirección. Estoy buscando una IP que pueda ayudar con esto. Lo más parecido que he encontrado es un registro de desplazamiento, pero necesitaría 24 de ellos. Estaba pensando en tal vez usar un FIFO. ¿Hay algo que simplemente actúe como un retraso de latencia para los datos mientras se realizan otros cálculos?

ingrese la descripción de la imagen aquí

PD: No estoy seguro de por qué llamé a mi Fused-Mul-Add fmax

¿Cuál es el rendimiento de la conversión de punto flotante y la suma de multiplicación fusionada? Si se trata de 1 cálculo por ciclo, probablemente necesite un registro de desplazamiento para retrasar la dirección. Si es menos (como uno cada 24 ciclos), entonces probablemente solo necesite almacenar la dirección en un registro y codificar sus operaciones de punto flotante con un indicador "hecho" para indicar cuándo se debe recuperar la dirección (y tal vez la próxima dirección cambiada ¿en?)
Es 1 por ciclo.
Lo estoy haciendo de esta manera porque quiero pasar los datos a mi módulo de cálculo de Mandelbrot que está canalizado y necesito esto para alimentarlo lo suficientemente rápido.
Entonces parece que necesitas un registro de desplazamiento. Sin embargo, tal vez haya una manera eficiente de implementarlo en un BRAM o algo así.
(O busque el truco de usar LUT RAM como registros de desplazamiento. IIRC puede obtener un registro de desplazamiento en serie de 32 bits en una sola LUT.
Pero el problema es que quería algo que pudiera pegar en el diagrama de bloques.
Puede poner el código en un módulo en el contenedor de diseños de bloques, simplemente haga que los puertos axi sean externos
Si está eligiendo sus componentes de diseño basándose en si puede o no pegar el componente en su diagrama de bloques, sospecho que eventualmente encontrará que esta filosofía de diseño no es práctica.

Respuestas (2)

Solo escribe uno. Son solo unas pocas líneas de VHDL. La profundidad puede ser natural genérica y puede tomar su ancho de los puertos. Sintetice de forma independiente y verifique que ISE/Vivado use el modo de registro de desplazamiento esperado en las LUT.

Si no puede envolverlo fácilmente como un bloque, eso pone en duda la utilidad del enfoque del diagrama de bloques completo. La mayoría de estas cosas se remontan a la herramienta "Renoir" de Mentor Graphics, en la que era fácil envolver VHDL como un bloque.

Parece que necesita un registro de desplazamiento.

Afortunadamente, los registros de desplazamiento se pueden implementar de manera bastante eficiente en los FPGA de Xilinx.

De la documentación de Kintex-7.

Un generador de funciones SLICEM también se puede configurar como un registro de desplazamiento de 32 bits sin usar los flip-flops disponibles en un segmento. Utilizado de esta manera, cada LUT puede retrasar los datos en serie de 1 a 32 ciclos de reloj.

Por lo tanto, se podría implementar un retraso de 24 ciclos para una dirección de 24 bits en solo 6 CLB (porque hay 4 LUT en cada SLICEM CLB). Los dispositivos Spartan también deberían tener capacidades similares.

En familias más antiguas, SRLera la macro utilizada para instanciar esta funcionalidad. No estoy seguro de si eso sigue siendo cierto para los productos actuales (generación Artix/Kintex/Virtex-7 o Spartan-6).

El problema es que, por lo que puedo decir, los registros de cambio de flujo axi solo demoran 1 ciclo. Podría agregar 24 de ellos, pero esto es un fastidio. ¿Hay alguna forma de tener un registro de desplazamiento con un retraso de 24?
No tengo idea de qué es axi stream o cómo se relaciona con los dispositivos Xilinx o la IP de Xilinx, así que no puedo ayudarlo con eso.
Parece que puedo usar el registro de desplazamiento basado en RAM para mis propósitos, así que gracias.
AXI Stream es una interfaz de ARM. Tiene FIFO como señales de control.
@Paebbels, en ese caso, no tengo claro por qué OP solo puede usar registros de desplazamiento Axi-Stream en su diseño.
No he usado el diseñador esquemático en los productos Xilinx desde ISE 9.x, pero los nuevos núcleos IP están hechos para el diseño de arrastrar y soltar. Cada núcleo tiene una interfaz AXI para cada entrada/salida. Principalmente es flujo AXI para que las operaciones se puedan canalizar. Supongo que hay un núcleo de retraso para ajustar los retrasos en el diseño esquemático.
Sí, pero en algunos casos puede ignorar la señal de la banda de rodadura, especialmente si un diseño de transmisión se sigue con un fifo