什么是FIFO?

什么是FIFO?

FIFO一般用于不同时钟域之间的数据传输,也常用来实现不同位宽的接口的数据匹配。

  1. “不同时钟域间传输数据”时,FIFO类似缓存,根据时钟A,向FIFO中写入数据,根据时钟B,读取FIFO数据。

 

  1. “不同位宽传输数据”时,FIFO同样类似缓存,将FIFO接收配置为8位数据,输出配置为16位数据。FIFO接收到的8位数组,按照高低组合为16位数据进行输出。

 

配置FIFO的ip核

参考:如何创建使用IP核-PPL?

在“菜单栏 - Tools - MegaWizard Plug-In Manage”创建“FIFO”核。

 

  1. 位宽与时钟配置
    输入与输出均为8字节宽度,有256个字的缓存深度,输入与输出为不同时钟。

 

  1. DCFIFO1(FIFO优化,平衡性能与资源消耗)

 

  1. DCFIFO2(控制标志信号)
    “full”:表示缓存满“empty”:表示缓存空“usedw”:可被读取的缓存容量

 

  1. 读请求模式、Blk类型

 

正常模式:数据正常被读取

 

前显模式:相比较正常模式前移一字节,导致处于读取状态下,实际读取的是第二个数据。

 

  1. 电路保护等选项
    电路保护使用默认选项,不勾选即为开启电路保护。资源使用默认选项,使用FIFO中自带的存储资源
  2. 仿真
    altera_mf文件,提供仿真功能。

 

  1. summary总结界面
    勾选后,可生产对应的文件。需要“fifo_inst.v”例化文件

 

  1. 例化
    在工程文件夹下“paripcore”中的“fifo_inst.v”为例化文件,可在顶层文件中使用此例化,替换传参即可。

 

移植到顶层文件中

 

工程配置

工程:
通过写模块,向FIFO中写入数据;
通过读模块,从FIFO中获取数据;

 

  1. 顶层文件
    分别例化fifo的ip核、读模块、写模块

 

  1. 读模块
    通过状态机形式,默认处于“等待读取”状态,先检查是否存在读满信号,存在则进入“允许读取”状态;在“允许读取”状态下,判断是否存在读空信号,若存在读空信号,进入“等待读取”,若不存在读空信号,持续读取。

 

  1. 写模块
    同样通过状态机的形式进行。默认“等待写空”

 

  1. 验证
    编译后,通过“SignalTap”进行验证。

 

波形变化,可以观察到从读数据到写数据的变化情况

 

之前配置fifo的ip核时,设置256字,故显示0-255。
再修改为128字,则结果如下:

 


 

胜象大百科