FIFO:First Input First Output
有一个游泳池,宽5米,长10米。每秒排水1平方米,在排水的同时进行注水,每秒注水3平方米,问这个游泳池多久注满水?
这 个问题大家不陌生吧,小学经典的一元一次方程。
我们可以观察到
- 游泳池在排水的过程中可以同时注水,这个像不像内存的读写?
- 排水和注水的大小不同,这个像不像读写的效率?
- 当游泳池排完水后,是否能够继续排水?内存空的时候还能读到东西吗?
- 游泳池注注完水后,还能不能继续注水?内存满的时候还能写入吗?
FIFO的两个规则
- 永远不要写入完整的FIFO(溢出)
- 永远不要从空的FIFO中读取(下溢)
FIFO的一些重要参数
读写控制:读写控制的使能
满信号:FIFO里面的信号数量达到了最大深度值
空信号:FIFO里面的信号全部被读出
读写指针:总是指向下一个地址
深度:FIFO所能容纳的最大信号数量
宽度:FIFO中每一位容纳的数据大小。
FIFO的设计
FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的核心问题。
PS: 题外话
在写泳池例子时我发散一下。
这是一道非常经典的数据题,不过从小我就有一个疑惑,真的有人一边对泳池放水一边泳池加水么?我以我二十多年的阅历来说,还没有见到过,那么可以直接下定义说这道题脱离生活实际么?
我们来看一下生活中的现象: 下暴雨时,水库会大量进水,为了调节水位,会进行泄洪,这不就是一边放水一边加水么。