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的状况电路送出的一个信号,以阻挠FIFO的写操作持续向FIFO中写数据而形成溢出(overflow)。
空标志:FIFO已空或行将空时由FIFO的状况电路送出的一个信号,以阻挠FIFO的读操作持续从FIFO中读出数据而形成无效数据的读出(underflow)。
读时钟:读操作所遵从的时钟,在每个时钟沿来暂时读数据。
写时钟:写操作所遵从的时钟,在每个时钟沿来暂时写数据。
读指针:指向下一个读出地址。读完后主动加1。
写指针:指向下一个要写入的地址的,写完主动加1。
读写指针其实便是读写的地址,只不过这个地址不能恣意挑选,而是接连的。
4.FIFO的分类
根均FIFO作业的时钟域,能够将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来暂时一起发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是相互独立的。
5.FIFO规划的难点
FIFO规划的难点在于怎样判别FIFO的空/满状况。为了确保数据正确的写入或读出,而不发生好处或读空的状况呈现,有必要确保FIFO在满的情况下,不能进行写操作。在空的状况下不能进行读操作。怎样判别FIFO的满/空就成了FIFO规划的核心问题。因为同步FIFO简直很少用到,这儿只描绘异步FIFO的空/满标志发生问题。
在用到触发器的规划中,不可防止的会遇到亚稳态的问题(关于亚稳态这儿不作介绍,可查看相关材料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其间的一个办法便是运用格雷码。格雷码在相邻的两个码元之间只由一位改换(二进制码在许多情况下是许多码元在一起改变)。这就会防止计数器与时钟同步的时分发生亚稳态现象。可是格雷码有个缺陷便是只能界说2^n的深度,而不能像二进制码那样随意的界说FIFO的深度,因为格雷码有必要循环一个2^n,不然就不能确保两个相邻码元之间相差一位的条件,因而也就不是实在的各雷码了。第二便是运用冗余的触发器,假定一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。但这回导致延时的添加。亚稳态的发生会使得FIFO呈现过错,读/写时钟采样的地址指针会与实在的值之间不同,这就导致写入或读出的地址过错。因为考虑延时的效果,空/满标志的发生并不一定呈现在FIFO真的空/满时才呈现。或许FIFO还未空/满时就呈现了空/满标志。这并没有什么欠好,只需确保FIFO不呈现overflow or underflow 就OK了。
许多关于FIFO的文章其实评论的都是空/满标志的不同算法问题。
在Vijay A. Nebhrajani的《异步FIFO结构》一文中,作者提出了两个关于FIFO空/满标志的算法。
第一个算法:结构一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指针转化为二进制指针)。当指针的二进制码中最高位不一致而其它N位都持平时,FIFO为满(在Clifford E. Cummings的文章中以格雷码表明是前两位均不相同,然后两位LSB相同为满,这与换成二进制表明的MSB不同其他相同为满是相同的)。当指针彻底持平时,FIFO为空。这或许不容易看出,举个比如阐明一下:一个深度为8字节的FIFO怎样作业(运用已转化为二进制的指针)。FIFO_WIDTH=8,FIFO_DEPTH= 2^N = 8,N = 3,指针宽度为N+1=4。起先rd_ptr_bin和wr_ptr_bin均为“0000”。此刻FIFO中写入8个字节的数据。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。当然,这便是满条件。现在,假定履行了8次的读操作,使得rd_ptr_bin =“1000”,这便是空条件。别的的8次写操作将使wr_ptr_bin 等于“0000”,但rd_ptr_bin 依然等于“1000”,因而FIFO为满条件。
明显开始指针无需为“0000”。假定它为“0100”,而且FIFO为空,那么8个字节会使wr_ptr_bin =“1100”,, rd_ptr_bin 依然为“0100”。这又阐明FIFO为满。
在Vijay A. Nebhrajani的这篇《异步FIFO结构》文章中阐明晰怎样运用格雷码来设置空满的条件,但没有说清为什么深度为8的FIFO其读写指针要用3+1位的格雷码来完成,而3+1位的格雷码能够表明16位的深度,而实在的FIFO只要8位,这是怎么回事?而这个问题在Clifford E. Cummings的文章中得以解说。三位格雷码可表明8位的深度,若在加一位最为MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也便是说格雷码的0100表明表明7,而1100依然表明7,只不过格雷码在通过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环,其他的三位码依然是格雷码,但这就带来一个问题,在0100的循环完结后,进入1000,他们之间有两位发生了改换,而不是1位,所以添加一位MSB的做法使得该码在两处:0100~1000,1100~0000有两位码元发生改变,故该码以不是实在的格雷码。添加的MSB是为了完成空满标志的核算。Vijay A. Nebhrajani的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转化,而Clifford E. Cummings的文章中直接在格雷码条件下得出空满条件。其实二者是相同的,仅仅完成办法不同算了。
第二种算法:Clifford E. Cummings的文章中说到的STYLE #2。它将FIFO地址分成了4部分,每部分分别用高两位的MSB 00 、01、 11、 10决议FIFO是否为going full 或going empty (行将满或空)。假如写指针的高两位MSB小于读指针的高两位MSB则FIFO为“简直满”,
若写指针的高两位MSB大于读指针的高两位MSB则FIFO为“简直空”。
在Vijay A. Nebhrajani的《异步FIFO结构》第三部分的文章中也说到了一种办法,那便是方向标志与门限。设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。当方向标志超越门限便输出满/空标志,这与Clifford E. Cummings的文章中说到的STYLE #2可谓是殊途同归。他们都归于保存的空满判别。其实这时输出空满标志FIFO并不一定真的空/满。
说到此,咱们现已清楚地看到,FIFO规划最要害的便是发生空/满标志的算法的不同发生了不同的FIFO。但无论是准确的空满仍是保存的空满都是为了确保FIFO作业的牢靠。
二、先进先出法 (first in,first out ,FIFO)
先进先出法是指依据先入库先宣布的准则,关于宣布的存货以先入库存货的单价核算宣布存货本钱的办法.选用这种办法的详细做法是:先按存货的期初余额的单价核算宣布的存货的本钱,领发结束后,再按第一批入库的存货的单价核算,依此早年向后类推,核算宣布存货和结存货的本钱.
先进先出法是存货的计价办法之一。它是依据先购入的产品先领用或宣布的假定计价的。用先进先出法核算的期末存货额,比较挨近市价。
先进先出法是以先购入的存货先宣布这样一种存货什物流通假定为条件,对宣布存货进行计价的一种办法。选用这种办法,先购入的存货本钱在后购入的存货本钱之前转出,据此确认宣布存货和期末存货的本钱