逻辑设计方法学【6】 --多时钟设计技术
在进行一个含多个时钟的设计时,在仿真和综合过程中需要遵循一定的准则,这样会带来很大的好处。通用的准则如下:
- 时钟命名规则
- 分模块设计
1 时钟命名法
Xilinx的开发工具Vivado有“project mode”和“non-project mode”,在“non-project mode”中,我们经常使用脚本进行开发。同样在仿真的时候,也会编写Tcl脚本。在写脚本的过程中,就会经常使用通配符,如果设计者在设计初期对信号命名的时候考虑到这个因素,那么就可以在写脚本的时候省去很多麻烦。所以引入了“时钟命名法”。同时,使用时钟命名法命名后的时钟,后续开发者仅仅通过时钟名称就可以知道该信号的含义。例如,系统时钟可以命名为sys_clk,发生时钟可以命名为tx_clk,接收时钟可以命名为rx_clk等。同理,属于同一时钟域的信号,也可以在命名时使用同样的前缀。例如:有系统时钟驱动的信号,可以用类似于sys_rom_addr、sys_rom_data这样的方式作为起始。
这样的命名过程能极大地较少对信号的混淆,并在各模块之间提供交单的接口,因此提高了工作效率。
2 分块化设计
这是设计含多时钟的模块时常用的一种有效技术,如下所述:
- 每个模块只应当在单个时钟下工作。
- 在信号跨时钟域传输时,使用同步器模块(该模块的作用是将信号从一个时钟域转换到另一个时钟域),以使所有的信号在进入某个时钟域内的模块时,与该模块的时钟保持同步。
- 同步器模块的规模应该尽可能地小。
将整个工程按照时钟域的不同分割成不同的模块的优点在于使得静态时序分析变得很简单,因为所有输出或输入某时钟域的信号都与该时钟的模块保持同步。所以设计就成为完全同步的。另外,对于同步模块是不需要做静态时序分析的。但是要保证满足保持时间的要求。
3 跨时钟域
跨时钟域信号的传输可以归为两类,分别是:
- 控制信号的传输
- 数据信号的传输
3.1 控制信号的传输
在设计中,如果将一个异步信号直接送给若干个并行工作的触发器,就会大大增加亚稳态事件发生的概率,因为有可能有多个触发器进入亚稳态。为了避免形成这种情况下的亚稳态。我们常常使用同步触发器的输出信号来取代异步信号。
为了减少亚稳态的影响,设计者最常用的方法是使用多级同步器,即将两个或多个触发器串联起来组成的同步电路,如图1所示:
图 1 两级同步电路
如果同步器的第一级触发器产生亚稳态输出,那么这个亚稳态会在同步器的第二个触发器取样前进入稳态。这种方法无法保证第二级触发器输出的一定就不会出现亚稳态。但是它确实降低了出现亚稳态的可能性。同理,如果为同步器增加更多级触发器,就会进一步降低出现亚稳态的可能性。
然而这种方法的一个缺点是:同步器同样会增加电路的开销,同时也增加了电路的整体延时。
上述两级同步器的时序图如图2所示:
图 2 两级同步器电路的时序
源时钟域使用src_clk作为时钟,其异步输出信号src_data_out输入第一个同步触发器中。dest_data_in信号(即第一个同步触发器的输出)进入亚稳态,但是在第二个同步电路取样前会进入到稳定状态。因此把dest_data2_in信号(第二个同步触发器的输出)同步化到目的时钟dest_clk时钟。
有些情况下,第一级同步触发器的输出信号从亚稳态进入稳定状态所需要的时间可能需要不止一个时钟周期,这就意味着第二级同步触发器的输出仍然为亚稳态,此时就需要第三级同步触发器,如图3所示:
图 3 三级同步触发器
如果第二级同步触发器的输出为亚稳态,那么时序电路图如下图4:
图 4 三级同步触发器时序图
源模块的异步输出信号src_data_out0工作在src_clk时钟下,并送给第一个同步触发器。信号dest_data1_in(第一个同步触发器的输出信号)进入亚稳态,但可以在多个时钟周期的时间里恢复到稳定状态。在这段时间内,第二个触发器会对第一个触发器进行采样,于是信号dest_data2_out(第二个同步触发器的输出)也会进入亚稳态。如图所示,在第三个触发器采样前,该信号已经进入了稳定状态,这样在三个同步器输出的时候,信号也就是稳定的状态。
在大多数跨时钟域设计中,使用两级同步电路就足以避免亚稳态的出现了。所以只有在信号频率非常高的设计中才要使用三级同步电路。
3.2 数据信号的传输
在多时钟域设计中,数据经常会从一个时钟域传输到另一个时钟域,如果在数据总线传输的过程中也使用多级同步器,这样会带来很大的问题,因为我们无法保证所有的数据经过同步器后都有同样的延迟。所以针对数据输出,应该考虑使用以下两种方法:
- 使用握手信号的方式
- 使用异步FIFO
以上两种方式在后续详细解释。
关于跨时钟域和异步时钟
我们在实际工作中,会遇到多个时钟,那么这多个时钟是不是异步时钟呢?这个需要分辨清楚,不是所有的时钟只要频率不同相位不同就认为是异步时钟,这是一个错误的概念。我们可以简单地理解异步时钟就是从不同的外部晶振生成的时钟(恢复的时钟也可以认为是由不同的晶振的时钟)。对于同一晶振经过PLL或者DCM生成的不同频率不同相位的时钟,它们不属于异步时钟。
参考文献
[1] Mohit Arora.硬件架构的艺术.机械工业出版社. 50-56