马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本项目介绍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核设计的产生过程在以下文档里有详细的说明。
以下是本工程基于点拨板的工程文件 |