赞
踩
亚稳态:亚稳态是设计正常运行中,在某些时间点(在某段时间内),信号不能呈现稳定的0或1状态。对于多时钟设计,亚稳态是无法避免的,只能减小发生概率。
CDC就是为了减少亚稳态传播,所实现的方式,具体的可以联想下异步FIFO的设计,那是多bit数据实现跨时钟域的传播;而这里主要讲下单bit的跨时钟域的处理。
a、快到慢
存在的问题:信号可能会被漏采,两方面原因,一个是在采之前,信号又变化了;另一个是信号太靠近采样时钟的边沿了。
具体的:快时钟的信号脉冲宽度小于慢速时钟一个周期,此时信号不会被慢速时钟采到,而如果信号脉冲的边沿太靠近慢速时钟的变沿,就有可能采到不确定的信号,导致亚稳态。
通常的处理方式:展宽信号,让采样时钟能够采样到。
展宽信号的方式有两种:
1、在发送时钟域对发送信号打拍,然后相或来实现展宽到能被采样时钟采到;
2、通过握手的方式
这里以握手为例说明:
先看示意图:
简单说下上图握手的意思:
本质上是为了拓展发送时钟域的信号,问题是在发送时钟域什么时候将发送信号拉低;上图的设计是加上了一个握手信号;
具体的:发送时钟域采样发送信号,然后同步到采样时钟,采样时钟再将同步信号同步回发送时钟域,发送时钟通过采样反馈回的信号,来拉低发送信号。设计代码如下:
//展宽clka时钟域的输入信号a always @ (posedge clka or negedge rst_n) begin if (rst_n == 1'b0) signal_a <= 1'b0 ; else if (pulse_a_in) signal_a <= 1'b1 ; else if (signal_b1_a2) signal_a <= 1'b0 ; else ; end //展宽的信号同步到clkb时钟域 always @ (posedge clkb or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b <= 1'b0; signal_b_b1 <= 1'b0 ; signal_b_b2 <= 1'b0 ; end else begin signal_b <= signal_a; signal_b_b1 <= signal_b ; signal_b_b2 <= signal_b_b1 ; //{signal_b_b2,signal_b_b1,signal_b} <= {signal_b_b1,signal_b,signal_a}; end end //反馈信号,同步到clka时钟域 always @ (posedge clka or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b1_a1 <= 1'b0 ; signal_b1_a2 <= 1'b0 ; end else begin signal_b1_a1 <= signal_b_b1 ; signal_b1_a2 <= signal_b1_a1 ; end end
b、慢到快
这里有两种情况:
1、两个时钟频率相差很大,一般快是慢的两倍以上,直接两级同步即可(这比较简单,不展现代码了)
2、如果两个时钟频率相差不大,可能会采到亚稳态的值,就需要采用先展宽再握手的方式,保证数据的稳定,与上面快时钟信号被慢时钟信号采是一样的方法。
快到慢
在一开始写tb的时候,发送信号是随机的,后来通过波形图一看,这不出现漏采的情况了吗(实际的设计中也有可能出现这种情况)。为了解决这个问题,有两种方式:
1、反馈信号是打两拍所得,改成打3拍,然后通过边沿检测获得一个脉冲信号,通过这个脉冲信号来控制发送信号的发送;
2、1法的设计思路低效,中间需要等待较长时间去发送下一笔,可以通过添加一个同步fifo来实现outstanding发送;
其实上述两种方法都存在一些问题,具体问题还是要具体分析:面积功耗性能的考虑等等。
慢到快
这里展现的是慢到快的跨时钟域传输,两个时钟域的频率相差较大,所以直接打拍即可,如果相差不大,就需要通过握手的方式来实现信号正确的传输。
上述的CDC(单bit)的基本概念基本就这些,但在实际应用的还需多练习,深入理解背后的原因,而不是拘泥于这样的设计。
[1]Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。