IC设计之问①,跨时钟域处理问题
IC设计之问①,跨时钟域处理问题
在IC设计中,跨时钟域处理是一个关键且复杂的课题。当信号在不同频率的时钟域之间传输时,很容易产生亚稳态问题,这会严重影响电路的稳定性和可靠性。本文将深入探讨亚稳态产生的原因,并详细介绍单比特和多比特信号在跨时钟域传输时的处理方法,包括寄存器打拍、异步FIFO和握手协议等解决方案。
一、跨时钟域为什么会带来亚稳态?
首先明确两个概念:
- 建立时间:在时钟有效沿到来之前数据需保持稳定的最小时间。
- 保持时间:在时钟有效沿到来之后数据需保持稳定的最小时间。
当建立时间、保持时间不满足时便会带来亚稳态问题。
在不涉及跨时钟域的同步电路中,涉及的输入信号都是由同一时钟下进行控制产生的,往往都会满足建立、保持时间的关系。那么是不是可以说在同步电路中就不会涉及到亚稳态问题呢,答案是肯定不是的,在同步电路中也可能会涉及到亚稳态问题。这是由于除了跨时钟域这个情景之外,在实际电路中的各种延时也可能会导致建立时间、保持时间不满足进而导致亚稳态问题的产生。但是这不是我们讨论的重点,延时的改善往往是后端工程师需要考虑的问题(当然前端工程师在设计时也需要考虑关键路径的问题,这里不做讨论)。
在跨时钟域的问题上为什么往往伴随着亚稳态的产生呢?当某一电路中的输入信号是来自不同时钟的某一电路的输出时,由于两个时钟不同频,非常容易造成亚稳态的问题(建立时间、保持时间不满足)。
二、在跨时钟域中单比特信号如何处理?
2.1、寄存器“打拍”处理亚稳态
什么是“打拍”,简单来说就是寄存器级联(如下图),两级寄存器级联就是打两拍,三级寄存器级联就是打三拍,那么为什么寄存器级联可以处理亚稳态呢?
原理:如下图所示,当来自不同时钟的信号data到来时,data的上升沿正好跟b_clk的有效沿重叠,这时会导致亚稳态,这会导致寄存器有一段时间不稳定的状态,随后恢复到稳定的状态,那么到达稳定时就会有两种可能,情况1:经过一段时间亚稳态后回到1;情况2:经过一段时间亚稳态后回到0;这两种情况均在下图b_dat1标出,这两种情况对应的b_dat2的输出也是不同的,由于正确的采样信号为1,情况2的正确输出会比情况1晚一拍(这也是为什么多bit信号不能用打拍处理,后面会详细说)。显然,第一次在b_clk的有效沿采样发生了亚稳态,然而在第二次采样时,由于data满足了建立时间、保持时间的关系,所以采样到了正确的信号。
通过以上分析,打拍的本质是什么?其本质就是为了“等待”,打两拍就是“等待”两个时钟周期,在这个周期内信号会恢复正常。
那么是不是打两拍就能完全消除亚稳态的问题?答案是不行。其原因是寄存器的决断时间不满足(决断时间:寄存器从亚稳态到稳定的状态所需要的时间),决断时间往往是由工艺参数决定的,不能改变,在高频电路中,频率越高,周期越短,所以打拍给予的“等待”时间就短,周期短了就可能导致决断时间大于一个周期,所以在实际的应用中,往往我们会看到打三拍、打四拍。
但是我们上述分析有一个前提,就是我们需要保证输入的data的时钟周期要大于本电路的时钟周期,也就是只适用于慢→快的情景,慢时钟周期T ≥ 快时钟周期T + Tsq(建立时间)。
在慢→快与快→慢的情形中,涉及的问题很多,例如:在慢→快的情形中,如果慢时钟比快时钟慢的多,就会有一个信号多次采样的问题;在快→慢的情形中,如果快时钟比慢时钟快的多,就会造成信号漏采的问题。
2.2 “慢→快”的情形如何处理数据“多采”的问题?
事实上,慢→快的情形事实上大多数情况下不需要考虑多采的问题,因为大多数情况下多采不会对结果造成影响。如果有特定的需求,比如将采集到的数据只保持一个快时钟周期,可以参考以下方法:
如上图所示,有三种方法解决问题。
第一种:第三级寄存器输出取反然后与第二级寄存器输出相与。
第一种:第三级寄存器输出与第二级寄存器输出取反后相与。
第三种:第三级寄存器输出与第二级寄存器输出异或。
如下图所示,第一种为D2的上升沿后的一个T周期;第二种为D2的下降沿后的一个T周期;第三种为D2上升沿后的一个T周期和下降沿后的一个T周期。这样就避免了多采的问题。
2.3 “快→慢”的情形如何处理数据“漏采”的问题?
2.3.1将快时钟信号进行展宽
如上图所示,将data信号通过pulse信号进行展宽(当data信号为1时翻转pulse一次),展宽之后的pulse信号再通过打两拍的方式再通过2.2中的第三种方法进行输出,由此就得到了正确的输出,避免了数据的漏采。
三、在跨时钟域中多比特信号如何处理?
3.1在跨时钟域中为什么不能采用寄存器打拍?
如果对多bit信号进行打拍,发生如下图情形,当data0经过一段时间亚稳态变成正确的信号1,二data1经过一段时间亚稳态变成错误的信号0,那么在第二个寄存器输出时,会在一个周期内出现错误的信号10进而导致出错,所以多bit信号不能采用跨时钟域处理。
3.2 采用异步FIFO
在处理多bit信号跨时钟域问题时,最常用的方法就是异步FIFO,在这里不过多介绍异步FIFO。
3.3 采用握手
完全握手同步方式
完全握手的特点是发送域和接收域两端在发送请求或者终止请求之前都需要等待对端的回应。完全握手在收发两侧都使用的是电平同步器。当接收域需要通知发送域它正在积极处理请求时,通常会采用完全握手。完全握手要求发送域推迟它的下一个请求,直到它检测到无效的确认信号。以下是完全握手的流程:
部分握手同步方式
部分握手协议则可以缩短握手的过程,提高数据传输的效率,但使用部分握手信号时,收发双方不等对方响应就中止各自的请求,并继续执行握手命令序列。部分握手类型比全握手类型在可靠性方面稍弱,因为握手信号并不指示各自电路的状态,收发侧都必须保存状态信息。但是,由于无需等待其他电路的响应,完整的时间周期花费时间较少。有两种部分握手方案,区别在于握手所采用的信号类型。一种所用的部分握手方法在发送侧使用电平信号来发送请求,在接收侧使用脉冲信号来发送响应;另一种所用的部分握手方法在发送侧与接收侧都使用脉冲信号。
下面是两种不同的部分握手方式:
事实上,不只是多bit信号解决跨时钟域的问题上可以使用握手,单bit同样适用。
四、总结
不管是单bit还是多bit信号的处理亚稳态的方法,其核心思想就是“等待”,因为将亚稳态的错误信号纠正到正确的信号是需要一个时间的,上述方式都是避免这段“纠错”的时间内采样并在信号稳定之后进行正确的采样。