逻辑设计中多时钟设计【1】
简介
在实际的逻辑设计中,单个的时钟域内的设计是很容易满足时序要求的。然而,在实际的工程中基本没有实用的设计是只依靠单时钟就能实现的。所以需要考虑在多时钟领域内如何处理信号,以保证可以得到稳定的设计。多时钟域的信号处理,属于逻辑开发中比较基础的问题。
多时钟域
一般对于如下两种情况,我们都认为属于跨时钟域:
- 时钟频率不同
- 时钟频率相同,相位不同
- 违背建立时间和保持时间
- 产生亚稳态(其本质是违背建立时间和保持时间)
跨时钟域的处理方法
分模块设计
在处理跨时钟域问题的时候,首先需要将按照工程中所用到的时钟划分模块,尽量只做到一个模块只使用一个时钟。但是这不是绝对的,比如信号可以以clk1写入到buffer,然后以clk2从buffer中读取数据。最常用的的跨时钟域的方法是使用同步器,为了使静态时序分析(STA)变得简单,一般不推荐大于三级的同步器设计。一般的经验值为二级同步器即可满足时序要求。
需要同步的信号
我们可以把所有需要同步的信号分成两大类:
- 控制信号(单bit)
- 数据信号(多bit)
单bit控制信号的传输
一个处于clk1时钟域的异步信号,不能直接送给时钟域为clk2的触发器,这样会造成时钟域clk2亚稳态的概率。为了避免这样的情况发生,常常采用多级同步器的输出信号来取代异步信号。多级同步器,即将多个触发器串联起来组成的同步电路,见下图所示:
上图为两级同步器,以及时序电路图
需要说明的是,同步器并不能确实地降低出现亚稳态的可能性,但更多的同步器确实能进一步降低出现亚稳态的可能性。如果在特别高速的电路中,所使用的同步器就比较多。但即使是这样,我们仍推荐在简单的设计中使用多级同步器来做控制信号的同步。多级同步器的缺点也很明显,即同步器使电路不可避免地产生硬件资源的开销,并且增加了电路的整体延时。
那么,需要多少级同步器才能解决同步的问题呢?在有些情况下,第一级同步器的输出信号从亚稳态进入稳定状态,仅仅需要一个时钟周期是不够的(主要体现在高时钟频率条件下,或一些特殊情况下),也就意味着第二级同步器的输出依然是不稳定的状态,那么在设计的过程中,必须使用三级同步器电路。多级同步器,在电路上的体现只是串联了一个触发器。以下的时序图说明了使用三级同步器的必要性。
数据信号的传输
上面简单的介绍了单bit控制信号的同步,那么对于多bit的数据信号,经常所使用的方法为如下三种:
- 使用RAM
- 使用异步FIFO
- 使用握手信号