• 注册
  • 查看作者
  • 数字IC设计中跨时钟域信号免做Clock Domain Crossing (CDC)处理的一种方法

    数字IC设计中跨时钟域信号免做Clock Domain Crossing (CDC)处理的一种方法

     

    同一根信号跨域不同时钟域需要做CDC处理,这是非常基础的知识。所谓CDC,就是跨时钟域信号处理,消除因为不同时钟域而带来的亚稳态。

    对于单根信号,最简单的CDC处理方法是采用两级寄存器进行采样。关于两级寄存器采样为什么可以解决亚稳态问题,这里不再赘述。

    但是是不是所有只要不同时钟域之间的信号传递都要做CDC呢?保险的做法当然是yes,但是也可以有例外。今天讲的就是这个例外,即使是搞集成电路多年的老鸟可能也不知道还能这么做。

    先讲一个很基本的知识:对于或门,如果一端为1,那么无论另一端是啥,即使是亚稳态的信号,或门的输出都是1。对于与门,如果一端是0,那么另一端无论是啥,即使是亚稳态的信号,与门输出都是0。如下图所示:

    也就是说:对于要跨时钟域的信号,如果你能确定沿变时被采样的时候,无论其有没有亚稳态,并不影响此时组合逻辑的结果,那么就无需做CDC处理。

    举个栗子:

    我有一个长电平信号A要从CLK1时钟转到CLK2时钟,在CLK2时钟会与信号B与一下(B是CLK2时钟域),但是我确定B信号在A发生沿变的时刻肯定是0,那么就可以对A不做CDC处理。

    也就是说,如果做CDC,代码是这样:

    always@(posedge CLK2 or negedge RST_) begin

    if(!RST_) begin

    A1 <= 1'b0;

    A2 <= 1'b0;

    end

    else begin

    A1 <= A;

    A2 <= A1;  //采用两级寄存器进行跨时钟域信号转换

    end

    end

    assign C = A2 & B;

     

    但是如果我确定A信号沿变的时刻,B肯定为0,那么就无需做CDC,代码直接这么写:

    assign C = A & B;

    不可否认,因为A是CLK1的信号,所以A发生沿变时在CLK2中继续往下传可能会出现亚稳态,但是B在此时为0,可以确保C在此时总是0,所以C信号在CLK2中往下传并不会有问题。

    需要明白的是,不做CDC处理,需要设计者从逻辑功能上保证B在A沿变时肯定是0。如果是或门逻辑,比如A | B则需要保证B必须是1。如果设计者对自己的代码功能理解不正确,或者对时序控制做不到这么精确,那么不做CDC处理就会有很大的风险。

     

     

  • 0
  • 0
  • 0
  • 634
  • 请登录之后再进行评论

    登录
  • 单栏布局 侧栏位置: