在SDRAM的代码中,有的模块工作频率50MHz,有的100MHz,不同时钟域间的数据同步太难理解了,请各位前辈指点。代码如下所示。
//同步SDRAM初始化完成信号
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) begin
init_done_d0 <= 1'b0;
init_done_d1 <= 1'b0;
end
else begin
init_done_d0 <= sdram_init_done;
init_done_d1 <= init_done_d0; // 用init_done_d1判断是否初始化完成
end
end
我知道这段代码是通过打2拍实现步时钟信号同步,但始终不明白,如果直接采样,即使采样时钟上升沿撞上数据跳变沿,采样结果可能是0,也可能是1,0的话后面写计数器不启动,1则立即启动写计数器,看起来也没啥问题,即使打2拍,当采样时钟上升沿撞上数据跳变沿,采样结果同样可能是0,也可能是1,好像也没真正起啥作用,如果不使用这段代码到底会有什么后果?也就是说采样异步时钟域信号时不打拍有什么后果?
另外,当高速时钟采样慢速上升沿或下降沿时,采样结果抖动怎么处理?比如DS18B20长线驱动时,波形上升沿和下降沿被长线的线间电容牵制导致波形边沿变化缓慢 ,采用打2拍方式能否有用?
此图采样到缓慢上升沿时,采样结果抖动波形。