zoukankan      html  css  js  c++  java
  • FIFO讲解转载

    FIFO:first in first out,先进先出存储器。在实际应用中会有软件FIFO和硬件FIFO区分。硬件FIFO:是硬件做好的固有区域,可以理解为只是用来做FIFO功能的芯片。软件FIFO:是在内存中开辟的区域,可以像操作寄存器一样操作它,规则为先进先出。
    FIFO与BUFFER区别:BUFFER往往就是一段缓冲数据的区域。FIFO的取数规则为先进先出,而BUFFER没有这个限制,可以全局访问。
    当FIFO单纯用来缓存数据,此类FIFO通常很大。FIFO也可以用来不同时钟域的数据缓存,此类FIFO通常较小。
    软FIFO设计应用:以Audio模块为例,假设:AHB为16位,设计PDM信号给入Audio后,首先在data_buffer中缓存,data_buffer缓存深度为8位,经过滤波器将PDM信号转成PCM信号。设计1k×16bitFIFO,此时每2×8bit的PCM信号可以在FIFO中拼接为16位。可设计FIFO半满(512×16bit),全满(1k×16bit)中断,每次中断提醒CPU取出数据,这样可以大大节约CPU资源。需要注意的是,在实际设计中,如果设计FIFO触发中断级别为1,即FIFO接收到一个数据就发生中断,这样CPU负载仍然很大,这与没有FIFO差别不大。如果触发FIFO中断级别大于1,没有到中断的级别FIFO就停止接收数据,里面的数据如何取出,值得考虑。

    嵌入式FIFO的设计主要就是控制FIFO的7个参数。这7个参数分别为基地址、空间大小、空标志、满标志、错误标志、读指针和写指针。

    基地址和空间大小用于规划出一段内存空间,该内存空间用于FIFO设备,并被FIFO设备保护起来,使得其他设备和程序不能访问该空间。

    8个元素的FIFO,其基地址一般为XXXXX000b,也就是地址的低3位为0,基地址就肯定为8的整数次。同样,64个元素的FIFO,其低6位为0。

    FIFO处于满标志情况下仍然写FIFO,或者FIFO处于空标志情况下仍然读FIFOFIFO都将终止当前操作,并将错误标志置位。

    FIFO的写操作只有一种工作方式,即每次写一个新的数据,写指针加1,直到写满。而FIFO读操作有两种工作方式,分别为标准操作和多阶延迟(Multi-tap Delay Transfer)操作。标准操作和写操作一样。多阶延迟操作一般用于滤波处理,当需要对输入信号进行滤波处理时候,每次希望从FIFO读取一段窗口的数据,进行滤波处理,数据窗口仍然只移动一个数据。在标准操作情况下,如果读取一段窗口的数据,FIFO则将该段窗口的数据全部弹出。多阶延迟操作则只弹出一个数据。该操作方法对语音或者AD采样数据的平滑、FIR等滤波非常适用。需要注意的是,多阶延迟操作的数据窗大小需要设置,如果FIFO存储的数据个数小于数据窗,FIFO则终止当前操作,并给出错误标志。

    为了提高FIFO的读写速率,一般采用突发方式进行读写。突发方式的读时序如图5所示。写时序和读时序类似。突发方式一次最多只能读写8个数据,也可以一次突发读写4个或者2个数据。突发读写时数据的建立和保持时间最少可以设置成1个时钟周期,如图中所示。但为了通信可靠,一般采用2个时钟周期。突发方式最大的节省时间是连续的其他数据将不再需要建立和保持周期,而是直接进行读写,一般只需要两个时钟周期就可以完成一个数据的读写。最快情况下,突发读写8个数据只需要20个时钟周期,读写速率达到53.2M×32b/s,满足大部分设备的要求。

     

    FIFO一般用于不同时钟域之间的数据传输,也常用来实现不同位宽的接口的数据匹配

    fifo从输入时钟 的角度来分,有两种类型:单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).

    在STM32F4系列中DMA增加了个FIFO;这个FIFO的作用是什么?

    当我使能这个FIFO时(DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;),进仿真模式查看接收数组,他

    只更新16个字节(我在外边发进去20个字节);读取DMA接收数据个数寄存器显示DMA接收到了20个字节,我 第二次发送

    数据,接收缓冲又只更新了16个字节(包含上一次未更新的字节);当我把FIFO关闭时(DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;),

    我在外边不论发送多少字节都一次性更新到接收缓冲区中;这个FIFO的作用是什么?应该在何时使用?怎么用?

    DMA 无非就是为了加快数据的传输. 多组数据可以用 burst 方式传输. 字节数据在 FIFO 中变换成 WORD 传输, 减少传输次数.

    象你的问题在于, FIFO 的深度设定为 16 了, 这样还有四个字节在 FIFO 中, 数据没有丢失除非你在随后涮洗了 FIFO, 会跟后续

    的数据一起凑成 16 字节再次传输.你可以减少FIFO 的深度, 比如设置成 1/4. 这样每收到4个字节就会传输. 不过没有更小的选

    项了. 如果还是不能满足你的要求, 那考虑用 DIRECT 模式吧

    建议你将传输计数值设置为20,这样当20个数据进入之后,会全部传输到RAM中,
    如果你设置FIFO 为 DMA_FIFOThreshold_Full 那么,中间会发生2次传输,一次16字节,一次4字节。
    如果你设置FIFO 为 DMA_FIFOThreshold_HalfFull 那么,中间会发生3次传输,一次8字节,一次8字节,一次4字节。

  • 相关阅读:
    jQuery+Ajax滚屏异步加载数据实现(附源码)
    EasyUI管理后台模板(附源码)
    jQuery带遮罩层弹窗实现(附源码)
    jQuery相册预览简单实现(附源码)
    node.js应用脚手架:koa2、sequelize、mysql
    React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(二)
    React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(一)
    过了一年,再来回顾一下去年到现在,这一年多,作为初级前端小白的坎坷成长历程
    作为一名初级前端小白,写在年初的一些话
    关于jQuery中,animate、slide、fade等动画的连续触发、滞后反复执行的bug的个人解决办法
  • 原文地址:https://www.cnblogs.com/kunshanpipixia/p/15459254.html
Copyright © 2011-2022 走看看