解析异步电路设计
扫描二维码
随时随地手机看文章
最经典的2DFF 1-bit同步器如下,下图结构通常用于单bit控制信号的异步处理:
当Rx Clock Domain第一级寄存器R1的时钟上升沿“恰好”碰到Tx Clock的上升沿,也就是不满足Rx Clock的建立保持时间要求时,就会采样到亚稳态的值,在第二级寄存器R2采样R1的输出前,有70%~80%的概率是R1的输出已经能稳定在0或1,再经过R2的二级触发器后,稳定的概率为99%。
注意:
-
cdc_s信号必须做到glitch free,也就是我们通常说的寄存输出;
-
int_s信号链路禁止组合逻辑,其本质也是杜绝glitch的出现。
第一级寄存器R1的行为到底是啥样子的?由于cdc_s信号是Tx clock Domain,而R1寄存器的采用时钟是Rx clock Domain,当Rx clock采样时,若cdc_s正好跳变(不满足setup/hold),那么就会出现如下两种情况,而前仿真是无法仿真出下图2种行为的(具体见芯片设计之CDC异步电路(一)一文)。
上面的论述是基于电平方式,那么怎么确保脉冲能被采到呢?源时钟域的时钟慢的话,快采慢OK,否则慢采快就有如下漏采的问题。
怎么保证异步脉冲被采到?先不说展宽的方式,先看下图所示,假设第一个posedge采样到了不确定电平(红线),后面在脉冲拉低之前,还有第二个posedge采样到稳定电平(绿线)。
也就是说,只要采样周期T小于被采样周期(有“3个沿”),可以是上升沿或者下降沿,这样就能保证这个脉冲一定会被采样到,为了方便计算,一般加0.5个采样周期的裕度,即目的时钟频率是源时钟频率的1.5倍。
注意:
-
tx_sel、rx_sel有效时,cdc_d数据总线必须保持稳定;
采用握手机制可以保证异步multi-bit数据传输不出现错误,但由于需要等待握手的完成再传输数据,因此传输效率较低。
相比下文将解说的异或展开的办法,异步握手处理的来回的延迟更大,容易造成脉冲漏采,这是缺点,但是可以保证目标时钟域始终能采集到源时钟域(不论异步时钟频率相差多少),尤其是,在项目继承、项目换人的情况下,更改设计频率不会埋雷,这一点对于敏捷开发尤其重要。
另外一个技巧,我们可以利用(rd_en_cdc | rd_en_ack_d2)作为门控时钟,控制源时钟域的控制信号、数据信号的翻转,降低功耗,等(rd_en_cdc | rd_en_ack_d2)都为低时,启动下一次传输,这样子既保证了数据稳定传输、也降低了功耗,同时项目也能稳定继承,避免埋雷。
老生常谈的异步FIFO,其本质是采用格雷码,在地址连续的情况下,其对应格雷码每个周期只变化1bit,因此可以直接异步采样。
注意:
-
FIFO的overflow、underflow问题;
-
tx_addr是连续的,即地址hamming distance是1;
-
FIFO深度须2^n;
经典的FIFO结构如下:
核心电路:是将FIFO读写地址指针的二进制码转成格雷码,方便同步器打两拍传递到对向时钟域去做空满判断。
空满判断:为了区别空满,我们增加1bit的地址(MSB),我习惯直接用Gray码比较读写指针判定空满:
- 当Gray码读写指针完全相等时,FIFO空;
-
当Gray码读写指针最高2bit相反,其余bit相同时,FIFO满;通常二进制码比较空满是:最高bit不同,其余bit相同,则FIFO满,而格雷码则不同哈。
(五)结绳法
假设源时钟域的信号脉冲rd_en是周期性的出现,那么可以每次出现rd_en时与rd_en_cdc异或一下得到翻转的rd_en_cdc。