一种FIFO实现原理

    FIFO是模拟双端口缓冲器而设计的,先进的数据先出,进出的数据可以是1个至n个不等,主要解决时序问题。就像排队买菜,先来的排在前面,后来的排后面,先来的先买菜。

1. 策略:排队需要缓冲区BUF队列,模仿“排队买菜”和“双端口器件”原理,维持BUF队列中第一个数据永远在第一个存储位。

2. 读出:一个或n个,从第一个存储位开始读,读完后将剩余数据提到最前端,第一个数据对齐第一个存储位。

3. 写入:从队列后加入。

头文件:

#ifndef FIFOH
#define FIFOH

#include <windows.h>

#define FifoMaxBufSize 200000UL //200KB

class CFIFO
{
 public:

    int iFifoBufSize;//当前缓冲区数

    void Reset(void);//复位数据
    bool Read(BYTE *pData, int iReadSize);//读出
    bool Write(BYTE *pData, int iWriteSize);//写入

 private:

    BYTE Buf[FifoMaxBufSize];//缓冲区队列
};

#endif

源文件:

#include "FIFO.h"

void CFIFO::Reset(void)//复位数据
{
   iFifoBufSize = 0;//复位当前缓冲区数
}

bool CFIFO::Read(BYTE *pData, int iReadSize)//读出
{
    if(iReadSize > iFifoBufSize) return false;//要求不能满足
    memcpy(pData, Buf, iReadSize);//考出
    iFifoBufSize -= iReadSize;//减去移走数据
    if (iReadSize > 0)//有数据需要移动
    {
       memcpy(&Buf[0], &Buf[iReadSize], iFifoBufSize);//移动缓冲区剩余数据至顶部
    }
    return true;
}

bool CFIFO::Write(BYTE *pData, int iWriteSize)//写入
{
    if ((iFifoBufSize + iWriteSize) > FifoMaxBufSize) return false;//要求不能满足
    memcpy(&Buf[iFifoBufSize], pData, iWriteSize);//从队尾处写入
    iFifoBufSize += iWriteSize;//加入写入量
    return true;
}

在读取FFmpeg解压后音频片数据获得成功,其他应用可调整最大队列量,确保不溢出。  

  

转载于:https://www.cnblogs.com/hbg200/p/10599312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FIFO一种先进先出的数据结构,常用于数据缓存和数据传输。FIFO的参数包括宽度和深度。宽度指的是FIFO一次读写操作的数据位数,而深度指的是FIFO可以存储多少个N位的数据(如果宽度为N)\[1\]。 FIFO的工作原理是通过读写时钟来实现数据的读写操作。读时钟用于读操作,每当读时钟沿来临时,FIFO会输出一个数据。写时钟用于写操作,每当写时钟沿来临时,FIFO会接收一个数据并存储在内部\[1\]。 FIFO还有两个标志位,即满标志和空标志。满标志是由FIFO的状态电路在FIFO已满或将要满时送出的一个信号,用于阻止写操作继续向FIFO中写数据而造成溢出。空标志是由FIFO的状态电路在FIFO已空或将要空时送出的一个信号,用于阻止读操作继续从FIFO中读出数据而造成无效数据的读出\[1\]。 在Verilog中,可以使用异步FIFO来实现FIFO的功能。异步FIFO的读写操作采用相互异步的不同时钟。在现代集成电路芯片中,由于设计规模的扩大,一个系统往往含有多个时钟域。异步FIFO是解决多时钟域接口电路问题的一种简便、快捷的解决方案。使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据\[3\]。 总结起来,FIFO一种先进先出的数据结构,通过读写时钟实现数据的读写操作。它具有宽度、深度、满标志和空标志等参数。在Verilog中,可以使用异步FIFO来实现FIFO的功能\[1\]\[3\]。 #### 引用[.reference_title] - *1* *2* *3* [异步FIFO---Verilog实现](https://blog.csdn.net/alangaixiaoxiao/article/details/81432144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值