chapter3——处理多个时钟

1.多时钟域

常见的多时钟域如下:
在这里插入图片描述
这样的设计有以下类型的时钟关系:
1)时钟的频率不同。
2)时钟频率相同,但相位不同。

以上两种关系如下所示:
在这里插入图片描述

2.多时钟域设计的难题

多时钟设计将面临以下问题:

  • 建立时间和保持时间的违背。
  • 亚稳态。

建立时间要求数据必须在时钟上升沿到来之前保持稳定,保持时间要求在时钟上升沿到来后数据必须仍然保持稳定。对于单时钟域,这样的要求很容易满足。但是在多时钟域情况下,很容易出现一个时钟域的输出在另一个时钟域中的时钟上升沿到来时发生改变的现象。这将会引起第二个时钟域中触发器的输出处于亚稳态,由此导致一系列错误的结果。

3.多时钟设计的处理技术

在进行一个含多个时钟的设计时,在仿真和综合过程中遵循一定的准则将会带来很大的好处。一些通用的准则如下:

时钟命名规则

为了保证综合脚本可以更轻松地处理所有的时钟信号,有必要对整个设计使用一个确定的命名步骤。例如,系统时钟可以命名为sys_clk,发送时钟可以命名为tx_clk,接收时钟可以命名为rx_clk等。这样就可以在脚本中通过通配符来对所有时钟进行操作。

分模块设计

分块化设计是设计中含多时钟的模块时常用的另一种有效技术,如下所述:
1)每个模块只应当在单个时钟下工作。
2)在信号跨时钟域传输时,使用同步器模块,以使所有信号在进入某个时钟域内的模块时,与该模块的时钟保持同步。
3)同步器模块的规模应尽可能小。

将整个设计分割成模块的优点在于使得静态时序分析变得很简单,因为所有输出或输入某时钟域的信号都与使用该时钟的模块保持同步。

一个典型的分块化设计如下:
在这里插入图片描述

跨时钟域

  • 控制信号的传输(单bit信号)

在设计中,如果将一个异步信号直接送给若干个并行工作的触发器,将会大大增加亚稳态事件发生的概率,因为有可能有多个触发器进入亚稳态。为了避免形成这种情况下的亚稳态,我们可以使用同步触发器的输出信号来取代异步信号。

为了减少亚稳态影响,可以使用多级同步器,即将两个或多个触发器串联起来组成的同步电路。

这种方法的一个缺点,也可以看作同步器电路不可避免地开销,就是增加了电路的整体延时。

在大多数多时钟域设计中,使用两级同步电路就足以避免亚稳态的出现了。所以,只有在时钟频率非常高的设计中才要求使用三级同步器电路。

  • 数据信号的传输(多bit信号)

在多时钟域设计中,数据经常会从一个时钟域传输到另一个时钟域。以下是保证数据正常地在不同时钟域间传输的两种方法:
1)使用握手信号。
2)使用异步FIFO。

在第5节和第7节中将详细讲述。

4.跨时钟域

如果多个时钟都起源于同一时钟,并且它们的相位和频率关系是已知的,那么这些时钟可以看成是跨同步时钟域的时钟。按照相位和频率的关系,可以将这些时钟分成以下类型:

同频零相位差时钟

在这种情况中,两个完全相同的时钟clk1和clk2具有同样的频率和零相位差,他们是完全相同的。在这里的数据传输并不算是跨时钟域,这种情况下,只要静态时序分析能够通过,就不会出现亚稳态问题和数据丢失或不一致的问题。

同频恒定相位差时钟

这些时钟有相同的时钟周期,但是相位差恒定。典型的例子是某个时钟相对于其上级时钟发生了相位移动,如下所示:
在这里插入图片描述
clk1相对于clk2相位前移了3T/4个单位时间,每当数据从clk1传输到clk2时,由于更小的建立时间/保持时间裕量,对组合逻辑的延时约束都会变得更紧。如果组合逻辑的延时能保证满足采样沿处的建立时间和保持时间的要求,数据就可以正确地传输,并且不会有亚稳态产生。在这种情况下是不需要同步器的,只要设计的STA通过就可以了。

一般会在STA中创建这种情况以保证满足时序要求。如果组合逻辑有更多延时,通过在发射边沿和捕获边沿加入偏移,会有助于满足时序的要求。

非同频、可变相位差时钟

整数倍频率的时钟

在这种情况下,一个时钟的频率是另一个时钟的整数倍,并且它们有效边沿的相位差是可变的。这两个时钟的有效边沿之间可能的最小相位差始终等于其中较快的那个时钟的时间周期。

在这里插入图片描述

如图,clk1的频率是clk2的三倍,假定clk1周期为T,则clk2可以用来捕获数据的时间可能是T、2T、3T,这取决于数据在时钟clk1的哪个边沿发出。因此,任意路径的最差延迟都应在时钟边沿相位差为T时满足建立时间的要求。最差保持时间检查应当在时钟边沿相位差为零时进行。

在上述情况中,都有较快时钟的一个完整的周期用来传输数据,以使其能正确地捕捉,所以它通常都可以保证满足建立时间和保持时间的要求。

由于在这里数据由较快时钟发出,并由较慢时钟捕获,那么为了避免数据丢失,源数据应该保持至少一个目的时钟周期的稳定状态。可以使用一个简单的FSM来满足这一要求,如能使源数据每三个源时钟改变一次,就不会出现丢数据的问题了。

非整数倍频率的时钟

这种情况指一个时钟的频率是另一个时钟的非整数倍,而且它们有效边沿的相位差是可变的。与前面提到的各时钟之间保持整数倍关系不同,两时钟之间的最小相位差足以使亚稳态产生。至于亚稳态是否真的发生,取决于实际的频率倍数和设计工艺。下面介绍三种不同的情况。
1)在源时钟和目的时钟有效沿之间有足够大的相位差,所以不会有亚稳态产生。
2)源时钟和目的时钟有效沿非常接近,导致产生亚稳态问题。然而,在这里时钟频率倍数关系需要满足以下条件,即一旦有时钟边沿接近出现,下一个时钟周期就会留出足够大的时间冗余,,使得数据的捕获不会出现违背建立时间或保持时间的要求。
3)两个时钟的时钟沿在许多连续的周期中都非常接近。这与异步时钟的行为很相似,但由于这两个时钟的源头相同,所以它们之间的相位差是可以计算出来的。

在数据的传输时,应注意:
1)在数据从慢时钟域到快时钟域时,必须增加逻辑以保证数据在快时钟域中只取样一次,这时就不会出现数据丢失的现象。
2)在数据从快时钟域到慢时钟域时,可能出现数据丢失,为了解决这个问题,必须将源数据保持至少一个目标时钟周期,以保证在两个连续变换的源数据之间至少有一个目标时钟到达。
3)在时钟间相位差异很小的情况,数据需要保持至少两个目的时钟周期。这既适用于从快到慢的传输,也适用于从慢到快的传输。可以通过使用简单的FSM对源数据产生进行控制完成这一任务。但数据不连贯的问题仍然存在。此时,握手和FIFO对于传输数据更为有效,因为它们也解决了数据不连贯的问题。

5.握手信号方法

下图是由两个时钟域分割成的两个单独的系统:

在这里插入图片描述
使用握手信号xack和yreq,系统X将数据发送给系统Y,具体过程如下:
1)发送器系统X将数据放到数据总线上并发出xreq(请求)信号,表示有效数据已经发到接收器系统Y的数据总线上。
2)把xreq信号同步到接收器的时钟域yclk上。
3)接收器在识别xreq同步的信号yreq2后,锁存数据总线上的信号。
4)接收器发出确认信号yack,表示其已经接受了数据。
5)接收器发出的yack信号同步到发送时钟xclk上。
6)发送器在识别同步的xack2的信号后,将下一个数据放到数据总线上。

握手信号序列的时序如下所示:
在这里插入图片描述
从图中可以看出,安全地将一个数据从发送器传输到接收器需要5个时钟周期。

  • 握手信号的要求

数据应该在发送时钟域内稳定至少两个时钟上升沿。
请求信号xreq的宽度应该超过两个上升沿时钟,否则从高速时钟域向低速时钟域传递可能无法捕捉到该信号。

  • 握手信号的缺点

跨时钟域传输单个数据的延迟比使用FIFO传输相同的数据要大得多。

6.使用同步FIFO传输数据

下图是一个同步FIFO的通用架构。一个双端口RAM(DPRAM)用作FIFO的存储器以使读、写可以独立进行。

在这里插入图片描述

通过读、写指针产生各自的读、写地址,送到读、写端口。写指针指向下一个要写入的地址,读指针指向下一个要读取的地址。有效写使能使使得写指针递增,而有效的读使能使得读指针递增。

图中的DPRAM可以同步读取或异步读取。对于同步读操作,应该在数据在FIFO输出端有效前提供明确的读信号;对于异步读操作,DPRAM没有寄存的数据输出;有效数据在写入后即可用(先读数据然后递增指针值)。

同步FIFO判断空满可以使用两种方法:

  • 在写操作使两个指针在下个时钟保持相等时,FIFO满。在读操作使两个指针在下一个时钟保持相等时,FIFO变空。
fifo_full  = (read_pointer == (write_pointer + 1)) AND "write"
fifo_empty = (write_pointer == (read_pointer +1 )) AND "read"
  • 使用计数器来持续指示FIFO中空或满位置的个数。

计数器的宽度要与FIFO的深度相等以使其能记录FIFO中数据的最大个数。计数器在复位时初始化为0,随后的任何写操作会将其递增1,任何读操作会使其递减1。
这种方法虽然简单,但是由于要求增加额外的硬件(比较器),所以效率要低一些。

7.异步FIFO

异步FIFO用来在两个异步时钟域间传输数据。如下:

在这里插入图片描述
1)System X使用xclk将数据写入FIFO,并由System Y使用yclk读出。
2)fifo_full和fifo_empty信号负责对上溢和下溢情况的监控。在fifo_full置起时数据不应写入FIFO,否则会将FIFO内的数据覆盖掉;在fifo_empty置起时不应读取FIFO,否则会读出垃圾数据。
3)与握手信号不同,异步FIFO用于在对性能要求较高的设计中,尤其是时钟延迟比系统资源更为重要的环境中。
4)为了避免亚稳态的产生,应该避免用二进制计数器实现指针,应使用格雷码取代二进制计数。
5)对于FIFO空计算,把写指针同步到读时钟并与读指针进行比较;对于FIFO满计算,把读指针同步到写时钟并与写指针进行比较。
6)当最高有效位不同,而其余位相同时,FIFO为满;当所有位都相同时,FIFO为空。

典型的异步FIFO结构如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值