同步跨时钟域电路,由于时钟之间有明确的相位关系,可通过时序约束明确建立时间需求,保证电路正常工作。异步跨时钟域电路,由于发送时钟与接收时钟之间没有明确的相位关系,因此,需要通过电路本身保证数据被稳定地传输。Xilinx提供了模板可减少设计开发的难度。如下图所示。分两种情形,若该信号为复位信号,则根据复位信号是同步复位还是异步复位,分别采用XPM_CDC_SYNC_RST或XPM_CDC_ASYNC_RST;若该信号是脉冲信号,则采用XPM_CDC_PULSE;若不是脉冲信号,则采用XPM_CDC_SINGLE。
(图片来源:ug949(v2018.3) figure 3-63)
下图显示了异步复位信号的跨时钟域模板,只需要把第73行至第87行复制到相应文件中即可。注意采用VHDL时,需要添加第66到第67行内容。
下图显示了非脉冲信号的跨时钟域模板,只需要把第78行至第90行复制到相应文件中即可。注意采用VHDL时,需要添加第71到第72行内容。
多bit异步跨时钟域电路
对于多bit异步跨时钟域电路,第一步,要明确数据是否已经处于稳定状态,不会再翻转。例如,clka驱动的4个触发器,其输入端是固定数值(或0或1),其输出端连接到clkb驱动的4个触发器。那么此时并不需要跨时钟域电路。又或者,clka驱动的4个触发器,其输入端由外部CPU提供,只在上电时给数据,之后保持不变,那么此时也不需要跨时钟域电路。第二步,数据是否每个时钟周期都要被传输,如果是,就需要用到XPM_FIFO_ASYNC;如果不是,就需要明确数据是否需要缓存,如果需要,仍需用XPM_FIFO_ASYNS,否则就转到第三步,检查数据是否是个计数器,如果是,就需要用到XPM_CDC_GRAY,如果不是,就跳转到最后一步,明确所有bit是否要求在同一时钟周期到达。如果是,需要用到XPM_CDC_HANDSHAKE;否则就用XPM_CDC_ARRAY_SINGLE。整个流程如下图所示。
(图片来源:ug949(v2018.3) figure 3-64)