首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

IC设计基础系列之CDC篇9:跨时钟域信号传输(一)——控制信号篇A

IC设计基础系列之CDC篇9:跨时钟域信号传输(一)——控制信号篇A

最近我整理了一下跨时钟域设计的一些知识,一方面这与亚稳态有关系,承接前面讲到的内容,一方面当做复习吧。主要内容主要是是围绕跨时钟域展开的,主要内容概览:
    ·跨时钟域与亚稳态
    ·跨同步时钟的控制信号传输
    ·时钟同源,周期之间非整数倍的跨时钟域
    ·跨异步时钟域的控制信号传输


1、跨时钟域与亚稳态
  跨时钟域通俗地讲,就是模块之间有数据交互,但是模块用的不是同一个时钟进行驱动,如下图所示:
                        

  左边的模块1由clk1驱动,属于clk1的时钟域;右边的模块2由clk2驱动,属于clk2的时钟域。当clk1比clk2的频率高时,则称模块1(相对于模块2)位跨时钟域,而模块2位慢时钟域。根据clk1和clk2是不是同步时钟,可以将上面的跨时钟域分为跨同步时钟域(clk1与clk2是同步时钟)和跨异步时钟域(clk1和clk2不是同步时钟)。根据信号是控制信号还是数据信号可以分为跨时钟域的控制信号传输和数据信号的传输。
  在跨时钟域的信号传输过程中,可能出现亚稳态的情况,这个时候,需要同步器进行同步,减小亚稳态传播下去的概率;注意这里的同步器只能减少亚稳态往下传播的概率,如果产生亚稳态,亚稳态恢复稳定后的电平不一定是正确的电平,如果稳定后的电平是错误的,那么就很有可能引起后面的逻辑的错误,这是需要强调的;当然,一般情况下(我这里是说一般情况)很少发生亚稳态,不然后面的逻辑岂不是要挂?
  根据上面的内容可知,跨时钟域可能需要同步器来抑制亚稳态的往下传播的概率,根据情况的不同需要不同的同步器,大致情况如下所示:
跨同步时钟域
快时钟域到慢时钟域
控制信号传输
跨异步时钟域
慢时钟域到快时钟域
数据信号传输
  看着这八大类型,心里就虚,但是这里先剧透一下,在数据的传输(主要是多位数据的传输)里面,无论是跨同步还是跨异步,主要(注意是主要)都是使用比较大的同步隔离器,进行隔离缓冲数据,比如FIFO、RAM;因此一般就会分为控制信号(一般是1位信号)和数据这两种情况设计同步器。跨时钟域的数据传输我们放在最后讲。今天主要整理跨时钟域的控制信号传输。
   我在前面的一篇博客中说到了同步电路与异步电路的区分:这里我们要随机应变,在这里更新一下传统同步时钟的概念:系统中的多个时钟,如果他们的边沿相对的时间差固定(或者说相位固定),那么就属于同步时钟。它们可以是不同时钟源产生的,但是通过锁相环把它们之间的相位进行固定,因此是同步时钟。它们可能是同一时钟源产生的,但是经过分频之后,它们之间的相位随着初始相位和时间变化,这类时钟可以叫他同步时钟,但是从这个传统的概念出发,这就是异步时钟(这个与我上面的那篇博客不一样,要注意),在处理上当做异步时钟进行处理。好了,说了这么多,接下来我们就根据时钟的分类来进行说说吧。


2、跨同步时钟的控制信号传输
    (1)同频同相位的两个同步时钟
波形如下所示:
              

  这两个时钟可以看做是同一个时钟,也就是单时钟设计,允许有1个时钟的周期进行传输数据,因此只要满足普通的同步电路设计要求(满足建立时间和保持时间,控制信号的传输延时要在一定范围内)就可以了,不会出现亚稳态,也不会出现数据丢失的情况,一般不需要同步器。


(2)同频不同相位的两个同步时钟
波形如下所示:
              

  这个固定的相位可以看成是时钟的偏移,允许的传输时间小于一个时钟周期,但是只要满足控制信号的输出是在clk1的控制下进行翻转的,因此只要满足同步设计的一般要求(满足建立时间和保持时间,控制信号的传输延时要在一定范围内),就可以满足时序,不会出生亚稳态,也不会出现数据丢失的情况,因此一般不需要同步器。


(3)不同频,但是存在整数倍的关系
假设没有初始相位差(或者即使有初始相位差固定,也可以通过后期修复),clk1的时钟频率是clk2的3倍。

  ·当从快时钟域跨到慢时钟域时(也就是控制信号从clk1的模块传输到clk2的模块),波形如下所示:
              
  因此只要控制信号从发送时钟域出发到达目的时钟域的时间小于clk1的时钟周期,就不需要同步器;一般情况下,控制信号是触发器触发,触发器捕获,一般满足这个关系,如下所示:
                 
然而需要注意的,这个是从快传到慢,慢时钟域可能会采样不到控制信号从而丢失控制信号,也就是说,我控制信号在从clk1跑到clk2,并且保持一个时钟(clk1)周期,但是你clk2的时钟沿还没有来,等到clk2的上升沿来了,我这个控制信号就已经更新(或者失效)了,上面恰好在时钟clk2上升沿的前一个时钟周期clk1发出信号才采到,如果不是那个时候发送,就会丢失控制信号,如下所示:
                  
  在第2个时钟沿发送信号的时候,只持续了一个时钟周期,因此clk2捕捉不到(这样就是功能性错误了,不单单是时序上的亚稳态而已了);只有在第4个时钟沿的时候发送控制信号,clk2才捕捉得到。因此我们就需要把这个控制信号的周期延迟到clk1周期的3倍,这个可以通过计数器或者状态机进行实现,延长后的波形如下所示:
                  
  可见,这时候不论在上面时候进行发送数据,clk2都能捕捉得到。
  因此一般情况下不需要同步器,但是需要把快时钟域的控制信号根据进行延长合适的时间(根据时钟之间的倍数关系进行确定,控制信号的长度要≥捕获时钟的周期,一般取1.5倍,上图只是1倍),避免慢时钟域丢失信号。

    ·当慢时钟到快时钟域时(也就是控制信号从clk2的模块传输到clk1的模块),波形如下所示:
                     
很显然,快时钟能够采样得到慢时钟的控制信号,而且采样了三次,输出为:
                     
Clock2的控制信号就达到了clk2周期的3倍,如果只需要1个clk周期的控制信号,可以通过上升沿检测电路实现,其输出波形如下所示:
                       
返回列表