To answer your previous question, there is a difference between waitrequest and readyfordata.
waitrequest is checked *after* a transfer has begun, whereas readyfordata is asserted *before* a transfer occurs.
That's why there aren't seperate read/write wait requests. Once the avalon transfer cycle begins and is frozen by waitrequest, both the master and the slave are stuck until waitrequest is de-asserted, and no other master can access the slave. Its purpose is really more a "wait cycles" signal than actual flow control.
On the other hand the readyfordata can be read by the avalon switch fabric before a transfer starts. Now I never tested this, but in theory, if you imagine two masters connected to a slave that asserts dataavailable but not readyfordata, and the following events:
[list][*]master 1 wants to write to the slave, but readyfordata isn't asserted, so it must wait. The avalon switch fabric doesn't lock the slave yet.
[*]master 2 wants to read from the slave. dataavailable is asserted, so it performs the read
[*]the slave asserts readyfordata, and the master 1 performs the write.[/list]
If you do flow control with waitrequest, master 1 and slave would have been blocked on step 1 and master 2 wouldn't be able to read before master 1 is finished.
I haven't tested it, but I think this is how the avalon switch fabric works in this case.
Nevertheless this feature is seldom used. It is better to either use software flow control (as you suggested) for slow peripherals, or a DMA with fast peripherals.