FIFO原理讲解

合集下载

fifo先进先出原理

fifo先进先出原理

fifo先进先出原理先进先出(First-In-First-Out, FIFO)是一种常见的数据存储和处理方式,它遵循一个简单的原则:最先进入的数据最先被处理或取出。

FIFO原理在计算机科学和电子工程中被广泛应用,一些典型的应用包括缓冲区、队列、调度算法和存储器管理。

接下来,我将详细介绍FIFO原理及其应用。

FIFO原理从字面上可以理解为“先进先出”,类似于队列理论中的排队模型。

假设有一条串行数据流,数据按照顺序进入一个容器或缓冲区,并按照相同的顺序离开。

数据可以是任何形式的,例如数字、字节、字符或者数据包。

FIFO原理的关键在于数据存储和处理的顺序。

当新的数据到达时,它被添加到容器的末尾,而最早到达的数据则从容器的开头被移除。

这就确保了每个数据项都遵循了“先进先出”的原则。

换句话说,数据在容器中被处理的顺序与它们进入容器的顺序相同。

FIFO原理可以通过一个简单的例子来理解。

考虑一个咖啡馆的咖啡杯架,顾客来到咖啡馆后,他们在杯架上取一只空杯子,并在架子的尽头放上一只新的满杯子。

当员工准备好制作咖啡时,他们会从杯架的一侧取出第一只空杯子,制作咖啡并交给顾客。

这样就确保了每个顾客依次得到自己的咖啡,遵循了先进先出的原则。

FIFO原理在计算机科学和电子工程中有广泛的应用。

其中一个典型的应用是队列。

队列是一种线性数据结构,它允许在一端(尾端)插入数据,而在另一端(头端)删除数据。

数据项通过队列“排队”进入和离开。

队列的操作包括入队(enqueue)和出队(dequeue)。

入队操作在队列的尾部插入数据项,而出队操作则移除队列的头部数据项。

队列的操作遵循FIFO原则,因此最早进入队列的数据项将最先出队。

队列的应用非常广泛,其中一个重要的应用是操作系统中的进程调度。

在多道程序设计环境中,操作系统需要决定执行哪个进程。

调度算法选择队列中的第一个进程,并分配处理器时间给它。

然后,该进程完成后,它会被移出队列,而下一个进程则成为新的队列头部。

d触发器实现fifo电路

d触发器实现fifo电路

d触发器实现fifo电路D触发器实现FIFO电路FIFO(First In First Out)缓冲器是一种常用的电路用来控制数据传输中的流速。

它可以实现从输入端按输入的顺序向输出端发送数据,而不管在传送过程中发生的技术性变化。

本文主要介绍使用D 触发器实现FIFO电路的基本原理及其实现方法。

一、 D触发器实现FIFO电路的原理D触发器实现FIFO电路的基本原理是,当输入端输入的数据被写入时,D触发器会触发一个信号,这个信号会触发在FIFO缓冲器中一组内存单元,从而将输入的数据分配到一个合适的地址,并保存在FIFO缓冲器中。

当输出端读取数据时,信号会触发FIFO缓冲器中的一组内存单元,从而取出相应的数据,并发送到输出端。

二、 D触发器实现FIFO电路的实施方法1、硬件实现硬件实现D触发器实现FIFO电路的方法是,使用D触发器作为检测信号的输入端,将信号输入到FIFO缓冲器中,由FIFO缓冲器来完成相应的读写功能。

2、软件实现软件实现D触发器实现FIFO电路的方法是,利用软件语言(如C,C++等)编写程序来模拟D触发器的功能,即在指定条件下触发信号,然后将信号输入到FIFO缓冲器中,从而完成读写的功能。

三、D触发器实现FIFO电路的优缺点D触发器实现的FIFO电路具有以下优点:(1)高效灵活:D触发器可以快速、准确地检测信号,从而实现快速的数据读写。

(2)结构简单:D触发器实现FIFO电路的结构简单,可以有效减少电路中的电容积和其他不必要的元件,从而降低成本。

(3)可编程:使用D触发器实现FIFO电路时,可以通过编写程序来调整信号的触发条件,从而实现不同的功能。

D触发器实现FIFO电路也有一些缺点,这些缺点包括:(1)需要额外的控制:使用D触发器实现FIFO电路时,需要额外的控制电路来控制D触发器的触发,这增加了电路的复杂度和供电要求。

(2)效率低:使用D触发器实现FIFO电路时,每次只能处理一个数据,从而降低了数据处理的效率。

异步fifo的工作原理

异步fifo的工作原理

异步fifo的工作原理今天咱们来唠唠异步FIFO这个超有趣的东西哦。

你可以把异步FIFO想象成一个特别的小仓库,这个小仓库是用来存放数据的呢。

不过它可有点特别,和咱们平常那种规规矩矩同步的仓库不太一样。

异步FIFO主要是在不同时钟域之间工作的。

就好比啊,有两个世界,一个世界的节奏快,另一个世界的节奏慢,异步FIFO就在这两个节奏不一样的世界之间搭起了一座数据的桥梁。

那它怎么存数据呢?当有数据要进来的时候,就像是有人要往这个小仓库里送货。

在写端口这边,有一个写指针,这个写指针就像一个小向导,它告诉大家数据应该放在仓库的哪个位置。

每次有新的数据要存进来,写指针就会指向下一个空闲的地方。

就像我们在图书馆书架上找空位放书一样,写指针就是那个帮我们找空位的小助手。

再说说读这边吧。

读端口有个读指针,这个读指针就负责从仓库里取数据。

它就像一个小管家,知道哪些数据已经被取走了,哪些还在仓库里等着被取。

读指针也是一步一步地移动,每次取走一个数据,就会指向下一个要取的数据的位置。

这里面有个超关键的东西,就是空满标志的判断。

你想啊,如果仓库满了,还往里塞东西,那不就乱套了嘛;或者仓库都空了,还在傻乎乎地去取数据,那也不行呀。

对于空满标志的判断呢,其实有点小巧妙。

因为是异步的,时钟不一样,所以不能简单地用一个计数器来判断。

一般会采用一些特殊的编码方式,像是格雷码。

为啥用格雷码呢?这就像是给这个小仓库的货物管理上了一道保险。

格雷码的好处就是相邻的码值只有一位不同。

这样在不同时钟域转换的时候,就不容易出错啦。

比如说,写指针和读指针在判断满的时候,不是简单地看数字大小哦。

因为时钟不一样,数字可能会乱套。

用格雷码就不一样啦,它能很准确地判断出是不是真的满了。

就好像是两个人在不同的节奏下数数,但是通过一种特殊的规则,能准确知道什么时候仓库满了。

还有哦,异步FIFO的深度也是个很重要的概念。

深度就像是这个小仓库的大小。

如果数据来的太快,而读的速度又跟不上,那仓库就得大一点,不然就容易满了溢出来。

fifo通信原理

fifo通信原理

fifo通信原理标题:FIFO通信原理引言:FIFO通信(First In, First Out)是一种基于队列的通信机制,它遵循先进先出的原则,确保数据按照发送的顺序被接收。

本文将详细介绍FIFO通信原理。

一、FIFO通信的概念FIFO通信是一种在计算机系统中常见的通信方式,它模拟了现实世界中的排队现象,即先来的任务先执行,后来的任务后执行。

在FIFO通信中,数据按照发送的顺序进入队列,接收方按照相同的顺序取出数据进行处理。

二、FIFO通信的实现原理1. 队列数据结构FIFO通信的核心是队列数据结构。

队列是一种线性数据结构,有两个端点,分别称为队头和队尾。

数据从队尾进入队列,从队头出队。

队列可以用数组或链表实现。

2. 发送方工作原理发送方将数据按照先后顺序写入队列的队尾。

当有新的数据到达时,会被追加到队列中,此时队列的长度会增加。

发送方可以通过检查队列的长度来判断队列是否已满,如果队列已满,则需要等待,直到有空闲位置。

3. 接收方工作原理接收方从队头读取数据,并进行处理。

当接收方读取了队头的数据后,队列中的数据会向前移动一位,队列的长度减少。

接收方可以通过检查队列的长度来判断队列是否为空,如果队列为空,则需要等待,直到有新的数据到达。

三、FIFO通信的优点1. 顺序性:FIFO通信确保数据按照发送的顺序被接收,保证了数据的顺序性,避免了数据错乱或丢失的问题。

2. 公平性:FIFO通信遵循先进先出的原则,保证了任务的公平性,每个任务都有机会被及时执行。

3. 简单高效:FIFO通信的实现相对简单,不需要复杂的同步机制,能够高效地完成任务。

四、FIFO通信的应用场景1. 进程间通信:在操作系统中,多个进程之间需要进行数据的传递和共享,FIFO通信可以很好地实现进程间的通信。

2. 网络通信:在网络通信中,FIFO通信可以用于实现数据包的发送和接收,保证数据的顺序性。

3. 队列调度:在任务调度中,FIFO通信可以用于实现任务的排队和执行,保证任务按照顺序被执行。

FIFO原理讲解

FIFO原理讲解

FIFO原理讲解FIFO(First In, First Out)原理是一种常用于队列中的管理方法。

它的基本原理是,最早进入队列的元素将首先被处理,而最后进入队列的元素将被放在队列的末尾,等待处理。

首先,我们来看一下FIFO原理在计算机领域中的应用。

在操作系统中,FIFO原理用于处理进程调度。

当多个进程同时竞争CPU资源时,操作系统会根据FIFO原则来决定哪个进程应该被先执行。

根据进程的到达时间,最早到达的进程将被首先执行,而后到达的进程将排在后面等待。

在存储器管理中,操作系统使用FIFO原理来处理页面置换。

当系统中的物理内存不足以容纳所有需要执行的程序时,操作系统会选择一个页面将其从内存中移出,以便为新的页面腾出空间。

根据FIFO原则,最早进入内存的页面将首先被选择作为替换对象,以此来保证每个页面都能有机会在内存中执行。

此外,在网络传输中,FIFO原则可以用于管理网络队列中的数据包。

在路由器或交换机中,当多个数据包同时竞争共享的链路带宽时,根据FIFO原则,最早到达的数据包将首先被发送出去,而后到达的数据包将排在后面等待发送。

在物流和仓储管理中,FIFO原则是一种常用的库存管理方法。

根据FIFO原则,最早进入仓库的产品将首先被取出和销售,而后进入仓库的产品将排在后面等待处理。

这种方法可以确保存储时间较长的产品优先被销售,减少了产品的过期和损耗。

在供应链管理中,FIFO原则也非常重要。

根据FIFO原则,供应链上的产品应该按照顺序从供应商到经销商再到零售商,以确保产品的新鲜度和品质。

总结来说,FIFO原则是一种常用的管理方法,它以“先进先出”的原则来保证任务、数据、货物等的有序处理。

在计算机科学、运输、库存管理等领域中,FIFO原则被广泛应用,可以提高系统的效率和性能。

无论是在操作系统中的进程调度,还是在物流中的库存管理,FIFO原则都发挥着重要的作用,为各行各业提供了有效的管理策略。

FIFO详解

FIFO详解

FIFO详解深⼊理解FIFO(包含有FIFO深度的解释)FIFO:⼀、先⼊先出队列(First Input First Output,FIFO)这是⼀种传统的按序执⾏⽅法,先进⼊的指令先完成并引退,跟着才执⾏第⼆条指令。

1.什么是FIFO?FIFO是英⽂First In First Out 的缩写,是⼀种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使⽤起来⾮常简单,但缺点就是只能顺序写⼊数据,顺序的读出数据,其数据地址由内部读写指针⾃动加1完成,不能像普通存储器那样可以由地址线决定读取或写⼊某个指定的地址。

2.什么情况下⽤FIFO?FIFO⼀般⽤于不同时钟域之间的数据传输,⽐如FIFO的⼀端时AD数据采集,另⼀端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,⽽PCI总线的速度为33MHz,总线宽度32bit,其最⼤传输速率为1056Mbps,在两个不同的时钟域间就可以采⽤FIFO来作为数据缓冲。

另外对于不同宽度的数据接⼝也可以⽤FIFO,例如单⽚机位8位数据输出,⽽DSP可能是16位数据输⼊,在单⽚机与DSP连接时就可以使⽤FIFO来达到数据匹配的⽬的。

3.FIFO的⼀些重要参数FIFO的宽度:也就是英⽂资料⾥常看到的THE WIDTH,它只的是FIFO⼀次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单⽚成品IC中是固定的,也有可选择的,如果⽤FPGA⾃⼰实现⼀个FIFO,其数据位,也就是宽度是可以⾃⼰定义的。

FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。

如⼀个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可⼤可⼩,个⼈认为FIFO深度的计算并⽆⼀个固定的公式。

异步fifo原理

异步fifo原理异步FIFO原理解析什么是异步FIFO异步FIFO是一种用于数据接收和发送的电子元件,它按照先入先出(FIFO)的原则处理数据。

它被广泛应用于数字电子系统中的数据缓冲、通信和存储等领域。

异步FIFO的原理异步信号与同步信号的区别1.同步信号:数据的传输采用同一个时钟信号驱动,数据的采样和传输是在时钟的上升沿或下降沿进行的。

2.异步信号:数据的传输不依赖于单一的时钟信号,发出数据的一方和接收数据的一方的时钟信号不一定完全一致。

异步FIFO的工作原理异步FIFO是由两个独立的存储器组成,一个作为数据的写入端,另一个作为数据的读取端。

它们通过一系列的控制信号来实现数据的缓冲和传输。

1.当数据写入FIFO时,写指针会自动递增,将数据写入写指针所指向的位置。

2.当数据读取FIFO时,读指针会自动递增,读取指针所指向的数据,并将其传递给外部。

异步FIFO的数据同步由于不同的时钟信号可能有不同的频率和相位,所以在数据传输过程中,可能会出现时钟抖动或者抖动,导致数据读取错误。

因此,为了保证数据的可靠传输,异步FIFO使用了数据同步机制。

1.FIFO的写指针和读指针都需要采用相关的同步电路,使其与本地时钟信号同步。

2.读指针必须等待写指针来自写入端的下一个时钟周期,并且读指针的启动信号必须与读指针同一时钟周期内变化。

异步FIFO的关键问题异步FIFO在使用过程中,需要注意一些关键问题,以确保数据的正确传输。

数据宽度不兼容在异步FIFO中,写入端和读取端的数据宽度不一定相同。

为了解决这个问题,需要使用数据宽度转换电路,将数据进行格式转换。

读写速度不匹配在数据写入和读取的过程中,写入端和读取端的速度可能不一致。

为了解决这个问题,一种常见的解决方案是使用FIFO深度控制电路,来控制数据的写入和读取速度。

异步FIFO的应用场景异步FIFO主要用于数据缓冲、数据通信以及存储系统等领域。

它在数字电子系统中起到了缓冲数据、数据传输和数据存储的重要作用。

fifo通信原理

fifo通信原理FIFO(先进先出)通信是一种常见的数据传输方式,特别在计算机系统中广泛应用。

它是指数据按照先进先出的原则进行传输和处理。

在FIFO通信中,数据进入一个队列,然后按照进入顺序一个一个被处理。

FIFO通信原理基于队列的操作。

队列是一种线性数据结构,具有先进先出(First-In-First-Out,FIFO)的特性。

它可以通过两个指针来标识队列的头和尾,数据从队列的尾部进入,从队列的头部离开。

当一个元素进入队列时,它被添加到队列的尾部;当一个元素离开队列时,它是从队列的头部被移除。

在计算机系统中,FIFO通常用于连接不同的模块或进程之间的数据传输。

这种通信方式可以保证数据按照发送顺序到达接收端,避免数据乱序问题。

下面是FIFO通信的一般原理:1.发送端将数据写入到FIFO缓冲区中:-发送端将数据写入一个特定的FIFO缓冲区。

-如果缓冲区已满,发送端将被阻塞等待,直到有空闲位置。

2.接收端从FIFO缓冲区中读取数据:-接收端从FIFO缓冲区的头部读取数据。

-如果缓冲区为空,接收端将被阻塞等待,直到有数据可读取。

3.数据的传输和处理:-接收端从FIFO缓冲区读取的数据可以被进一步处理,比如存储到内存或者传递给其他模块。

-发送端可以继续写入更多的数据到FIFO缓冲区。

FIFO通信的原理可以按照以下步骤进行具体实现:1.创建一个FIFO缓冲区,用于存储数据。

在操作系统中,FIFO可以通过使用管道或者消息队列来实现。

2. 发送端将数据写入FIFO缓冲区。

这可以通过调用系统API函数,如write(或者send(来完成。

如果缓冲区已满,发送端将被阻塞等待,直到有空闲位置。

3. 接收端从FIFO缓冲区读取数据。

这可以通过调用系统API函数,如read(或者recv(来完成。

如果缓冲区为空,接收端将被阻塞等待,直到有数据可读取。

4.接收端可以对读取到的数据进行进一步处理,如存储到内存或者传递给其他模块。

最经典的FIFO原理

最经典的FIFO原理FIFO(First-In-First-Out)原则是一种常用的队列调度算法,它遵循先进先出的原则。

也就是说,先进入队列的任务将首先被处理,后进入队列的任务将被推迟处理。

FIFO原则适用于各种情况,包括操作系统中的进程调度、存储器管理,以及网络传输中的数据包排队等。

FIFO原则的基本思想是使用一个队列来存储任务。

当一个任务到达时,它被放置在队列的末尾。

而当一个任务被处理完成后,它将从队列的头部被移除,以便下一个任务可以被处理。

这样,队列中任务的顺序始终保持不变,就会按照先进先出的原则进行处理。

FIFO原则的一个典型应用是在操作系统中的进程调度。

当多个进程同时请求处理器时间时,操作系统需要决定哪个进程将被执行。

FIFO原则可以被用来解决这个问题。

每当一个进程请求处理器时间时,它将被放置在一个就绪队列中。

当当前运行的进程完成后,下一个任务将从队列的头部被选出并执行。

这样,就保证了进程按照到达时间的顺序进行调度。

另一个领域是存储器管理。

在计算机系统中,存储器是有限的资源,多个进程需要共享它。

当存储器快满时,系统需要选择哪个进程的数据从存储器中移除,以便为新的数据腾出空间。

FIFO原则可以被用来确定哪个进程将被置换出存储器。

根据先进先出原则,最早进入存储器的进程将优先被置换出去,为新的进程腾出空间。

此外,FIFO原则还经常在网络传输中的数据包排队中使用。

当多个数据包需要通过网络传输时,它们必须按照其中一种顺序排队等待传输。

FIFO原则可以被用来确定数据包的传输顺序。

每当一个数据包到达时,它将被放置在队列的末尾。

而当一个数据包完成传输后,下一个数据包将从队列的头部被选取。

这样,数据包的传输顺序将按照到达顺序进行处理。

FIFO原则有几个重要的特点。

首先,它非常简单且容易实现。

由于任务的处理顺序始终保持不变,无需进行复杂的调度算法。

其次,FIFO原则保证了公平性。

先到达的任务将被优先处理,不会因为其他任务的插入而改变顺序。

同步fifo电路讲解

同步fifo电路讲解
同步FIFO(First-In-First-Out)电路是一种先进先出的数据交互方式,常用于数字ASIC设计中的数据缓冲。

同步FIFO的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑。

同步FIFO电路通常由三部分组成:
1. FIFO写控制逻辑:主要功能是产生FIFO写地址、写有效信号,同时产生FIFO写满、写错等状态信号。

2. FIFO读控制逻辑:主要功能是产生FIFO读地址、读有效信号,同时产生FIFO读空、读错等状态信号。

3. FIFO存储实体(如Memory、Reg):用于存储数据。

在同步FIFO中,数据按照先进先出的原则进行读写,即先写入的数据会被先读出。

FIFO的读写操作都由同一时钟驱动,保证了数据的一致性和可靠性。

以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询专业电子工程师。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异 步 FIFO 结 构(第一部分)作者:Vijay A.Nebhrajani翻译:Adam Luo2006年7月设计一个FIFO是ASIC设计者遇到的最普遍的问题之一。

本文着重介绍怎样设计FIFO——这是一个看似简单却很复杂的任务。

一开始,要注意,FIFO通常用于时钟域的过渡,是双时钟设计。

换句话说,设计工程要处理(work off)两个时钟,因此在大多数情况下,FIFO工作于独立的两个时钟之间。

然而,我们不从这样的结构开始介绍—我们将从工作在单时钟的一个FIFO特例开始。

虽然工作在同一时钟的FIFO在实际应用中很少用到,但它为更多的复杂设计搭建一个平台,这是非常有用的。

然后再从特例推广到更为普通的FIFO,该系列文章包括以下内容:1.单时钟结构2.双时钟结构——双钟结构13.双时钟结构——双钟结构24.双时钟结构——双钟结构35.脉冲模式FIFO单时钟FIFO特例FIFO有很多种结构,包括波浪型(ripple)FIFO,移位寄存器型以及其他一些我们并不关心的结构类型。

我们将集中讨论包含RAM存储器的结构类型。

其结构如图1所示。

通过分析,我们看到图中有一个具有独立的读端口和独立的写端口的RAM 存储器。

这样选择是为了分析方便。

如果是一个单端口的存储器,还应包含一个仲裁器保证同一时刻只能进行一项操作(读或写),我们选择双口RAM(无需真正的双口RAM,因为我们只是希望有一个简单的相互独立的读写端口)是因为这些实例非常接近实际情况。

读、写端口拥有又两个计数器产生的宽度为log2(array_size)的互相独立的读、写地址。

数据宽度是一个非常重要的参数将在在稍后的结构选择时予以介绍,而现在我们不必过分的关心它。

为了一致,我们称这些计数器为“读指针”(read pointer)和“写指针”(write pointer)。

写指针指向下一个将要写入的位置,读指针指向下一个将要读取的位置。

每次写操作使写指针加1,读操作使读指针加1。

我们看到最下面的模块为“状态”(stauts) 模块。

这个模块的任务实给FIFO 提供“空”(empty)和“满”(full)信号。

这些信号告诉外部电路FIFO已经达到了临界条件:如果出现“满”信号,那么FIFO为写操作的临界状态,如果出现“空”信号,则FIFO为读操作的临界状态。

写操作的临界状态(“full is active”)表示FIFO已经没有空间来存储更多的数据,读操作的临界表示FIFO没有更多的数据可以读出。

status模块还可告诉FIFO中“满”或“空”位置的数值。

这是由指针的算术运算来完成了。

实际的“满”或“空”位置计算并不是为FIFO自身提供的。

它是作为一个报告机构给外部电路用的。

但是,“满”和“空”信号在FIFO中却扮演着非常重要的角色,它为了能实现读与写操作各自的独立运行而阻塞性的管理数据的存取。

这种阻塞性管理的重要性不是将数据复写(或重读),而是指针位置可以控制整个FIFO,并且使读、写操作改变着指针数值。

如果我们不阻止指针在临界状态下改变状态,FIFO还能都一边“吃”着数据一边“产生”数据,这简直是不可能的。

进一步分析:DPRAM若能够寄存读出的信号,这意味着存储器的输出数据已被寄存。

如果这样的话,读指针将不得不设计成“read 并加1 ”,也就是说在FIFO输出数据有效之前,必须提供一个明确的读信号。

另一方面,如果DPRAM 没有寄存输出,一旦写入有效数据就可以读出;先读数据,然后使指针加1。

这将影响到从FIFO读出数据和实现空/满计算的逻辑。

由于简化的缘故,我们仅论述DPRAM没有提供索锁存输出的情况。

同理,将其推广到寄存输出的DPRAM 并不是很复杂。

从功能上看,FIFO工作原理如下所述:复位时,读、写指针均为0。

这是FIFO的空状态,空标志为高电平,(我们用高电平表示空标志)此时满标志为低电平。

当FIFO出现空标志时,不允许读操作,只能允许写操作。

写操作写入到位置0,并使写指针加1。

此时,空标志变为低电平。

假设没有发生读操作而且随后的一段时间FIFO中只有写操作。

一定时间后,写指针的值等于array_size-1。

这就意味着在存储器中,要写入数据的最后一个位置就是下一个位置。

在这种情况下,写操作将写指针变为0,并将输出满标志。

注意,在这种情况下,写指针和读指针是相等的,但是FIFO已满,而不是空。

这意味着“满”或“空”的决定并不是仅仅基于指针的值,而是基于引起指针值相等的操作。

如果指针值相等的原因是复位或者读操作,FIFO认为是空;如果原因是写操作,那么FIFO认为是满。

现在,假设我们开始一系列的读操作,每次读操作都将增加读指针的值,直到读指针的位置等于array_size-1。

在该点,从这个位置读出的FIFO输出总线上的数据是有效的。

随后的逻辑读取这些数据并提供一个读信号(在一个时钟周期内有效)。

这将导致读指针再次等于写指针(在两个指针走完存储器一圈后)。

然而,由于这次相等是由于一个读操作,将会输出空标志。

因此,我们将得到如下的空标志:写操作无条件的清除空标志。

Read pointer=(array_size-1) ,读操作置空标志。

以及如下的满标志:读操作无条件的清除满标志,Write pointer= (array_size-1),写操作置满标志。

然而,这是一个特殊的例子,由于一般情况下,读操作在FIFO不是空的情况下就开始了(读操作逻辑不需要等待FIFO变满),因此这些条件不得不修改来存储读指针和写指针的每一个值。

有这样一个想法,那就是我们可以将存储器组织成一个环形列表。

因此,如果写指针与读指针差值大于1或更多,就进行读操作,FIFO为空,这种工作方式对于用无符号(n-bit)结构来描述的临界状态非常适合。

同样的,如果读指针与写指针的差值大于1,就进行写操作,直到FIFO为满。

这将带来如下的条件:写操作无条件的清除空标志。

write_pointer=(read_pointer+1),读操作置空。

读操作无条件的清除满标志,read_pointer= (write_pointer+1),写操作置满。

注意,读操作和写操作同时都在使其指针增加,但不改变空标志和满标志的状态。

在空或满的临界状态同时读操作和写操作都是不允许的。

综上所述,我们现在能够定义FIFO的status模块,这里提供了用VHDL编写的代码,由于是同步的,很容易转换成Verilog HDL代码。

library IEEE, STD;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity status isport (reset : in std_logic;clk : in std_logic;fifo_wr : in std_logic;fifo_rd : in std_logic;valid_rd : out std_logic;valid_wr : out std_logic;rd_ptr : out std_logic_vector(4 downto 0);wr_ptr : out std_logic_vector(4 downto 0);empty : out std_logic;full : out std_logic);end status;architecture status_A of status issignal rd_ptr_s : std_logic_vector(4 downto 0);signal wr_ptr_s : std_logic_vector(4 downto 0);signal valid_rd_s : std_logic;signal valid_wr_s : std_logic;beginempty_P : process(clk, reset)beginif (reset = '1') thenempty <= '1';elsif (clk'event and clk = '1') thenif (fifo_wr = '1' and fifo_rd = '1') then-- do nothingnull;elsif (fifo_wr = '1') then-- write unconditionally clears emptyempty <= '0';elsif (fifo_rd = '1' and (wr_ptr_s = rd_ptr_s + '1')) then -- set emptyempty <= '1';end if;end if;end process;full_P : process(clk, reset)beginif (reset = '1') thenfull <= '0';elsif (clk'event and clk = '1') thenif (fifo_rd = '1' and fifo_wr = '1') then-- do nothingnull;elsif (fifo_rd = '1') then-- read unconditionally clears fullfull <= '0';elsif (fifo_wr = '1' and (rd_ptr_s = wr_ptr_s + '1')) then -- set fullfull <= '1';end if;end if;end process;valid_rd_s <= '1' when (empty = '0' and fifo_rd = '1'); valid_wr_s <= '1' when (full = '0' and fifo_wr = '1');wr_ptr_s_P : process(clk, reset)beginif (reset = '1') thenwr_ptr_s_P <= (others => '0');elsif (clk'event and clk = '1') thenif (valid_wr_s = '1') thenwr_ptr_s <= wr_ptr_s + '1';end if;end if;end process;rd_ptr_s_P : process(clk, reset)beginif (reset = '1') thenrd_ptr_s_P <= (others => '0');elsif (clk'event and clk = '1') thenif (valid_rd_s = '1') thenrd_ptr_s <= rd_ptr_s + '1';end if;end if;end process;rd_ptr <= rd_ptr_s;wr_ptr <= wr_ptr_s;end status_A;电路图如图2所示:细心的读者会注意到图2中产生满或空标志需要同时用到两个指针。

相关文档
最新文档