Re: non-overlapping clocks
Here is what I would do for non overlapping clock generator.
First, some defintions:
clock - (I hope this is obvious)
clock_A - this will drive any NMOS that are on when clock is high
n_clock_A - this will drive PMOS that are on when clock is high
clock_B - this will drive NMOS that are on when clock is low
n_clock_B - this will drive PMOS that are on when clock is low
There will be 3 additional signals needed:
n_clock - output of an inverter with inuput of clock
buff_clock_A - hopefully will become apparent
buff_clock_B - hopefully will become apparent
Now, the circuit. It will take 5 inverters and 2x2-input NOR gates.
INV0 input is clock, output is n_clock
INV1 input is clock_A and output is n_clock_A
INV2 input is n_clock_A and output is buff_clock_A
INV3 input is clock_B and output is n_clock_B
INV4 input is n_clock_B and output is buff_clock_B
NOR1 inputs are n_clock and buff_clock_B output is clock_A
NOR2 inputs are clock and buff_clock_A output is clock_B
In static conditions, clock_A, buff_clock_A and n_clock_B will be the same as clock, and n_clock, clock_B, buff_clock_B and n_clock_A will be complimentary to clock.
On transitons, the following sequences will occur:
clock H-L transition will drive n_clock L-H
n_clock L-H will drive clock_A H-L
clock_A H-L will drive n_clock_A L-H
n_clock_A L-H will drive buff_clock_A H-L
buff_clock_A H-L will drive clock_B L-H
I pause here, because this is key to the non-overlapping generation. clock_B going L-H needs BOTH clock H-L AND buff_clock_A H-L. Since buff_clock_A will not go L until AFTER clock_A has gone low and n_clock_A has gone high, this ensures that the clock A switches are OFF before the clock B switches get turned ON.
continuing where I left off:
clock_B L-H will drive n_clock_B H-L
n_clock_B H-L will drive buff_clock_B L-H
Now, this sets up for the non-overlap for the other phase. Since buff_clock_B is H, clock_A will remain low until buff_clock_B becomes low, which will be after the clock B switches are turned off.
Caution: do not put a buffer from the clock signals in this path to the switches. Such a buffer will no longer allow the circuit to be sure that the switches are OFF before turning the opposite phase switches ON.
Note: If your design requires events to occur in sequence for each phase of the clock, adding additional inverters in each chain (2 at a time...) will allow this. For example, buff_clock_A could be used to turn on an NMOS switch that needs to have a switch controlled by clock_A turned on first.