明德扬吴老师 发表于 2019-9-26 19:11:19

14 IP核(FIFO)编号:003200000075

14IP核(FIFO)
本案例的编号为:003200000075,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)本文为明德扬原创及录用文章,转载请注明出处!
本项目介绍FIFO IP核的使用过程及功能原理。FIFO是(First InputFirst Output)的缩写,即先入先出队列。FIFO可以说是FPGA里最常用的IP核之一,其功能主要有:
a.      数据的缓冲。如果数据的写入速率高,但间隔大,且会有突发;读出速率小,但相对均匀。则通过设置相应深度的FIFO,可以起到数据暂存的功能,且能够使后续处理流程平滑,避免前级突发时,后级来不及处理而丢弃数据。
b.      时钟域的隔离。对于不同时钟域的数据传递,则数据可以通过FIFO进行隔离,避免跨时钟域的数据传输带来的设计与约束上的复杂度。
c.      不同宽度的数据接口。例如单片机8位数据输出,而DSP是16位数据输入,在单片机和DSP连接时就可以使用FIFO来达到数据匹配的目的。
通过一个具体的事例来描述FIFO的功能:
当模块A要发送数据给模块B,其中模块A的工作时钟是100MHz,模块B的工作时钟是80MHz。若要直接将A数据送给B,由于时钟不同,B模块势必会丢失数据或多采集数据,解决这一问题的方案便是使用FIFO,示意图如下:





由于FIFO内部可以做跨时钟域处理,读写时钟可以不同,因此非常适合解决这类问题。
模块C的功能如下:
1)模块内部包含一个FIFO,该FIFO数据位宽16bit,深度是64,有rdusedw、wrusedw、empty等指示信号。
2)输入数据data_in和data_in_vld都是在属于clk_in时钟域的,模块首先将数据写入到内部FIFO中,等待被模块B读取。
3)如果内部FIFO快满时(wrusedw>=61),仍然有数据要写入,为了防止FIFO溢出,丢弃该数据,不再写入FIFO。
4)Data_out、data_out_vld和b_rdy都是属于clk_out时钟域的。
5)B_rdy是模块B产生的接收数据准备好信号,当此信号为1时,表示模块B已经准备好接收数据,本模块可以将数据发给模块B。如果为0,表示未准备好,不能将数据送过来。
6)当b_rdy为1,且FIFO内有数据(rdempy==0)时,将数据送给模块B。
使用FIFO时要保证当FIFO已经处于满状态时,就不再往FIFO里写数据;当FIFO处于空状态时,不再读FIFO的数据。
FIFO IP核设计的产生过程在以下文档里有详细的说明。

以下是本工程基于点拨板的工程文件

以下是本工程的相关文档





欢迎大家在此帖子里讨论本案例的问题。
页: [1]
查看完整版本: 14 IP核(FIFO)编号:003200000075