estrategia de doble buffer de FPGA

1

Estoy trabajando en un proyecto FPGA donde una CPU host escribe una tabla de consulta de 10,240 x 16 bits en la lógica FPGA. Para implementar esto, he utilizado memoria en chip para almacenar los valores y leerlos cuando esté listo.

Un pulso de activación / activación externo inicia un ciclo de procesamiento que dura varios cientos de miles de ciclos de reloj. Una vez que obtengamos este desencadenante, el estado de la LUT de 10,240x16 debe ser congelado o enganchado, para que pueda utilizarse durante el ciclo de procesamiento. Desafortunadamente, los datos deben estar disponibles bastante pronto después de este pulso "IR", por lo que no hay tiempo suficiente para hacer una copia completa del búfer.

El host también debe poder actualizar continuamente algunos valores de la tabla de consulta mientras se ejecuta el ciclo actual, para poder configurar el siguiente ciclo de procesamiento. Para permitir ambos casos (enclavar el estado de la tabla de búsqueda, pero también dejar que el host lo actualice cada vez), creo que el estilo de ping / pong de doble búfer es el camino a seguir: el host escribe en un búfer hasta que lleguemos a "GO" comando, entonces el host escribe al otro. La lógica FPGA siempre lee el búfer que no se está escribiendo.

Sin embargo, dado que el host no está reescribiendo todos los valores 10,240x16 cuando realiza sus actualizaciones esporádicas, el búfer que no se está escribiendo está esencialmente "eliminando" las actualizaciones mientras está congelado.

¿Hay una forma novedosa de manejar este escenario? Estoy pensando que debe haber algún tipo de proceso de resincronización del búfer una vez que el búfer está descongelado.

    
pregunta user2913869

2 respuestas

1

Una posible estrategia podría ser utilizar bits obsoletos. No sé si eso es terminología estándar, pero es similar a un poco sucio. Al escribir una nueva entrada, se borrará el bit obsoleto correspondiente en el búfer desbloqueado y se establecerá el bit en el búfer bloqueado. Después de cambiar los búferes, haga que una rutina de copia interna transfiera cada entrada marcada como obsoleta en el búfer desbloqueado del búfer bloqueado al búfer desbloqueado. De esta manera, los nuevos datos escritos mientras la copia está en progreso no se sobrescribirán, y todas las actualizaciones antiguas deben conservarse. Lo único que debe hacer es asegurarse de que haya suficiente tiempo para que la operación de copia se complete entre los conmutadores del búfer, o necesita algún tipo de optimización para realizar un seguimiento de qué entradas están obsoletas para que no tenga que repetir todo el proceso. ellos, haciendo la operación de copia más rápida.

Otra posible estrategia podría ser almacenar las entradas actualizadas mientras un solo búfer está bloqueado, luego aplicar solo esas actualizaciones cuando está desbloqueado. Si solo se actualizan unas pocas entradas, esto podría ser más eficiente. Las actualizaciones podrían almacenarse como una lista vinculada o una estructura de datos similar para que la lista se pueda recorrer de manera eficiente, mientras que se pueden fusionar múltiples actualizaciones en la misma ubicación.

    
respondido por el alex.forencich
0

A menos que haya razones de poder para no hacer esto, me gustaría ir por esto:

  • Tiene dos buffers de 10240 * 16 bits
  • Rellene uno de ellos utilizando la CPU, llame a esto el "configurar" búfer
  • En el Go Pulse, copie el búfer de "configuración" en el búfer de "procesamiento", no hay razón para que esto no se pueda hacer en un ciclo de reloj (excepto por los posibles problemas de alimentación mencionados anteriormente). Si puede enviar su pulso GO un ciclo antes de que se inicie realmente el procesamiento de los datos, incluso puede evitar movimientos extra donde se utiliza el búfer de configuración para el primer ciclo del procesamiento de datos. Esto también permitiría la actualización y el procesamiento en forma inversa (aunque probablemente requeriría algún trabajo en el espacio del kernel de la CPU).
respondido por el DonFusili

Lea otras preguntas en las etiquetas