1.0 简介
在大规模SoC设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使异步时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。FIFO通常用于安全地将数据从一个时钟域传递到另一个异步时钟域。 使用FIFO将数据从一个时钟域传递到另一时钟域需要多异步时钟设计技术。
异步FIFO是指一种FIFO设计,其中,数据值从一个时钟域写入FIFO缓冲区,数据值从另一个时钟域从同一FIFO缓冲区读取,两个时钟域彼此异步。 异步FIFO用于将数据从一个时钟域安全地传递到另一时钟域。
2.0传递多个异步信号
试图将多个变化的信号从一个时钟域同步到一个新的时钟域,并确保所有变化的信号都同步到新的时钟域中的同一时钟周期已被证明是有问题的。 FIFO在设计中用于将多位数据字从一个时钟域安全地传递到另一个时钟域。
通过一个时钟域中的控制信号将数据字放置到FIFO缓冲存储器阵列中,并通过来自第二时钟域的控制信号将数据字从同一FIFO缓冲存储器阵列的另一个端口中删除。 从概念上讲,使用这些假设设计FIFO的任务似乎很容易。与进行FIFO设计相关的困难与生成FIFO指针以及找到一种可靠的方法来确定FIFO上的满和空状态有关。
2.1同步FIFO指针
对于同步FIFO设计(在同一时钟域中进行FIFO缓冲区的读写操作的FIFO),一种实现方式是对FIFO缓冲区的写入和读取次数进行递增计数(在FIFO上 写入但不读取),减量(在FIFO读取但不写入的情况下)或保持(不进行写入和读取,或同时进行读写操作)FIFO缓冲区的当前填充值。 当FIFO计数器达到预定的满值时,FIFO充满,而当FIFO计数器为零时,FIFO为空。
不幸的是,对于异步FIFO设计,不能使用增减FIFO填充计数器,因为将需要两个不同的异步时钟来控制计数器。 为了确定异步FIFO设计的满状态和空状态,必须比较写指针和读指针。
2.2异步FIFO指针
为了理解FIFO设计,需要了解FIFO指针如何工作。 写指针总是指向下一个要写的字; 因此,在复位时,两个指针都设置为零,这也恰好是下一个要写入的FIFO字位置。 在FIFO写入操作中,写入指针所指向的存储位置,然后将写入指针递增以指向要写入的下一个位置。
同样,读取指针始终指向要读取的当前FIFO字。 再次复位时,两个指针均复位为零,FIFO为空,而读指针指向无效数据(因为FIFO为空且声明了空标志)。 一旦第一个数据字被写入FIFO,写入指针就会递增,清除空标志,并且仍在寻址第一个FIFO存储字内容的读取指针会立即将第一个有效字驱动到FIFO 数据输出端口,由接收器逻辑读取。 读取指针始终指向要读取的下一个FIFO字这一事实意味着,接收器逻辑不必使用两个时钟周期来读取数据字。 如果接收器在读取FIFO数据字之前首先必须递增读取指针,则接收器将计时一次以从FIFO输出数据字,并再次计时以将数据字捕获到接收器中。 那将是不必要的低效。
当读写指针相等时,FIFO为空。 当两个指针在复位操作期间都复位为零时,或者在从FIFO读取了最后一个字的情况下,读指针赶上写指针时,就会发生这种情况。
当指针再次相等时,也就是说,当写指针缠绕并追上读指针时,FIFO已满。 这是个问题。 当指针相等时,FIFO为空或已满,但是指的是哪个?
一种用来区分是满还是空的设计技术是为每个指针添加一个额外的位。 当写指针增加到最终FIFO地址之后,写指针将使未使用的MSB递增,同时将其余位设置回零,如图1所示(FIFO已包装并切换了指针MSB)。 读取指针也是如此。 如果两个指针的MSB不同,则意味着写指针比读指针多缠绕了一次。 如果两个指针的MSB相同,则意味着两个指针的换行次数相同。

使用n位指针,其中(n-1)是访问整个FIFO存储缓冲区所需的地址位数,当两个指针(包括MSB)相等时,FIFO为空。 当两个指针(MSB除外)相等时,FIFO已满。
FIFO设计将n位指针用于具有2^(n-1)个可写位置的FIFO,以帮助处理满full和空empty条件。
2.3二进制FIFO指针的考虑
尝试将二进制计数值从一个时钟域同步到另一个时钟域是有问题的,因为n位计数器的每个位都可以同时更改(示例7-> 8的二进制数为0111-> 1000,所有位均已更改 )。 解决该问题的一种方法是将周期二进制计数值采样并保存在保持寄存器中,然后将同步就绪信号传递到新的时钟域。 识别就绪信号后,接收时钟域将同步的确认信号发送回发送时钟域。 在从接收时钟域接收到确认信号之前,不得更改采样指针。 使用此技术,可以将具有多个更改位的计数值安全地传输到新的时钟域。 收到确认信号后,发送时钟域有权清除就绪信号并重新采样二进制计数值。
使用此技术,将定期采样二进制计数器值,并且并非所有二进制计数器值都可以传递到新的时钟域。
当写指针追上同步和采样的读指针时,FIFO满。
当读指针赶上同步采样的写指针时,FIFO空。
FIFO计数器指针的一种常见方法是使用格雷码计数器。 格雷码在每次时钟转换时只允许改变一位,从而消除了与试图在同一时钟沿同步

本文深入探讨异步FIFO的设计原理与实现细节,重点讲解双时钟域间数据安全传输的关键技术,包括异步FIFO指针机制、满空状态判断及格雷码计数器应用。
最低0.47元/天 解锁文章
1598

被折叠的 条评论
为什么被折叠?



