逻辑设计中多时钟设计【1】

简介

在实际的逻辑设计中,单个的时钟域内的设计是很容易满足时序要求的。然而,在实际的工程中基本没有实用的设计是只依靠单时钟就能实现的。所以需要考虑在多时钟领域内如何处理信号,以保证可以得到稳定的设计。多时钟域的信号处理,属于逻辑开发中比较基础的问题。


多时钟域

一般对于如下两种情况,我们都认为属于跨时钟域:

  • 时钟频率不同
  • 时钟频率相同,相位不同
在多时钟域设计中,经常会带来如下常见的两个问题:

  • 违背建立时间和保持时间
  • 产生亚稳态(其本质是违背建立时间和保持时间)
(关于建立时间,保持时间,以及亚稳态的概念,请参考相关文档或后续介绍)


跨时钟域的处理方法

分模块设计

在处理跨时钟域问题的时候,首先需要将按照工程中所用到的时钟划分模块,尽量只做到一个模块只使用一个时钟。但是这不是绝对的,比如信号可以以clk1写入到buffer,然后以clk2从buffer中读取数据。最常用的的跨时钟域的方法是使用同步器,为了使静态时序分析(STA)变得简单,一般不推荐大于三级的同步器设计。一般的经验值为二级同步器即可满足时序要求。


需要同步的信号

我们可以把所有需要同步的信号分成两大类:

  • 控制信号(单bit)
  • 数据信号(多bit)

单bit控制信号的传输

一个处于clk1时钟域的异步信号,不能直接送给时钟域为clk2的触发器,这样会造成时钟域clk2亚稳态的概率。为了避免这样的情况发生,常常采用多级同步器的输出信号来取代异步信号。多级同步器,即将多个触发器串联起来组成的同步电路,见下图所示:

逻辑设计中多时钟设计【1】

逻辑设计中多时钟设计【1】

上图为两级同步器,以及时序电路图

需要说明的是,同步器并不能确实地降低出现亚稳态的可能性,但更多的同步器确实能进一步降低出现亚稳态的可能性。如果在特别高速的电路中,所使用的同步器就比较多。但即使是这样,我们仍推荐在简单的设计中使用多级同步器来做控制信号的同步。多级同步器的缺点也很明显,即同步器使电路不可避免地产生硬件资源的开销,并且增加了电路的整体延时。


那么,需要多少级同步器才能解决同步的问题呢?在有些情况下,第一级同步器的输出信号从亚稳态进入稳定状态,仅仅需要一个时钟周期是不够的(主要体现在高时钟频率条件下,或一些特殊情况下),也就意味着第二级同步器的输出依然是不稳定的状态,那么在设计的过程中,必须使用三级同步器电路。多级同步器,在电路上的体现只是串联了一个触发器。以下的时序图说明了使用三级同步器的必要性。

逻辑设计中多时钟设计【1】

数据信号的传输

上面简单的介绍了单bit控制信号的同步,那么对于多bit的数据信号,经常所使用的方法为如下三种:

  • 使用RAM
  • 使用异步FIFO
  • 使用握手信号
应当注意的是,在使用FIFO的时候,FIFO的full/empty信号同步在Read的时钟域下,如果在write数据到FIFO需要full/empty信号的时候,也需要考虑使用同步器。同样的,在使用握手信号的时候,也需要考虑握手信号的同步。


关于同步器

在上面的设计中,会发现一个情况,即控制信号至少大于一个时钟周期,也就是说src_clk的时钟频率要比dest_clk的时钟频率慢,这样使用上面所介绍的同步器是没有任何问题的。但是当dest_clk比src_clk慢,即控制信号小于一个dest_clk的时钟周期,该如何处理呢?
如下图的设计方法,将第一级触发器的输入D与VCC项链,同时第一级触发器的时钟信号使用小于时钟周期的异步信号输入。另外两个触发器直接由系统时钟控制。经过第一级触发器后,得到了一个时钟周期的脉冲信号,这个脉冲信号经过两级同步器同步输出。
逻辑设计中多时钟设计【1】

总结

控制信号的处理其实还有其他的设计方法,如:将控制信号与数据一起当作数据信号,送入FIFO中,然后从FIFO中恢复出控制信号。另外一种,是根据控制信号与数据的关系,最后根据数据恢复出控制信号。例如在处理并行RGB信号的时候,根据VESA的显示器时序标准,无需将控制信号HSYNC,VSYNC,ACTIVE做跨时钟域的同步,而直接可以根据图像中的第一个像素,在输出端恢复出这三个控制信号。
所以,一定要根据实际工作中控制信号的特性来分析,怎样的设计方法才是最佳的设计。