建立时间和保持时间:
建立时间:在有效的时钟沿到来之前,输入端的输入信号需要保持稳定不变的最小时间
保持时间:在有效的时钟沿到来之后,输入端的输入信号需要保持稳定不变的最小时间

如果不满足建立时间和保持时间的要求,电路就会进入亚稳态。
建立时间和保持时间由工艺决定。

CDC与亚稳态问题
如果触发器的恢复能力较强,可以在一个时钟周期之内恢复稳定的输出,但是不能确定是稳定在0上还是1上,而是一个与D端无关的随机值。
如果FF的恢复能力较弱,无法在一个时钟周期之内恢复稳定的输出,会在下一个有效的时钟沿时仍处于振荡状态。即这种无用的状态还会传递到下一级电路中去,导致后级的电路也会出现亚稳态问题。这种振荡状态称为亚稳态,亚稳态的影响是灾难性的。

同步设计可以使用STA来保持时序正确。

但是,芯片的功能模块越来越多,而且需要和外界的各种设备进行通讯,这样就意味着芯片内部的时钟需要和不同频率的时钟协同工作,它们之间的相位关系也是随机的,所以就不能使用STA方法来分析电路。这些不同时钟的模块之间的信号传输将产生CDC(跨时钟域)问题。

由CDC所引起的问题主要由以下几种:
1、 电路出现亚稳态:要确保可能产生的亚稳态对设计的功能没有错误的影响
2、 数据收敛:要确保一组相关联的同步信号在经过不同的路径之后可以在某一个相同的时钟周期正确的到达另一个时钟域。
3、 多路扇出:一个信号在跨时钟域后出现多个fanout,要确保后续的逻辑得到的值是相同的。
4、 数据丢失:前级时钟比后级的块,要确保该时钟保持足够长的时间以便被另一个石中玉的输入端正确的捕获到。如果这个信号出现的时间太短,就会出现数据丢失。
5、 异步复位:当异步复位信号在释放的时候,处理不当会导致后续电路出现亚稳态。

【Metastability】
CDC与亚稳态问题
使用两级FF来进行信号同步。
CDC与亚稳态问题
经过F3的同步之后,C出现亚稳态的几率会很小。
(C端的结果与A端没有必然的联系)。

【数据收敛】
CDC与亚稳态问题
由同一个时钟控制输出的X1和Y1经过线延时,到达B时钟域的时间是不同的,可能X2信号先到达,Y2的信号后到达,假如Clk_B刚好在X2和Y2相差的这段时间内到达,那么X2会被检测到,而Y2需要等下一个时钟。导致的结果是Y的值永远比X慢一拍,数据不正确。
实际上,这种触发器不仅有线延迟的问题,还有亚稳态没有考虑。
CDC与亚稳态问题
由于出现了亚稳态,X和Y的值是随机的。如果这是一个状态机的状态编码,那么控制器的状态将不可预知。

使用握手协议
仅仅只对请求信号和应答信号进行同步,在请求的时间,发送端的数据保持不变,因此握手协议可以满足并行数据传输安全的需要。

当发送端有数据要送出去的时候,发送端将并行的数据驱动到总线上,同时发出一个“数据有效”的请求信号REQ,以通知接收端这是一个有效的数据,要接收。
请求信号通过两级同步之后传到接收端,如果REQ被接收端正确地识别,那么接收端就知道现在的数据总线上的数据是有效的,立刻接收下来,因为总线上的数据早已被发送端保持稳定,所以就不会出现数据在时钟沿发生变动的情况,以确保数据传输的正确性。接收完毕之后向发送端返回一个响应信号ACK,经过两级同步装置以后送到发送端,如果被发送端识别,发送端将撤销请求信号。接收端检测到请求信号的结束,也将发送响应ACK撤销。发送端再检测到响应信号ACK的结束之后,结束本轮握手通讯,准备下一轮的数据传输。
这样一来,将多个信号的跨时钟域问题转化为了单个信号的跨时钟域问题。
CDC与亚稳态问题

图示:
CDC与亚稳态问题
REQ由发送端产生,经过两级同步装置,传到接收端;
ACK由接收端产生,经过两级同步装置,传到发送端。
两个状态机分别控制REQ、ACK的产生和撤销,同时控制数据总线。
握手协议从REQ有效开始,直到ACK无效结束。
整个握手协议有效期间,发送端必须保证数据总线上的数据稳定不变。
在上图的握手协议中,至少需要经过6个clk_t和6个clk_r的时钟周期。传输效率比较低,但是可靠。为了提高握手协议的传输效率,简化了握手协议的一部分操作。

CDC与亚稳态问题
使用上面两种方法,可以简化握手的步骤,虽然效率提高了,但是需要特定的设计来满足数据传输的正确性。

方法3:FIFO
将fifo作为数据的中转站,发送端直接将发送的数据写到FIFO中,接收端在需要接受数据的时候,可以直接从FIFO中读取,这样就不存在跨时钟域的问题。
并不是什么时候都能对FIFO进行操作,比如FIFO满了不能写,空了不能读。
所以还需要注意一下两个问题:
数据发送端要检查FIFO是否满了。
要在写指针域判断是否满了,需要知道读指针的位置,这样就会有跨时钟域的问题。
同理,在数据的接收端,在读之前必须要判断FIFO是不是空的。

读写指针的值是连续变化的,可以使用格雷码来进行处理。
CDC与亚稳态问题
状态机分别用来控制FIFO的读写功能。
比较器用来判断FIFO是否空或者是否满。
同步read_addr/write_addr用于将读写指针同步到对应的时钟域中。

FIFO将不能用格雷码编码的跨时钟域问题,转化为可以使用格雷码的读写地址的跨时钟域问题。

CDC产生的第三类问题:数据丢失。
当信号A由时钟域A向时钟域B传输的时候,由于A的速度较快,无法被B采到,会出现数据丢失的情况,对于触发器F2来说,这个信号就是一个毛刺,不会被捕获到。
CDC与亚稳态问题
即:输入端信号不能够保持足够的时间而导致接收端不能采样到数据而导致数据丢失。

可以通过某种手段将信号A延长一段时间,以确保信号A的保持时间长于cB的时钟周期。

解决方法一:
CDC与亚稳态问题
通过延长输入信号D的方法来达到延长A的方法。

解决方法2:
脉冲信号触发电路(把输入作为触发沿信号)
CDC与亚稳态问题
信号A经过两级同步触发器,再经过一个边沿检测的电路,将边沿信号转化为电平信号。

这个电路不好的地方在于由于是上升沿触发,所以只检测Q的上升沿,当Q在A域出现连续两个高电平的时候,第二个高电平由于没有上升沿,不会被检测到。其结果就是最后的输出依然只有一个高电平。
CDC与亚稳态问题
在使用这种电路的时候,要考虑到信号持续时间的长短不会影响到电路的功能。
还有一种会产生负面影响的情况是,信号Q的变化太频繁,也就是Q的上升沿很快地到来,那么信号A会发生两次反转。最终导致在进行边沿检测的时候,在输出端会产生一个两个时钟周期的高电平信号。设计者需要保证这种可能性不会影响电路的功能。

CDC产生的第四类问题:多路扇出
在有些情况下,一个信号在跨越时钟之后,又分为了多个分支,比如一个使能的控制信号分别使能后续的多个模块,如果这两个信号需要协同工作,可能会由于亚稳态原因导致它们的使能状态不一样,即一个工作、另一个不工作,这样是不允许的。(同一个信号在跨时钟域时经过多路扇出,结果不一定相同)
CDC与亚稳态问题
必须在单个信号跨时钟域之后再多路扇出。
CDC与亚稳态问题

由CDC产生的第五类问题:异步复位
对异步复位的D触发器来说,异步复位信号就是一个典型的跨时钟域信号,异步信号可能会产生亚稳态。

复位信号产生的时候不会出现问题,问题在复位信号释放的时候。
要想保证异步复位信号不会使D触发器进入亚稳态,必须要满足一定的条件。
异步复位信号必须在触发器时钟的有效沿的前一段时间内释放,并且在有效沿之后保持一段时间。其实这是为了满足触发器的建立和保持时间的要求,但是异步复位信号比较特殊,另外有术语:恢复时间和移除时间。
CDC与亚稳态问题

当异步复位信号在释放时不满足恢复时间和移除时间,那么在上升沿附近,输入端D信号有无效变为有效,相当于D有一个在建立时间和时间之间的跳变,触发器将会出现亚稳态。

解决方法:对异步复位信号在释放时进行同步处理(异步复位、同步释放)。
CDC与亚稳态问题
如图所示,在reset信号释放的时候,信号o_reset 不会被马上拉高,而是经过了两级同步处理过后才被拉高。即o_reset是同步释放的。

相关文章: