Here are the sources I've used while writing the FPGA Design Elements,
covering digital design, bit manipulation, elastic pipelines, and clock-domain
crossing.
Two books which I've found talk usefully about FSM design and implementation are:
There isn't much written about arbiters out there that isn't specializations
of existing designs for particular uses. I couldn't find any good treatment of
the fundamentals, and some ASIC arbiter designs rely on combinational loops,
which are not allowed in conventional synchronous design. Here's what I could
find:
(Thanks to Eric Smith (@brouhaha) for allowing me to host a
copy of the hard-to-find original Flancter App Note, originally from his Floobydust page.)
Bit manipulation algorithms usually contain only Boolean, bit-shift, and
addition operations, are often branch-free, and operate in parallel on all the
bits in a word. Thus, they translate naturally to high-performance hardware.
Note that many bit manipulation algorithms assume a certain word width, which
affects the necessary constants.
The following papers are mainly useful for background and for implementation
guides to pipeline branches, joins, forks, etc... Note however that in the
academic literature, elastic pipelines are often expressed as valid/stop
handshakes, rather than valid/ready handshakes, where "stop" is the inverse of
"ready". This means parts of the diagrams have inverted logic from what it
would be in valid/ready handshakes. Also, watch out for combinational paths,
which aren't completely avoided in these designs: use Skid Buffers as necessary.
Frankly, most writing about CDC is superficial and subtly wrong. Here is some of the best writings on the topic.
Digital Design
Design Books
Finite State Machines
Arbiters
Resets
Ken Chapman's Get
Smart About Reset: Think Local, Not Global discusses why, on FPGAs, it's
important to minimize the number of registers receiving a reset signal, and to
instead use the built-in register initialization at configuration or to
architect the system to eventually get to a consistent state after a minimal
reset.
Flancter
Rob Weinstein's Flancter is a clever
little circuit which allows you to set a bit in one clock domain, and clear it
from another clock domain without using an asynchronous reset or even
having access to the setting clock domain. It needs supporting circuitry
to be useful (e.g.: at least one CDC Bit
Synchronizer), and you will have to carefully
instruct your CAD tool on how to analyze the timing and set min/max delays
on the two signals which cross clock domains without synchronization, and
design your control circuitry to keep the set/reset signals mutually exclusive.
That said, it's amazing for some advanced use cases, such as counting very fast and asynchronous
sensor pulses. However, in most cases, you can get the same functionality
with simpler CDC behaviour by using a CDC Flag
Bit.
Bit Manipulation
Elastic Pipelines
Clock Domain Crossing
Back to FPGA Design Elements