Tue Jan 28 06:38:12 EST 2020

Pulse vs. level

Level is easier to do because it's a single time instance (change
polarity).  A pulse always requres two events: one to turn it on, and
one to turn it off.

The good part is that level can be transformed into pulse using just
an edge detector.

Important there is that it allows FACTORIZATION OF STATE MACHINES.

I strongly believe it is better to have two independent transition
functions, as compared to a single one.

Now, there is a problem: we can't implement waiting if a pulse will be
missed.  That is why level-triggering is necessary.

So let's look at this a bit closer.

Suppose we have a series of signals that are used for synchronization.
If all signals are low, we wait in the next cycle.  If one signal goes
high, that one is used to cause a transition.  Ties are broken by
using a priority select.

That part is straightforward.

Pulses can be seen only when they are not obscured by other higher
priority pulses occuring simultaneously.

A "case" study: the async_transmit has a priority select on wordClock,
which means it will ignore bitClock if it occurs at the same time as

      [shiftReg', cnt'] <- cond
        [(wordClock, [newframe, cbits n' (n + 2)]),
         (bitClock,  [shifted,  cntDec])]
        [shiftReg, cnt]

What about this:

- Use pulses for async one-way communication.  This already works, and
  in most cases it is appropriate.

- Find a new mechanism for rendez-vous synchronization.  Tis seems to
  need level triggering with acknowledgement.