本文转载自:FPGA的现今未微信公众号
在FPGA的设计中的,内部的FIFO和RAM是两种非常常见的存储单元。有的场景是只能使用RAM,比如存放表项的时候,有的场景是RAM和FIFO都可以使用,比如存放数据的时候,从功能的角度来讲,FPGAer都知道这两种存储单元如何使用,但是从工程的角度,比如板上问题的定位、存储单位读写逻辑的修改和维护等方面来看,用FIFO还是用RAM还是有点点讲究了。
FIFO
关于FIFO的基本原理,可以参考FIFO的应用,里面对FIFO有非常详细的介绍。这里从优缺点2个方面重新看到FIFO
FIFO的优点
从使用FIFO的角度来看,FIFO优点很明显,使用简单,问题定位也方便。
首先是时序简单:FIFO通过读写使能控制,只要不满,就可以写入数据;只要不空,就可以读出数据。不需要关心数据在内部的存储位置。
定位问题简单:在工程实践中,对FIFO的问题定位比较简单,常见的错误就是上下溢出、非空情况下不读、长空长满等。这些现象FIFO一般都给出了相应的信号,所以非常好定位。
扩展性好:FIFO不仅仅是一个缓存,同时也很好的逻辑隔离单元,写逻辑部分的修改不影响读逻辑;同理读逻辑部分的修改不影响写逻辑,减少了逻辑的耦合性。
FIFO的缺点
FIFO的缺点,首先不能控制地址,也就不能控制数据写入和读出的位置,所以不能存放表项;还有一个缺点就是从资源的角度来看,需要有额外的逻辑来控制读写,还要产生空、满信号等;最后在一些特殊的应用场景下,比如对数据从写入到读出有延时需求的场景,不同的FIFO设计,有可能不满足要求。
RAM
关于RAM的基础原理,前面有也有过详细的介绍,可以参考RAM的应用。
RAM的优点
存放表项:由于RAM的读写地址可以由用户自己控制,所以RAM是FPGA内存放大表项的几乎唯一的选择。
覆盖:在数据需要丢弃的场景中,可以通过重复写的方式来覆盖原来的数据,从而实现丢弃的功能。
回读:在有的场景中,同一个数据可能需要从缓存中多次读出,这种场景下RAM也是唯一的选择。
RAM的缺点
读写控制:相比FIFO的读写控制,增加了地址这个控制信号。从以往的经验来看,地址信号是比较容易引起问题的,常见的就是地址错误导致数据写入错误。
溢出:由于RAM没有空满状态,RAM作为缓存的时候,写入和读出的逻辑,需要从方案上保证不溢出,复杂度略有增加。
问题定位难:除了上述地址错误导致写入的数据错误不好定位外,RAM没有空满状态,做缓存的时候,RAM的溢出同样不好定位。
总结
经过上面的分析,从功能、控制难易程度、问题定位难易程度考虑,我们可以总结出如下几条原则:
1、表项的存储采用RAM;
2、对数据有覆盖和回读需求的,使用RAM,使用的时候要做好读写长度的控制以及状态的监测;
3、除上述2种情况外,既可以用RAM又可以用FIFO的场景,一律用FIFO;