异步时钟域之间的数据同步
| 分类: FGPA设计思想 |
前言
单bit脉冲标志跨时钟域处理


异步时钟域数据同步(即跨时钟域数据处理)是芯片和FPGA设计中的常见问题,也是设计中的重点和难点。许多设计的不稳定原因都源于异步时钟域数据同步的不稳定。
一、亚稳态
1、什么是亚稳态
异步时钟域数据转换的核心,是要保证下级时钟对上级数据采样的Setup时间和Hold时间。如果触发器的Setup时间或Hold时间不满足,则可能会产生亚稳态,也就是触发器输出Q端在有效时钟沿到达之后比较长的一段时间内将处于不稳定状态,这段时间(决断时间)内Q端将会产生毛刺并不断震荡,最终固定在某一电压值上(此电压值不一定等于原来数据输入端D的值)。经过决断时间后,Q端将稳定在0或1上,但究竟是0还是1,是随机的(逻辑误判),与输入没有必然关系。严重的情况下,亚稳态还可能传到下一级,导致亚稳态传播。
2、如何避免亚稳态
(1)只要系统中有异步元件存在,亚稳态就无法避免。因此,设计电路时首先要减少由于亚稳态引起的错误,其次要使系统对产生的亚稳态不敏感。
使用2级以上寄存器采样可有效降低亚稳态继续传播的概率。原理是,即时第1个触发器的输出端存在亚稳态,经过一个clk周期后,第2个触发器电平仍未稳定的概率很小,因此第2个触发器Q端基本不会产生亚稳态(但无法保证第二级触发器输出稳态电平就是正确电平)。若将同步采样增加到3级触发器,那么亚稳态概率几乎为0。
二、异步时钟域数据同步
异步时钟域数据同步也称为跨时钟域数据处理,指如何在2个时钟不同步的数据域之间进行数据交换。数据时钟域不同步的情况主要有以下2种:
- 两个时钟域的时钟频率相同,但相位差不固定,简称为“同频不同相”;
- 两个时钟域的频率不同,简称“异频”。
1、2种不推荐的异步时钟域同步方法
(1)通过Buffer等组合逻辑延时线调整采样时间
(2)盲目使用时钟正负沿调整数据采样
2、推荐的异步时钟域同步方法
(1)同频异相问题
方法1:
同频异相问题的简单解决方法是,用后级时钟对前级数据采样2次,即通常所说的用寄存器打2拍。这种方法可有效减少亚稳态传播,但不能保证2级寄存器采样后的数据是正确的电平,因此仅适用于对少量错误不敏感的功能单元。
方法2:
可靠的做法是用DPRAM、FIFO或一段寄存器Buf完成一部时钟域的数据转换。对DPRAM、FIFO的使用方法为,将上级芯片提供的数据随路时钟作为DPRAM/FIFO的写信号,将数据写入DPRAM/FIFO。然后使用本级的采样时钟(一般为数据处理的时钟)将数据读出。由于时钟频率相同,DPRAM、FIFO两端的数据吞吐速率一致,因此实现相对简单。
(2)异频问题
异频问题的可靠解决方法为,使用DPRAN或FIFO。实现思路与上面一致,用上级随路时钟写入上级数据,用本级时钟读出数据。但由于时钟频率不同,因此DPRAM/FIFO输入和输出端口的数据吞吐速率不一致,设计时要开好缓冲区,并通过标志信号确保数据流不会溢出。
三、示例:
1、单bit数据信号跨时钟域处理(同频异相/异频)
使用D触发器在目的时钟域(clkB)打2拍的操作进行处理(不能保证2级寄存器采样后的数据是正确的电平,因此仅适用于对少量错误不敏感的功能单元)。
单bit数据信号使用寄存器打2拍进行跨时钟处理
|
2 3 4 5 6 7 8 9 10 11 |
reg
always end assign |
2、单bit脉冲标志信号跨时钟域处理(同频异相/异频)
若跨时钟域信号是一个脉冲标志(采样1次,仅持续1个时钟周期),若信号不经过从源时钟域clkA到目的时钟域clkB的同步处理,很可能出现信号传到目的时钟域丢失或采样多次的问题。同步处理的方法是,将脉冲标志信号转化为level
changes。
|
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
module
) reg always end reg always end reg always end assign assign endmodule |
3、多bit数据信号跨时钟域处理
(1)原理
1)帧结构:
系统带宽5M,信息速率为8Mbps(8Mbit/s),帧结构如下:
时域导频结构如下:

1Frame=10SubFrame,
1SubFrame(1ms)=4Block,
1Block(250us)=4SubBlock(SubBlock0为导频Rs,其他SubBlock为用户Data),
1SubBlock=32点Cp+512点Data。
因此,导频位于每个Block中的第一个OFDM符号位置,由根系数为25、长度为63的ZC序列经前后补零到256点产生,RS1和RS2两部分完全相同。由于每个子帧包含4个Block,因此每个子帧共包含4块导频序列。
2)OFDM系统同步原理:
如上图的OFDM系统基带传输模型中,接收端处理的第一步,是利用接收到的时域数据进行同步过程。项目中利用互相关算法寻找帧头位置完成同步过程。互相关算法求同步点位置的原理为,在接收端本地存有发送的导频序列样本,将接收信号与本地样本序列做滑窗相关,得到的互相关函数的最大值位置即为同步定时点的位置。M-Part互相关同步算法,是将加窗后的本地导频与接收信号都分为M段(M=
2^n为2的倍数)对每段单独进行共轭相乘、相加后再取模,最后将得到的M部分运算结果累加得到总的相关值。实际设计中,M=4,每
M-Part算法的公式为:
其中r(n)为原始基带数据,Su(n)为本地导频序列C(n)为互相关后的值,P(n)为接收功率,X(n)为归一化后的互相关值,X(n)的最大值位置即为帧头位置。
实现时,由于系统帧结构中导频序列长度为512,在相关计算模块每个时钟需要做512次复数乘法运算,在花费较长同步时间的同时,也耗费了更多的硬件资源。因此,在同步前首先对接收到的原始基带I/Q两路时域信号进行4倍下采样处理,因此相关器滑动窗口的大小为128。根据M-Part算法公式,需将128点分为4段每段32点,4段数据同时进行相关计算和求功率,4段相关计算得到的数据总和与4段数据求得的功率总和相除得到定时度量函数值,之后进入峰值判定模块,当判定成功时输出同步成功标志。
3)互相关函数实现
设计中互相关函数实现的过程涉及3个时钟域,是跨时钟域处理的典型应用。

- 基础时钟速率为8.704MHz,下采样后的数据速率为2.176MBps,因此向输入缓存区写入2.176MBps数据的时钟速率为2.176MHz。
- 每向输入缓冲区写入1个数据,读空所有缓冲区一次,因此读缓冲区的时钟为32*2.176MHz。同理,读rom时钟速率与读输入缓冲区速率相同为32*2.176MHz。
- 每从输入缓冲区读出一个数据计算一次复数乘法,假设,mul乘法器需要2clk输出结果,加法器需要1个时钟。复数乘法:(Q1+jI1)(Q2+jI2)=Q1*Q2+j(Q1*I2+Q2*I1)-I1*I2=(Q1*Q2-I1*I2)+j(Q1*I2+Q2*I1),也就是做一次复数乘法需要四个乘法器和三个加法器。采用四个乘法器并行计算,三个加法操作在一个时钟周期内完成。因此,做一次复数乘法需要4clk,因此复数乘法单元工作时钟为2.176*32*4MHz;
因此,相关运算模块内部分为三个时钟域:Clk_1to4basic(1/4倍的基础时钟)、Clk_8basic(8倍基础时钟)、Clk_32basic(32倍基础时钟)。输入缓存区和4个本地ROM共用一个模32的地址发生器进行寻址。由于模块每进入一点2.176MBps的数据,输入缓冲区数据整体向下移动1个part(32点)的长度,地址发生器需自增32次,即读空每个32点的part和四个本地ROM一次;从每个part读出1点数据复数乘法器需要完成一次运算。由于1/4倍原始基带速率为2.176MBps,因此向输入缓冲区写入数据的时钟应为Clk_1to4basic,从输入缓冲区/本地ROM读出数据的时钟为Clk_8basic,复数乘法器的工作时钟为Clk_32basic。
Clk_1to4basic与Clk_8basic、Clk_8basic与Clk_32basic时钟域之间的数据交互,都是通过输入缓存/ROM隔开的(用一种速率的时钟将数据写入缓存器,用另一种速率的时钟将数据读出缓存器,达到跨时钟域数据处理的目的),避免了亚稳态现象的出现。
后一篇:时序逻辑分析

加载中…