"alpha" <firstname.lastname@example.org> wrote in message
> > > Uncle Noah wrote:
> > >> Xilinx block RAM is synchronous read. Is this the source of your
> > >> problem?
> [YES, Xilinx's sync read give me trouble.]
You may already know about it, but there's a useful trick you might be able
to make use of to obtain "asynchronous-looking" BRAM in Xilinx parts. It
should work with anyone else's parts as well.
If you disable the output registers of the BRAM, your latency of data out is
a single cycle. More precisely: you set up the read address, apply a clock
edge, and your data comes out a little while later. The key thing is, you
only need a single edge. Now, if you use the opposite edge from the
surrounding logic (i.e. usually the falling edge instead of the rising
edge), you can get the read done within a single cycle (instead of having to
wait until the next rising edge for the data). In the timing diagram below,
point 'B' is the edge used for the BRAM, where the address is sampled. As
you can see, the data addressed by the address value presented at 'A' is
ready by the next edge 'C'. The region marked 'x' is the clock-to-out delay
from the BRAM (2ns or more depending on the device family).
A B C
-----+ +------+ +------+ +----
| | | | | |
+------+ +------+ +------+
------------+ Addr +------------------
--------------------+xx| Data +----------
The only problem with this approach is that it limits the speed of your
circuit. Since you were talking about 33MHz, this won't hurt you at all,
whatever family you're targeting.
Senior Firmware Engineer $135K - $150K + Equity You are applying for Senior Firmware Engineer and will have responsibility for designing and
implementing embedded microcontroller systems as part of an IoT sensor network. You will
participate in defining the end-to-end architecture with a focus on designing and implementing
the device firmware solution.