Parameterized Macro: Pulse Transfer
- MACRO_GROUP: XPM
- MACRO_SUBGROUP: XPM_CDC
Introduction
This macro synchronizes a pulse in the source clock domain to the destination clock domain. A pulse of any size in the source clock domain, if initiated correctly, generates a pulse the size of a single destination clock period.
For proper operation, the destination clock must sample the input data two or more times. You can define the number of register stages that the synchronizers use. An optional source and destination reset can reset the pulse transfer logic. You can also enable a simulation feature that generates messages reporting any potential misuse of the macro.
The implementation of this macro requires some feedback logic. When simulating the macro without the optional reset signals, always define the input pulse signal (src_pulse) because no reset logic recovers from an undefined or ‘x’ that propagates through the macro.
2*(larger(src_clk period, dest_clk period))The minimum
gap is measured between the falling edge of a src_pulse to the rising edge of the
next src_pulse. This minimum gap guarantees that each rising edge of src_pulse generates a pulse the size of one dest_clk period in the destination clock
domain.((DEST_SYNC_FF+2)*dest_clk_period) + (2*src_clk_period)When
reset is active, do not toggle the input pulse signal, and ignore the output pulse
signal because it is not valid.The following waveform demonstrates how to reset the macro and transfer back-to-back pulses while abiding the minimum gap between each pulse.
Port Descriptions
| Port | Direction | Width | Domain | Sense | Handling if Unused | Function |
|---|---|---|---|---|---|---|
| dest_clk | Input | 1 | NA | EDGE_RISING | Active | Destination clock. |
| dest_pulse | Output | 1 | dest_clk | LEVEL_HIGH | Active | Outputs a pulse the size of one dest_clk period when a pulse transfer is correctly initiated on src_pulse input. This output uses combinatorial logic unless you set REG_OUTPUT to 1. |
| dest_rst | Input | 1 | dest_clk | LEVEL_HIGH | 0 |
Unused when RST_USED = 0. Destination reset signal if RST_USED = 1. Resets all logic in the destination clock domain. To fully reset the macro, assert src_rst and dest_rst simultaneously for at least ((DEST_SYNC_FF+2)*dest_clk_period) + (2*src_clk_period). |
| src_clk | Input | 1 | NA | EDGE_RISING | Active | Source clock. |
| src_pulse | Input | 1 | src_clk | EDGE_RISING | Active |
Rising edge of this signal initiates a pulse transfer to the destination clock domain. The minimum gap between each pulse transfer must be at the minimum 2*(larger(src_clk period, dest_clk period)), measured from the falling edge of a src_pulse to the rising edge of the next src_pulse. This minimum gap guarantees that each rising edge of src_pulse generates a pulse the size of one dest_clk period in the destination clock domain. When RST_USED = 1, pulse transfers are not guaranteed while src_rst and/or dest_rst assert. |
| src_rst | Input | 1 | src_clk | LEVEL_HIGH | 0 |
Unused when RST_USED = 0. Source reset signal if RST_USED = 1. Resets all logic in the source clock domain. To fully reset the macro, assert src_rst and dest_rst simultaneously for at least ((DEST_SYNC_FF+2)*dest_clk_period) + (2*src_clk_period). |
Design Entry Method
| Instantiation | Yes |
| Inference | No |
| IP and IP Integrator Catalog | No |
Available Attributes
| Attribute | Type | Allowed Values | Default | Description |
|---|---|---|---|---|
| DEST_SYNC_FF | DECIMAL | 2 to 10 | 4 | This parameter sets the number of register stages that synchronize the signal in the destination clock domain. |
| INIT_SYNC_FF | DECIMAL | 0, 1 | 0 |
0: Disable behavioral simulation initialization values on synchronization registers. 1: Enable behavioral simulation initialization values on synchronization registers. |
| REG_OUTPUT | DECIMAL | 0, 1 | 0 |
0: Disable registered output 1: Enable registered output |
| RST_USED | DECIMAL | 1, 0 | 1 |
0: No resets implemented. 1: Resets implemented. When RST_USED = 0, you always define the src_pulse input during simulation because there is no reset logic to recover from an x-propagating through the macro. |
| SIM_ASSERT_CHK | DECIMAL | 0, 1 | 0 |
0: Disable simulation message reporting. This does not report messages related to potential misuse. 1: Enable simulation message reporting. This reports messages related to potential misuse. |
VHDL Instantiation Template
Library xpm;
use xpm.vcomponents.all;
-- xpm_cdc_pulse: Pulse Transfer
-- Xilinx Parameterized Macro, version 2026.1
xpm_cdc_pulse_inst : xpm_cdc_pulse
generic map (
DEST_SYNC_FF => 4, -- DECIMAL; range: 2-10
INIT_SYNC_FF => 0, -- DECIMAL; 0=disable simulation init values, 1=enable simulation init values
REG_OUTPUT => 0, -- DECIMAL; 0=disable registered output, 1=enable registered output
RST_USED => 1, -- DECIMAL; 0=no reset, 1=implement reset
SIM_ASSERT_CHK => 0 -- DECIMAL; 0=disable simulation messages, 1=enable simulation messages
)
port map (
src_clk => src_clk, -- 1-bit input: Source clock.
src_rst => src_rst, -- 1-bit input: Optional; required when RST_USED = 1
src_pulse => src_pulse, -- 1-bit input: Rising edge of this signal initiates a pulse transfer to the destination clock domain. The minimum
-- gap between each pulse transfer must be at the minimum 2*(larger(src_clk period, dest_clk period)), measured from
-- the falling edge of a src_pulse to the rising edge of the next src_pulse. This minimum gap guarantees that each
-- rising edge of src_pulse generates a pulse the size of one dest_clk period in the destination clock domain. When
-- RST_USED = 1, pulse transfers are not guaranteed while src_rst and/or dest_rst assert.
dest_clk => dest_clk, -- 1-bit input: Destination clock.
dest_rst => dest_rst, -- 1-bit input: Optional; required when RST_USED = 1
dest_pulse => dest_pulse -- 1-bit output: Outputs a pulse the size of one dest_clk period when a pulse transfer is correctly initiated on
-- src_pulse input. This output uses combinatorial logic unless you set REG_OUTPUT to 1.
);
-- End of xpm_cdc_pulse_inst instantiation
Verilog Instantiation Template
// xpm_cdc_pulse: Pulse Transfer
// Xilinx Parameterized Macro, version 2026.1
xpm_cdc_pulse #(
.DEST_SYNC_FF(4), // DECIMAL; range: 2-10
.INIT_SYNC_FF(0), // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
.REG_OUTPUT(0), // DECIMAL; 0=disable registered output, 1=enable registered output
.RST_USED(1), // DECIMAL; 0=no reset, 1=implement reset
.SIM_ASSERT_CHK(0) // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
)
xpm_cdc_pulse_inst (
.src_clk(src_clk), // 1-bit input: Source clock.
.src_rst(src_rst), // 1-bit input: Optional; required when RST_USED = 1
.src_pulse(src_pulse), // 1-bit input: Rising edge of this signal initiates a pulse transfer to the destination clock domain. The minimum gap
// between each pulse transfer must be at the minimum 2*(larger(src_clk period, dest_clk period)), measured from the
// falling edge of a src_pulse to the rising edge of the next src_pulse. This minimum gap guarantees that each rising
// edge of src_pulse generates a pulse the size of one dest_clk period in the destination clock domain. When RST_USED
// = 1, pulse transfers are not guaranteed while src_rst and/or dest_rst assert.
.dest_clk(dest_clk), // 1-bit input: Destination clock.
.dest_rst(dest_rst), // 1-bit input: Optional; required when RST_USED = 1
.dest_pulse(dest_pulse) // 1-bit output: Outputs a pulse the size of one dest_clk period when a pulse transfer is correctly initiated on
// src_pulse input. This output uses combinatorial logic unless you set REG_OUTPUT to 1.
);
// End of xpm_cdc_pulse_inst instantiation
Related Information
- XPM CDC Testbench File (xpm-cdc-testbench.zip)