免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
本期介绍第六个Xilinx FPGA跨时钟域原语XPM_CDC_PULSE
一、Introduction
-
脉冲同步:这个宏用于将一个脉冲信号从源时钟域同步到目标时钟域。脉冲是一种短暂的信号,只有在源时钟域正确启动时,才能在目标时钟域生成一个周期的脉冲信号。
-
脉冲大小:无论源时钟域中的脉冲大小如何(脉冲的持续时间),在目标时钟域中最终生成的脉冲总是目标时钟的一个周期。也就是说,这个宏将源时钟域中的脉冲 "压缩" 为目标时钟域中的一个单周期脉冲。
-
采样要求:为了确保正确操作,输入脉冲信号必须被目标时钟域采样两次或更多次。这通常通过多级寄存器来实现,用于消除时钟域之间的不确定性,避免亚稳态现象。
-
寄存器阶段:可以定义用于同步的寄存器级数,类似于标准的 CDC 同步机制。更多的寄存器级数可以提供更高的稳定性,但会带来额外的延迟。
-
复位信号:该宏支持可选的源和目标复位信号,能够在必要时复位脉冲传输逻辑,确保整个传输链在启动或复位时处于已知状态。
-
脉冲输入间隔:在源时钟域中,任何两个连续脉冲信号之间必须有一个最小的时间间隔。这个间隔的最小值为 2×max(src_clk period,dest_clk period)
-
生成目标脉冲 :确保在每个
src_pulse
的上升沿都能生成一个等于一个目标时钟周期(dest_clk period)的脉冲。这意味着脉冲的同步过程是可靠的,不会出现丢失或错误的脉冲。 -
保证稳定性:这个最小间隔的要求有助于防止亚稳态现象的发生,并确保每个脉冲能够被目标时钟域正确采样和处理。
-
同时复位:这两个复位信号必须同时被激活(asserted),以确保逻辑电路的同步复位。
-
持续时间要求:复位信号需要保持激活状态的最小时间为:
((DEST_SYNC_FF+2)×dest_clk_period)+(2×src_clk_period)
二、使用方法
javascript
module xpm_test(
input dest_clk ,
input dest_rst ,
input src_clk ,
input src_pulse ,
input src_rst ,
output dest_pulse
);
xpm_cdc_pulse #(
.DEST_SYNC_FF(2), // DECIMAL; range: 2-10
.INIT_SYNC_FF(1), // 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 (
.dest_pulse(dest_pulse),
.dest_clk ( dest_clk ),
.dest_rst ( dest_rst ),
.src_clk ( src_clk ),
.src_pulse ( src_pulse),
.src_rst ( src_rst )
);
三、仿真
javascript
module TB();
reg dest_clk ;
reg dest_rst ;
reg src_clk ;
reg src_pulse ;
reg src_rst ;
wire dest_puls ;
initial begin
dest_clk = 0;
src_clk = 0;
dest_rst = 0;
src_rst = 0;
src_pulse = 0;
#100
dest_rst = 1;
src_rst = 1;
#100
dest_rst = 0;
src_rst = 0;
#100
src_pulse = 1;
#100
src_pulse = 0;
#100
src_pulse = 1;
#100
src_pulse = 0;
end
always #5 dest_clk = ~dest_clk;
always #2.5 src_clk = ~src_clk;
xpm_test tp0(
. dest_clk ( dest_clk ),
. dest_rst ( dest_rst ),
. src_clk ( src_clk ),
. src_pulse ( src_pulse ),
. src_rst ( src_rst ),
. dest_pulse( dest_puls )
);
endmodule
总结
再见