尝试在硬件环境中理解 FIFO

电器工程 先进先出
2022-01-18 21:22:10

维基百科将电子产品中的 FIFO定义如下:

FIFO 通常用于电子电路中,用于从硬件到软件的缓冲和流量控制。在其硬件形式中,FIFO 主要由一组读写指针、存储和控制逻辑组成。

我在硬件中了解什么是存储,什么是控制逻辑。但是在这个定义中,我不明白read and write pointers
这只是一种Program Counter吗?

3个回答

FIFO 是先进先出存储器。您可以认为数据在一端移出,另一端移出,FIFO 中的数据量被允许增长到某个最大限制。

然而,实际上在内存中移动数据在硬件中的成本很高。更好的方法是更正常地使用内存,但通过操作要写入和读取的下一个地址使其看起来像一个循环缓冲区。这些地址位于不同的寄存器中,通常称为读指针写指针

下面是使用 8 字存储器的简单 FIFO 的状态说明:

下一个输入字将写入地址 1 处的空字(写指针的值),然后写指针递增到 2。下一个读请求将取 5 处的字(读指针的值),然后读指针加 1。在本例中,如果指针为 3 位宽,则地址自动循环。在 3 位无符号数学中将 1 添加到 7 会产生 0。

完整的 FIFO 系统需要识别满和空状态的方法。为此有各种方案。可以使用一个单独的寄存器来跟踪 FIFO 中有多少字,在上面显示的快照中为 4。

固件实现的一个有用方案是比较读取和写入指针。例如,您可以确定两个指针相等为 FIFO 空,而在读取后写入一个(包装后)为 FIFO 满。请注意,此类方案将保留 FIFO 的一个字未使用。您最终会在某处花费一个状态以允许检测满和空,无论是单独的寄存器还是 FIFO 中的不可用字。这种方案的优点是读取和写入可以独立发生而不会发生冲突,因此这样的 FIFO 在读取和写入之间不需要互斥体。例如,您不必在读取时禁用中断,因为如果在前台代码尝试读取时中断例程将一个字推送到 FIFO,则不会造成任何损害。

奥林的回答完全涵盖了它。

我只想补充一点,在数字硬件中,经常使用 FIFO 在异步时钟域(时钟域交叉- CDC)之间传输多位数据。您现在可能对这个主题不感兴趣(它是一种高级主题),但我认为为了完整起见应该涵盖它。

这些特殊的 FIFO 被称为异步(async)FIFO,虽然它们在结构上与基本 FIFO 相似,但有两个关键的补充:

  • 读/写指针在异步时钟域之间传输之前转换为格雷码
  • 转换后的值使用同步器同步到目标域的时钟

该方案可确保传输多位数据而不会出现亚稳态问题,并避免由于位的独立同步而导致数据损坏。

async FIFO的逻辑结构: 在此处输入图像描述

程序计数器跟踪程序中执行的最后一条指令。在 FIFO 中,读取和写入指针跟踪最后读取或写入的最后一位或字节。因此,它们是相似的概念,但用于不同的事物。

如果去掉行话,这个概念就不那么难了。如果有人给了你一长串数字并要求你按顺序阅读,你可能会将手指放在页面上以帮助跟踪你的位置。你的手指是一个读计数器。