This design pattern creates a one-clock-cycle-wide pulse in the receiving clock domain,
which serves as a precise strobe signal to capture multi-bit data that has crossed clock domains.
🕹️ The Core Idea
Instead of sending a level signal that must be stretched long enough to be detected,
we send a toggling signal (a single bit that flips state every time a new data word is ready).
This toggle passes through a 3-stage synchronizer in the receiving domain,
and by comparing two consecutive synchronization stages (using an XOR gate),
a one-cycle pulse is generated whenever a toggle change is detected.
This pulse acts as a safe “capture now” command for the destination logic.
⚙️ Circuit Breakdown
Let’s denote:
d→ toggle signal from source clock domainq1,q2,q3→ 3 flip-flops in the synchronizer chain, clocked by the destination clocksync_pulse→ one-clock-cycle-wide output pulseq3→ synchronized version of the input (delayed by three cycles)

Verilog-like description:
always @(posedge dest_clk) begin
q1 <= d; // 1st synchronizer stage
q2 <= q1; // 2nd stage
q3 <= q2; // 3rd stage
end
assign sync_pulse = q2 ^ q3; // XOR detects any change (toggle edge)
assign q_out = q3; // Delayed version of input
🧠 How It Works — Step-by-Step
Let’s follow the operation through cycles:
- Cycle 1 — Source toggles
dhigh (new data ready). - Cycle 2–4 — The high value propagates through the synchronizer stages (
q1,q2,q3). - When
q2andq3temporarily differ (e.g.,q2=1, q3=0),
their XOR output = 1, generating a 1-cycle pulse in the destination domain. - This pulse (
sync_pulse) signals capture the data now. - Cycle 7 — Source toggles
dlow (next data ready).
Again, after synchronization delay, another 1-cycle pulse appears. - The
q_outfollows the toggle state delayed by three destination clock cycles,
which can be used for feedback/acknowledge back to the source domain.
🧩 Key Features
| Feature | Description |
|---|---|
| Polarity independent | Works whether the toggle goes high→low or low→high — XOR detects any edge |
| Single-cycle pulse | Output pulse lasts exactly one destination clock cycle |
| Three-stage synchronizer | Provides robust metastability filtering and pulse alignment |
| q-output | Delayed synchronized copy of the input, often used for feedback (acknowledge) |
| No pulse width tuning | Works purely from detecting toggles, not signal levels |
✅ Advantages
- Safe and simple — uses standard flip-flop synchronizers and XOR logic.
- Detects both edges — no need to worry about high/low polarity.
- Perfect for handshaking — the
q_outfeedback can be sent back through another identical synchronizer in the opposite direction. - Guaranteed 1-cycle pulse width — easy for destination logic to use as a strobe signal.
⚠️ Design Requirements
- The receiving domain must capture the data during the same cycle that the pulse occurs.
- The pulse exists for only one destination clock cycle, so downstream logic must be ready to use it immediately.
- The data bus must be stable before the pulse occurs and must remain stable for at least the entire receiving clock cycle when the pulse is active.
🪄 Typical Usage Pattern
This synchronized enable pulse circuit forms the heart of many reliable CDC handshaking systems.
- Forward path:
Source → toggle bit → synchronizer → XOR pulse → destination captures data. - Return path (optional):
Destination’sq_out→ synchronized back → source sees acknowledgment.
This allows both open-loop (no feedback) and closed-loop (feedback-based) MCP communication.
📊 Summary Table
| Signal | Role |
|---|---|
d |
Toggle bit from source domain |
q1, q2, q3 |
Synchronizer stages in destination domain |
sync_pulse |
1-cycle pulse for data capture |
q_out |
Delayed synchronized version of d (used for feedback) |
🧩 Why It’s Preferred
This technique ensures that:
- You never rely on absolute timing between clock domains.
- Every new data toggle produces exactly one capture pulse.
- Metastability risk is confined to the synchronizer and is statistically negligible with 3 stages.