TA的每日心情 | 开心 2022-1-29 15:03 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
输入、输出的延时 ( 芯片间、 PCB 布线、一些驱动接口元件的延时等 ) 不可测,或者有可能变动的条件下,如何完成数据同步?2 u _. M, C g2 P
* q1 G d3 q( ^/ W" Y) i4 E
对于数据的延迟不可测或变动,就需要建立同步机制,可以用一个同步使能或同步指示信号。另外,使数据通过 RAM 或者 FIFO 的存取,也可以达到数据同步目的。9 V) l0 Y: D' F& V) e
4 x0 }% n+ l, B8 ^6 h! G8 x把数据存放在 RAM 或 FIFO 的方法如下:将上级芯片提供的数据随路时钟作为写信号,将数据写入 RAM 或者 FIFO ,然后使用本级的采样时钟 ( 一般是数据处理的主时钟 ) 将数据读出来即可。这种做法的关键是数据写入 RAM 或者 FIFO 要可靠,如果使用同步 RAM 或者 FIFO ,就要求应该有一个与数据相对延迟关系固定的随路指示信号,这个信号可以是数据的有效指示,也可以是上级模块将数据打出来的时钟。对于慢速数据,也可以采 样异步 RAM 或者 FIFO ,但是不推荐这种做法。# i$ j) r1 w4 |, X) z1 ^
6 m0 s2 L& B/ w8 I
数据是有固定格式安排的,很多重要信息在数据的起始位置,这种情况在通信系统中非常普遍。通讯系统中,很多数据是按照 “ 帧 ” 组织的。而由于整个系统对时钟要求很高,常常专门设计一块时钟板完成高精度时钟的产生与驱动。而数据又是有起始位置的,如何完成数据的同步,并发现数据的 “ 头 ” 呢?
|* H" m* e& j( I' h/ s* W
$ b5 k$ H0 I3 h, e$ Z; C4 f' w, S数据的同步方法完全可以采用上面的方法,采用同步指示信号,或者使用 RAM 、 FIFO 缓存一下。找到数据头的方法有两种,第一种很简单,随路传输一个数据起始位置的指示信号即可,对于有些系统,特别是异步系统,则常常在数据中插入一段同步 码 ( 比如训练序列 ) ,接收端通过状态机检测到同步码后就能发现数据的 “ 头 ” 了,这种做法叫做 “ 盲检测 ” 。
( \( s: Q4 W# B j4 V0 h: l5 Q2 Q' O) j# p
上级数据和本级时钟是异步的,也就是说上级芯片或模块和本级芯片或模块的时钟是异步时钟域的。
! ]. w+ b' d/ T$ R4 W& \. g; |1 d: Z# E6 {, L) O
前面在输入数据同步化中已经简单介绍了一个原则:如果输入数据的节拍和本级芯片的处理时钟同频,可以直接用本级芯片的主时钟对输入数据寄存器采样, 完成输入数据的同步化;如果输入数据和本级芯片的处理时钟是异步的,特别是频率不匹配的时候,则只有用处理时钟对输入数据做两次寄存器采样,才能完成输入 数据的同步化。需要说明的是,用寄存器对异步时钟域的数据进行两次采样,其作用是有效防止亚稳态 ( 数据状态不稳定 ) 的传播,使后级电路处理的数据都是有效电平。但是这种做法并不能保证两级寄存器采样后的数据是正确的电平,这种方式处理一般都会产生一定数量的错误电平数 据。所以仅仅适用于对少量错误不敏感的功能单元。
# X( g: b k; U8 h4 }: h" w1 z& j+ F" z- Q
为了避免异步时钟域产生错误的采样电平,一般使用 RAM 、 FIFO 缓存的方法完成异步时钟域的数据转换。最常用的缓存单元是 DPRAM ,在输入端口使用上级时钟写数据,在输出端口使用本级时钟读数据,这样就非常方便的完成了异步时钟域之间的数据交换。 |
|