本文将从FIFO队列聊起,给出笔者在处理上述问题时的方法。其中涉及的算法未必是最简洁的,欢迎大家在评论里互动讨论。本文约1900字,预计阅读时间10分钟。 1....什么是FIFO队列 FIFO(First Input First Output)队列,即先入先出队列。...(一般解释这个都用的是超市排队结账模型) 如果我们规定这个队列最多有N个人,并且有很多的居民正在广场上等着进入这个检测队列,每检测完一人则队伍出去一人并进来一人,则FIFO队列有以下特点: (1)...利用FIFO队列做平均值滤波 回到开篇的第一个问题,我们经常会遇到现场的模拟量输入信号跳动的问题,在做完现场所有的屏蔽、接地、电源滤波、隔离之后,模拟量还是像看了一眼白云的隔壁吴老二一样发抖。...利用FIFO队列做历史记录 回到开篇的第二个问题,客户需要我们在PLC内记录最近一定批次的操作或是产品的数据,每条数据包含多个变量,并且要在触摸屏上显示这些数据,如何做可以省点事?
队列和栈有着截然不同的工作方式,队列遵循先进先出(FIFO)的原则,在许多场景下都表现出强大的效率和实用性 源码可以来我的github进行查找:Nerosts/just-a-try: 学习c语言的过程、...真 (github.com) 1.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列...此段称为队头 假设入队:A B C D 那么出队:A B C D 2.队列的实现 队列也可以数组和链表的结构实现,使用链表的结构来实现更适合一些,因为使用数组的结构,出队列这个操作在数组头上出数据(...如果队列不为空,则将新节点连接到队列尾部,并更新尾指针 ptail 指向新的尾节点。 最后,增加队列的大小 size。...q 是有效的,并且队列中有元素即(size > 0) 通过 next 指针将队列头部的下一个节点保存下来,以备后续更新 释放队列当前的头节点 更新队列的头指针为下一个节点(如果有的话) 如果删除节点后队列为空
一.队列分类: 1.线程队列Queue — FIFO(先进先出队列),即哪个数据先存入,取数据的时候先取哪个数据,同生活中的排队买东西 2.线程队列LifoQueue — LIFO(先进后出队列),即哪个数据最后存入的...今天只对第一种普通线程队列Queue(FIFO)讲解,后面的两种留到下一篇文章在做详细讲解!...二.先进先出队列Queue简介 线程队列Queue,也称FIFO,存在队列中的数据先进先出,就好比拉肚子,吃什么拉什么~~呃呃,有点重口味,如下图: ?...举个形象的例子:如果把123456这6个数字,依次放入队列queue中,那么我们重队列中取数据的时候,取到的第一个数据必然是1,第二个数据必然是2,依次类推,这就是所谓的吃什么拉什么 — FIFO(先进先出...线程队列Queue-FIFO
队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。...这种数据结构模拟了物理世界中的队列,如排队等待服务的人。在本篇博客中,我们将详细介绍队列的概念、用途、实现以及如何在编程中使用队列。...队列的概念队列是一个线性数据结构,具有以下关键特点:先进先出(FIFO)原则: 最早入队的元素将首先出队。两个主要操作: 队列支持两个基本操作,即入队(Enqueue)和出队(Dequeue)。...队首: 位于队列前端的元素是最早加入队列的元素,是唯一一个可以访问的元素。队尾: 位于队列尾端的元素是最新加入队列的元素。限制大小: 队列可以有固定或动态大小,通常有容量限制。...Web请求队列: Web服务器使用队列来处理传入请求,以平衡服务器负载。队列的实现队列可以通过数组或链表实现。每种实现方式都有其优点和缺点。
FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信。...创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t mode); 内核会针对fifo文件开辟一个缓冲区...,操作fifo文件,可以操作缓冲区,实现进程间通信–实际上就是文件读写 man 3 mkfifo #include #include int mkfifo...(const char *pathname, mode_t mode); 注意事项: FIFOs Opening the read or write end of a FIFO blocks until...See fifo(7) for further details. 打开fifo文件时候,read端会阻塞等待write端open,write端同理,也会阻塞等待另外一段打开。
FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。...异步FIFO是指读写时钟不一致,读写时钟是互相独立的。 FIFO设计的难点 FIFO设计的难点在于怎样判断FIFO的空/满状态。...1.同步FIFO之Verilog实现 同步FIFO的意思是说FIFO的读写时钟是同一个时钟,不同于异步FIFO,异步FIFO的读写时钟是完全异步的。...module fifo_cell (sys_clk, sys_rst_n, read_fifo, write_fifo, fifo_input_data,...之Verilog实现 FIFO (先进先出队列)是一种在电子系统得到广泛应用的器件,通常用于数据的缓存和用于容纳异步信号的频率或相位的差异。
FIFO简介 2. 使用场景 3. 分类 4. FIFO的常见参数 5....FIFO设计 5.1 空满标志生成 5.2 异步FIFO的设计还要注意跨时钟域问题 5.3 gray码如何判断空满 `6. 同步FIFO实现` 7. 异步FIFO实现 8....FIFO的常见参数 FIFO的宽度:即FIFO一次读写操作的数据位; FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。...满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。...FIFO设计 5.1 空满标志生成 FIFO设计的关键是产生可靠的FIFO读写指针和生成FIFO空/满状态标志。
pipe 首先先来说一下pipe,这是一个匿名管道(为啥叫匿名呢,下面讲命名管道的时候就知道了),实现方式是循环队列,它只能用于有血缘关系的进程间通信。...fifo fifo用来创建一个命名管道,可以解决非血缘关系的进程间通信,它的底层的实现原理和匿名管道相同,只不过是生成了一个可见的管道文件。...因为这个管道有一个所有进程都可以访问到的管道文件,所以fifo叫做命名管道,那么同理,pipe就只能通过fork的方式来复制文件描述符表来共享管道,而其他的进程却访问不到,所以叫做匿名管道。 ...下面也通过代码,来简单的实现一下fifo的效果,这里我提前用mkfifo的命令来创建了一个管道文件,当然也可以在代码中使用mkfifo函数来创建,先来看一下写操作的进程的代码: #include <stdio.h
本系列分为以下部分: 1、FIFO深度计算 2、同步fifo设计 3、fifo与格雷码以及异步fifo设计 计划分三次更新完毕,本次为本系列终结篇! 本次增加异步FIFO设计,异常有趣!...5、异步fifo代码+分析 module asyn_fifo#( parameter DATA_WIDTH=8, parameter ADDR_WIDTH=3, //地址位宽为log2(deepth)...; //fifo传入的地址 wire [ADDR_WIDTH-1:0]fifo_exit_addr; //fifo输出的地址 /* 关于为什么binary下的地址宽度大一位,是因为要转化为格雷码...{1'b0}}; end else if(wr_en&(~full)) //写使能且fifo未满 mem[fifo_enter_addr]<=data_w; //将数据写入到mem else...fifo_enter_addr+1'b1: fifo_enter_addr; assign rd_nextaddr_bin= (rd_en&(~empty)) ?
本系列分为以下部分: 1、FIFO深度计算 2、同步fifo设计 3、fifo与格雷码 计划分三次更新完毕,本次为FIFO深度计算。...FIFO最小深度计算背景 当异步FIFO读写端口的throught-put(吞吐量)不同时,会遇到数据丢失的问题,需要考虑FIFO中的深度问题,即为满足读写流畅不卡顿(数据不丢失)时,FIFO的deepth...FIFO主要是用于数据的缓存,用在读慢写快的场景下。异步FIFO读写不同频,选用的FIFO要能够在极端的情况下仍然能够保证数据的不溢出。...倘若写快读慢的场景下,写数据流是连续的,那再大的FIFO都会有写满的时候,因此无法避免数据的溢出。 当写快读慢时,FIFO便可被用作系统中元件或队列。...因此FIFO的大小其实也就暗示了所需缓存数据的容量,该容量取决于读写数据的速率。据统计,系统的数据速率取决于系统的负载能力。因此为了保证FIFO的大小,需要考虑FIFO传输的最坏情况。
概述 前面提及到同步FIFO的设计,同步FIFO。...---- 异步FIFO常见问题 好的FIFO设计的基本要求是写满而不溢出,读空又不多读。...本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就是n位,这样做有助于判断FIFO是空还是满。...空标志的产生 当FIFO中的读指针赶上了写指针,也就是rd_ptr完全等于wr_ptr时,可以断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一种是系统复位,读写指针全部清零;...另一种情况是在FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。
FIFO(first in first out)先进先出的存储结构。和ring队列结构一样,区别是fifo支持动态扩展存储区大小。也是支持任意数据类型。...处理逻辑和ring队列差不多。 相关代码在src/vppinfra/fifo.【ch】文件,代码总共也不到500H。...beyond last index in fifo. */ u32 tail_index; } clib_fifo_header_t; head_index : fifo中有效数据的第一个索引...always_inline uword clib_fifo_elts (void *v) { word l, r; clib_fifo_header_t *f = clib_fifo_header...fifo只适合小规格数据的存储,主要是因为在动态扩充的时候,是申请新的fifo内存,旧的fifo数据copy到新的fifo中,释放旧的fifo。
此文内容就是阐述异步FIFO的设计。...本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就是n位,这样做有助于判断FIFO是空还是满。...,读写指针全部清零;另一种情况是在FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。...但是如果地址的宽度和FIFO实际深度所需的宽度相等,某一时刻读写地址相同了,那FIFO是空还是满就难以判断了。...三、总结 前文讲述了异步FIFO的应用需要、实现原理,并重点阐述了空满标志信号的产生方法以及可能会发生的“虚空”和“虚满”现象。理解了这些关键信号的产生原理,设计一个异步FIFO也就不难了。
同步 FIFO 简介 FIFO 即先进先出队列,FIFO 一般作为不同时钟域的缓冲器。 FIFO 根据读和写的时钟是否为同一时钟分为同步 FIFO 和异步 FIFO 。...异步 FIFO 相比同步 FIFO 来说,设计更加复杂一点。 ?...设计 FIFO 的时候一般需要考虑的有两点: FIFO 的大小 FIFO 的大小就是指双端口 ram 的大小,这个可以根据需要来设置。...FIFO空满状态的判断 FIFO 空满状态的判断通常有两种方法 FIFO 中的 ram 一般是双端口 ram ,所以有独立的读写地址。...这种方法设计比较简单,但是需要额外的计数器,就会产生额外的资源,而且当 FIFO 较大时,会降低 FIFO 最终可以达到的速度。
如图1所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令……当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1...图1 先进先出队列FIFO是队列机制中最简单的,每个接口上都存在FIFO队列,表面上看FIFO队列并没有提供什么QoS(Quality of Service,服务质量)保证,甚至很多人认为FIFO严格意义上不算做一种队列技术...,实则不然,FIFO是其它队列的基础,FIFO也会影响到衡量QoS的关键指标:报文的丢弃、延时、抖动。...FIFO关心的就是队列长度问题,队列长度会影响到时延、抖动、丢包率。因为队列长度是有限的,有可能被填满,这就涉及到该机制的丢弃原则。常见的一个丢弃原则叫做Tail Drop机制。...如果定义了较短的队列,时延的问题可以得到解决,但是发生Tail Drop的报文就变多了。先进先出(FIFO)置换算法 这是最早出现的置换算法。
本系列分为以下部分: 1、FIFO深度计算 2、同步fifo设计 3、fifo与格雷码 4、异步fifo设计(新增) 计划分三次更新完毕,本次为同步FIFO设计。...由于本次过于简单,第四次增加异步FIFO设计,异常有趣!...同步FIFO设计 关于同步fifo的设计疑惑了半天,本以为这个代码是错的,后来自己又写了一遍,但是写到最后又觉得这个是正确的,主要是wr_cnt和rd_cnt的理解。...没什么好讲的,异步fifo的设计才是有趣,异步fifo的设计代码在第三节格雷码更新完毕后更新。..., //fifo满 ptr, fifo_empty //fifo空标志 ); initial begin clk=0; forever
FIFO(First In, First Out,即先进先出)是一种简单且直观的缓存替换算法。它的工作原理是,当缓存满了需要替换时,优先移除最早进入缓存的项。...FIFO算法类似于排队系统,最早进入的缓存项最先被移除。FIFO算法的基本原理先进先出:按照缓存项进入缓存的顺序进行管理。最早进入缓存的项在缓存满时优先被移除。...队列:通常使用队列数据结构来实现FIFO缓存,队列的头部保存最早进入的缓存项,尾部保存最新进入的缓存项。优点简单易实现:FIFO算法实现起来非常简单,只需要维护一个队列即可。...缺点不考虑使用频率和最近使用时间:FIFO算法不会考虑缓存项的使用频率和最近使用时间,可能导致高频使用的数据被替换掉,从而降低缓存命中率。...缓存抖动:在某些访问模式下,FIFO可能导致缓存项频繁被替换,导致缓存效果不佳。
异步FIFO简介 结构框图 image.png 如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的指针rptr采集到写时钟wr_clk域,然后和写时针wptr...写满、读空 当FIFO为满或为空时,写入指针和读取指针都是相等的。但我们需要将“满”与“空”区分,当FIFO工作时,写指针在前,读指针紧跟写指针。...当FIFO为满时,写指针往前移动,返回并等于后面紧跟的读指针,这就是所谓的套圈。这个时候我们再增加1bit给读写指针,可以通过这个bit为0还是1来显示“满”或“空”。...跨时钟域的同步解决 读时针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的。...,宽度8,深度16,地址4bit,多加1bit判断空满 顶层模块fifo.v module fifo #(parameter DSIZE=8, parameter ASIZE=4) ( output
什么是消息队列 消息队列可以分为队列和消息 队列 队列是从开始到结束,有序的排放消息。消息队列是用来在应用程序发送消息,队列中存放了一些待处理的消息。...消息队列的基本结构是简单的,有一个客户端应用程序称为生产者,创建消息,并将它们传送到消息队列。其他应用程序,称为消费者,连接到队列,并得到要处理的消息。...消息队列API 创建新消息队列或取得已存在消息队列 #include ------------------------------------ int msgget(key_t...如果该队列已经存在,返回该队列ID.IPC_CREAT & IPC_EXCL: 如果该队列不存在创建,如果存在返回失败EEXIST....IPC_SET该命令用来设置消息队列的属性,要设置的属性存储在buf中。IPC_RMID从内核中删除 msqid 标识的消息队列。
,同步FIFO用的少,可以作为数据缓存;异步即读写时钟不相同,异步FIFO可以 解决跨时钟域的问题,在应用时需根据实际情况考虑好fifo深度即可。 ...与同步FIFO相同,异步FIFO也主要由五大模块组成,不同的是,异步FIFO的读写逻辑控制还包括了格雷码转换和时钟同步部分: (1)、 FIFO写逻辑控制——产生FIFO写地址、写有效信号,...同时产生FIFO写满、写错等状态信号; (2)、 FIFO读逻辑控制——产生FIFO读地址、读有效信号,同时产生FIFO读空、读错等状态信号; (3)、 时钟同步逻辑——通过两级...:FIFO空之后不能继续读取,FIFO满之后不能继续写入。..., r_fifo_full , fifo_wr_data, fifo_rd_clk , fifo_rd_en , fifo_rd_data, r_fifo_empty
领取专属 10元无门槛券
手把手带您无忧上云