对altera的FIFO读写操作深入研究

支持原创,如需转载请注明出处。  

  由于本人一直使用的是A家的芯片,所以本次针对FIFO的读写操作也仅仅是在调用Quartus ii上的IP核上进行。

  针对FIFO有两种使用方式,同步FIFO和异步FIFO,同步的不想多说。以下所有操作均为异步FIFO即DCFIFO。

  1. 针对FIFO读操作的两种不同设计做一下解释:Normal mode 和Show-ahead mode,前者为先来读请求信号,接下来一个时钟才将q端数据读出。后者来读请求信号,这即将q读数据读出。

IP核设置如图(1)

 

两种时序操作如下图:

Normal mode 

Normal mode:将读信号rdreq置高后,下个时钟才能将q端数据读出。

Show-ahead mode

Show-ahead mode:将读信号rdreq置高后,该时钟才能将q端数据读出,即数据已经在q端口准备好,读请求一到数据即读出。

  2.针对rdusedw和rdempty的使用。

   一般读取操作判断FIFO中数据都是根据rdusedw和rdempty来决定是否开启读操作的。当你读完FIFO内数据的同时,读端口状态并不会马上响应,即rdusedw不会在紧接的时钟为0,rdempty不会高电平有效。这是由于FIFO有读保护逻辑,所以更新才会慢上两拍,如果此时再更具该信号判断FIFO是否可读必然会处错误,所以解决办法延时一个时钟之后再判断reusedw是否大于0来决定能否开启下一读取操作(有先决条件)。

前方高能预警:上述操作针对的情况是读时钟 rdclk >= 2wrclk,如果不满足条件就会导致FIFO满。

因为通过判断reusedw大于0,开启读操作,之后再延时1个时钟等待reusedw变化,本次读操作需要两个时钟才完成,若不满足 rdclk >= 2wrclk必然会导致FIFO满状况的出现。

针对 wrclk < rdclk < 2wrclk情况,一般操作是可以让FIFO中缓存一定数量的数据,之后在开始进行读取操作,这样FIFO中的数据一段一段的读出就不会有问题。

问题升级:前提是读操作和写操作没有任何关系:针对wrclk < rdclk < 2wrclk,FIFO深度为1024情况,数据一致在想FIFO中写,要求保持FIFO中一直有256个数据存在,该过程如何判断和如何操作。

解决办法还没想到,待续!

 

posted @ 2016-11-03 17:02  计小威  阅读(12165)  评论(0编辑  收藏  举报