跨越鸿沟:同步世界中的异步信号
时间:08-21
来源:Mike Stein,Paradigm Works
点击:
,一种数据路径同步器设计使用一个保持寄存器和握手信令。
在这种设计中,传输电路将数据(信号总线)存储在保持寄存器,同时发出请求信号。这两个动作可以同时发生,因为请求信号至少要花一个时钟周期才能让接收电路检测到它(最小的握手-同步延迟)。当接收电路采样到数据(信号总线)时,它发出一个响应信号。这种设计使用了全握手方法,所以要花较长时间才能完成整个传输。对接收电路而言,使用全握手信号的设计有较大的时间窗口用于对信号总线采样,因而效率较低。如用部分握手方法代替全握手方法则可以加快传输速度。
用这种总线同步方式,你可以同步握手信号,但不能同步信号总线。信号总线来自于保持寄存器,它在接收电路采样前一直保持稳定。注意,如果传输电路向接收电路提交数据太快以致来不及处理,则应用中的总线同步可能不起作用。
高级数据路径设计
在许多情况下,数据在跨越时钟域时需要"堆积"起来,因此使用单个保持寄存器无法完成工作。例如一种情况是某个传输电路猝发式发送数据,接收电路来不及采样。另一种情况是接收电路采样速度超出传输电路发送数据的速度,但采样的数据宽度不够。这些情况就要使用 FIFO 了。
基本上,设计者使用 FIFO 有两个目的:速度匹配或数据宽度匹配。在速度匹配时,FIFO 较快的端口处理猝发的数据传输,而较慢的端口则维持恒定的数据流。但是,虽然访问方式和速度不同,但进出 FIFO 的平均数据速率必须是相同的,否则 FIFO 就会出现上溢(over flow)或下溢(underflow)问题。与单寄存器设计相同,FIFO 将数据保存在寄存器或存储器中,同时同步状态信号,判断何时可以把数据写入 FIFO 或从 FIFO 中读出。
在速度匹配应用中,每个端口(读或写)的时钟不同。FIFO 中的寄存器使用写端口时钟,就像保持寄存器使用电路时钟来改变寄存器内容一样。信号同步发生在指针逻辑中,而且比握手信号要复杂得多。
现在指针逻辑的设计有多种方法。第一种方法是将读、写选通进行同步,同时在各个时钟域使用计数器来跟踪 FIFO 中可用的项。计数器反映出可用于读写的 FIFO 项目号,计数器也与相应的端口同步。读计数器跟踪包含有效数据的项数,而写计数器则跟踪可以存储数据的项数。当对指针逻辑进行复位时,由于没有数据可读,读计数器从零起始。写计数器则从 FIFO 中项的总数开始计数,即所有项均可用来存储数据。
读选通信号累减读计数器,并与写时钟域同步,因为它同时也累加写计数器。写选通信号则累减写计数器,并与读时钟域同步,因为它同时也累加读计数器。
这种设计需要单时钟宽度脉冲以及用于读、写选通的脉冲同步器,因为当一个电平信号从一个时钟域跨越到另一个更快的时钟域时,在较快时钟域中它能在更多的时钟周期中保持有效。由于只要读或写信号是有效的,每个计数器就会发生变化,因此较快的时钟域就检测到更多的读、写,超出较慢时钟域实际发生的数量。脉冲同步器可以将一个时钟域的时钟宽度脉冲转换为新时钟域的时钟宽度脉冲,每个脉冲都表示一次 FIFO 的读或写。
这种 FIFO 状态技术对读、写状态都不太有利。当 FIFO 中所有项均充满时,写端口状态指示为满,并在读选通触发后继续指示 FIFO 满,因为同步过程会使选通信号延迟送给写计数器。读端口为空时也会出现这种情况,因为同步过程会使写选通信号延迟到达读计数器。
这种设计的另一种考虑是及时检测全满/全空状态。如果 FIFO 还有一项可用,并且有写选通触发,则 FIFO 必须立即置为全满状态。这样才能提前一个时钟给出全满标志,使 FIFO 有足够时间防止下一个数据写入而产生溢出。对 FIFO 的读端口也是这样。这种情况下,如果 FIFO 里只有一个数,并且有读选通触发,则必须置全空状态,以给读电路足够的时间防止读空 FIFO。
这种指针逻辑限制电路在每个时钟周期中访问 FIFO,即使在慢速时钟域中也是这样。这一功能的优点在于访问 FIFO 的电路至少有一个时钟周期来评估 FIFO 的状态。FIFO 可以将所有项都填满数据,而不会出现数据被覆盖或全空无数据可读的情况。这种设计的另一个优点是每一端都可以读其相应的计数器,来判断 FIFO 中还有多少项可用。设计者可以将这种 FIFO设计用在进行多次数据读/写的电路中,而不会造成上溢或下溢的情况。
这种设计的不足之处是由计数器来判断状态,而不是直接比较读、写指针。对大型 FIFO 来说,这些计数器也很大。而且,由于使用脉冲同步时,来自较快时钟域的读、写脉冲在较慢时钟域的脉冲间至少必须有两个时钟周期,因此平均数据速率为最低时钟频率的一半。解决这些问题的一种方法是采用直接指针比较法。
在这种 FIFO 设计中,读、写指针的比较决定了 FIFO 的状态。异步设计中的指针比较更富有挑战性,因为每个指针位于不同的时钟域中,对信号总线的同步要求在同步握手信号期间总线不发生改变。将这种技术用于指针同步的 FIFO 设计可能会很慢。要解决这个问题,FIFO 指针逻辑使用了格雷码,代替指针使用的二进制码。
格雷码在每一次计数增减时只改变其中的一位(表 3)。你可以在格雷码总线上使用同步器,因为每一次总线改变时只有一根信号线有变化,于是就消除了格雷码总线各位通过不同同步器时的竞争情况。这种设计的指针为格雷码计数器。使用二进制指针时需要将其变换成格雷码后的同步指针,而使用变换逻辑会违反对同步信号的限制,即同步的信号在跨越时钟域前要来自触发器。
|
|
|
|
|
|
|
|