使用同一个时钟源clki,做两个二分频时钟,得到div2_clk1和div2_clk2,这两个时钟都能跟源时钟clki同步,但是div2_clk1和div2_clk2的相位可能是相同的,也可能是反相
核心概念:相位关系由“起点”决定
这句话的意思是:虽然div2_clk1和div2_clk2都是由同一个妈妈(clki)生出来的,频率也都是妈妈的一半,但它们“起步”的时刻可能不同。
· “相位相同”:好比两个士兵,在听到“起步走”的口令后,同时迈出左脚。
· “相位反相”:好比两个士兵,一个在口令后迈左脚,另一个在口令后迈右脚。
它们的步调(频率)是完全一致的,但步伐的节拍正好相差半拍。
技术原理:用D触发器实现二分频
我们通常用一个D触发器来实现二分频。D触发器的标准接法是:Qn(反向输出端)接回到D端,在时钟clki的上升沿触发。
情况一:相位相同
假设我们有两个完全相同的D触发器,并且它们有相同的初始状态(比如上电复位后Q都输出0)。
第一个clki上升沿到来时:
· 两个触发器都看到自己的D端是1(因为Qn是1)。
· 两个触发器的Q端都从0翻转到1。第二个clki上升沿到来时:
· 两个触发器都看到自己的D端是0(因为Qn是0)。
· 两个触发器的Q端都从1翻转到0。如此循环…
结果:div2_clk1和div2_clk2的波形完全重合,它们的上升沿和下降沿都发生在同一时刻。这就是相位相同。
情况二:相位反相
现在,假设这两个D触发器有不同的初始状态。比如,触发器1的初始Q为0,而触发器2的初始Q为1(这可能由于芯片制造工艺的微小差异、上电过程的随机性、或没有全局复位信号导致)。
第一个clki上升沿到来时:
· 触发器1看到D=1,所以Q1从0翻转到1。
· 触发器2看到D=0(因为它的Q是1,所以Qn是0),所以Q2从1翻转到0。第二个clki上升沿到来时:
· 触发器1看到D=0,所以Q1从1翻转到0。
· 触发器2看到D=1,所以Q2从0翻转到1。如此循环…
结果:div2_clk1和div2_clk2的波形正好相反!当div2_clk1为高电平时,div2_clk2为低电平,反之亦然。它们的上升沿相差一个clki周期。这就是相位反相。
总结与关键点
同步性:div2_clk1和div2_clk2的边沿都严格对齐于源时钟clki的某个边沿(通常是上升沿),所以它们都与clki同步。相位不确定性:由于数字电路中寄存器的初始状态可能无法保证绝对一致,或者两个分频电路的物理路径延迟有微小差异,导致你无法100%预测两个独立产生的二分频时钟是“同相”还是“反相”。这种不确定性是固有的。工程设计启示:这是一个非常重要的教训!
· 不要用分频后的时钟来做逻辑控制:如果你在设计中使用了div2_clk1和div2_clk2来分别驱动两个模块,然后这两个模块之间需要通信,那么相位的不确定性会导致灾难性的时序问题。一个模块在“白天”工作,另一个可能在“夜晚”工作,数据根本无法正确传递。
· 标准做法:正确的做法是只使用一个主时钟(如clki),然后生成一个频率为原来一半的使能信号(div2_en)。所有逻辑仍然在clki的节拍下运行,只是在div2_en有效时才进行数据的采样或更新。这样就完全避免了多个时钟域的问题。
所以,上面那段话是在提醒你注意这种潜在的、由分频产生的时钟相位关系的不确定性,这在异步电路设计或时钟管理中是必须考虑的关键因素。
推而广之,在实际电路设计中,由clki分频产生的二分频时钟clki_div2和四分频时钟clki_div4,即使约束上设置了他们都与clki同步,但电路中不能直接对两个时钟域间进行数据交互,因为这两个时钟被认为是异步的。



