Bus arbiter that can handle multiple concurrent requests vhdl

I am working through a weird problem. We are pin constrained on our FPGA and need to control a common bus. This was all fine and good as all the software was sequential, but now some requests will be coming in at the same time for devices, but will now have to be put into a queue.

How should I take care of making sure that everything gets shoved into a FIFO without priority and without dropping data? I've got the outer design complete for controlling everything up until the bottle-neck where everything gets shoved into the pipe before being granted access to our "bus". Some requests will take a long time to come in, but will do so concurrently from an FPGA whereas software commands will come in sequentially, but less predictably. If I don't care about the order in which I grant access to the "bus", what is the best way to pipe all of this information into a single FIFO under the assumption that some commands will be coming in at the same time without knowing how many there will be? I would like to avoid having to request/ack/grant if possible as I would like all of this to be taken care of by a single component that just receives a bunch of data and takes care of the complexity. What is the easiest way to accomplish this?

• Almost full msg and almost empty? – Sunnyskyguy EE75 Sep 13 '18 at 23:25
• If you don't want to apply backpressure (using request/ack/grant) then you have to decide what should happen if data comes in faster than it goes out. – immibis Sep 13 '18 at 23:36
• Do you have a guarantee that the average needed bandwidth over a limited time is lower than the available bandwidth on the bus? Is this limited time reasonable? Is not dropping messages a hard requirement? Are all these questions harder to answer than just supporting backpressure? – DonFusili Sep 14 '18 at 8:42
• @DonFusili So our available bandwidth on the bus is able to support the worst case scenario where every "master" is requesting time, however dropping data is a very strict requirement. Backpressure is a difficult question since the data coming in is from an ADC that is running continuously and we cannot affort to pause this processing. I am looking for an interface that can keep up without building backpressure as my concern is not the bus itself, but the servicing of bus time. – nichollsg Sep 14 '18 at 18:53
• @DonFusili One idea I had was to provide a FIFO or simple buffer on each source and using an arbiter to service these FIFOs while they are not empty. I have heard of axi streams (we're using Xilinx) but am not too familiar with implementing them. My original hope of a single FIFO pretty much guarantees that I will need to pause processing time somewhere while each component waits for a grant, so I forsee issues at this point in the system. Do you have suggestions for an axi stream like interface? – nichollsg Sep 14 '18 at 18:57

read = output_ready && output_valid