fifo的主要目的一般来讲有两个: 数据速率的适配; 时钟的适配. fifo的容量有有限的, 而且一般来讲都比较小, 容量大的那是缓存/队列, 虽然缓存/队列也可以做成"先进先出"的形式, 但主要目的已经是缓存数据了. fifo会输出full标志给写端口, empty标志给读端口, 前面的数据产生模块在full信号置位后就应该停止数据发送, 否则fifo会溢出, 数据会丢失, 如果不做这样的处理, 那你认为fifo的容量应该做几GB或TB才能绝对不溢出呢? 外面的模块不需要关心fifo内部的读写地址, 只需要根据full/empty进行正常的写/读操作就行, fifo内部要维护读写地址, 是循环往复的, 数据读出后, 这个地址单位就会被释放, 就可以再写一个新的数据进去了, 但还没有释放的地址单位不能被覆盖. 但fifo有多种设计, 有的fifo的读地址还能回退, 比如MAC half-duplex的重传. |