Árbitro de bus que puede manejar múltiples solicitudes concurrentes

2

Estoy trabajando a través de un problema extraño. Tenemos restricciones de pines en nuestro FPGA y necesitamos controlar un bus común. Todo estaba bien y bien, ya que todo el software era secuencial, pero ahora se recibirán algunas solicitudes al mismo tiempo para los dispositivos, pero ahora habrá que ponerlos en una cola.

¿Cómo debo ocuparme de asegurarme de que todo se introduzca en un FIFO sin prioridad y sin eliminar datos? Tengo el diseño exterior completo para controlar todo hasta el cuello de la botella donde todo se introduce en la tubería antes de que se le otorgue acceso a nuestro "autobús". Algunas solicitudes tardarán mucho tiempo en llegar, pero lo harán de forma simultánea desde un FPGA, mientras que los comandos de software entrarán de forma secuencial, pero de forma menos predecible. Si no me importa el orden en el que otorgo acceso al "bus", ¿cuál es la mejor manera de canalizar toda esta información en un solo FIFO bajo el supuesto de que algunos comandos entrarán al mismo tiempo sin ¿Sabiendo cuántos habrá? Me gustaría evitar tener que solicitar / aceptar / otorgar, si es posible, ya que me gustaría que todo esto se solucione mediante un solo componente que solo recibe un montón de datos y se encarga de la complejidad. ¿Cuál es la forma más fácil de lograr esto?

    
pregunta nichollsg

1 respuesta

1

Si solo tiene un 'sumidero', entonces debe arbitrar. Tendrá que aplicar la contrapresión a cualquier fuente que aún no haya recibido una subvención. Si no puede aplicar la contrapresión a lo que está generando las solicitudes directamente, entonces la única opción es colocar un FIFO 'lo suficientemente grande' en cada fuente y aplicar la contrapresión a esos FIFO. El truco consiste en averiguar qué tan grandes deben ser esos FIFO para eliminar caídas. Tal vez algunas fuentes puedan aceptar la contrapresión, quizás algunas envíen más a menudo y, por lo tanto, requieren FIFO más profundas, etc. RAM con 1 LUT por bit.

El flujo AXI es super simple, es solo una señal lista y válida que acompaña a los datos. La validez es alta cuando los datos son válidos, listo indica que el receptor está listo para recibir los datos, y los datos se transfieren cuando ambos valores son válidos y listos. Cuando conectas un FIFO con una interfaz FIFO 'tradicional', puedes asignar input_ready, input_valid, output_ready y output_valid en lectura, escritura, lleno y vacío, así:

read = output_ready && output_valid
write = input_ready && input_valid
input_ready = !full
output_valid = !empty
    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas