FPGA的片内有很多的存储器资源,可以配置成单端口的ROM、RAM和双端口的ROM、RAM,以及移位寄存器和FIFO等。在学习过程中,笔者遇到过几个小问题,总结如下:

片内是不是有ROM或者RAM?

个人观点:片内没有ROM或者RAM的,有的只是一些功能比较强大的存储器块,可以通过配置变成我们想要的功能。例如将RAM的wren端子和data端子直接接地,那么就变成了ROM。片内有的是一些M9K、M4K等等,M9K代表容量为9Kbits的存储器。

选择组成存储器的类型以及存储器块的最大深度?

intel-FPGA的片内存储器问题-LMLPHP

图1

  

个人观点:对于这两个的话,建议选择“AUTO”。下图是官方给出的建议:

intel-FPGA的片内存储器问题-LMLPHP

图2

intel-FPGA的片内存储器问题-LMLPHP

图3

  对于RAM和ROM模式,q输出段是否应该被寄存?

个人观点:其实寄存也好,不被寄存也好,结果只是输出的是不是会延迟一个时钟周期。但是笔者建议q应该被寄存一下。在RAM或者ROM中,地址被寄存,而最终的输出是用的组合逻辑进行输出,如果q被引用时也经过了大量的逻辑,那么存储器中的逻辑和被引用时的逻辑就会组成一个比较大的逻辑,整个设计的速度就会变慢。

对于RAM和ROM模式,是否应该引出rden信号?

个人观点:之前我在学习中,rden从来没有引出过,因为自己的设计自己知道,什么时候去读,只要正确的时序就可以了,近期接触到官方文档后,官方推荐引出rden信号,用于降低功耗。

intel-FPGA的片内存储器问题-LMLPHP

图4

  在RAM模式中,如果出现对于同一个地址进行读写会出现什么情况?

  intel-FPGA的片内存储器问题-LMLPHP

图5

  

  个人观点:之前学习中,这个界面几乎从来没有关系过,直接都是略过,保持默认值不变。近期考虑这个问题,查看官方手册,此项可以选择New Data、Old Data和Donot Care,默认值是New Data。

这个问题可以分为两个方向考虑:

同一个端口同时读写,那么时序如下:

intel-FPGA的片内存储器问题-LMLPHP

图6

intel-FPGA的片内存储器问题-LMLPHP

图7

  对于不同的端口来说,只有Old DATA,don’t care就不关心了。

intel-FPGA的片内存储器问题-LMLPHP

图8

  对于初始化文件.hex或者.mif文件,当存储器发生写入时,文件内容没有发生改变?

个人观点:.hex或者.mif文件并没有被下板,只是综合器在综合时,将文件中的内容读取出来,配置给存储器而已,本身文件和下板没有关系,所以在仿真也好,或者下板也好,对于存储器的写入并不会改变文件中的值。对于经常使用.txt初始化的设计者,结果也是一样的,.txt的内容并不会被改变。

使用reg [n-1:0] reg_name [m-1:0]定义存储器。

个人观点:此种方法是可以定义存储器的,但是经过笔者实际测试,不同的深度和位宽会影响综合器选择存储器块还是LE构成,并且会综合器在综合过程中会产生很多的警告。笔者在公司研发,使用此种方式进行存储器定义使用,被领导批评过。具体的原因有待发掘,在此,笔者建议设计者在设计时,如果要用到存储器,利用IPCore的插件向导完成还是比较好的。

笔者将上文中所用的存储器官方资料都放到了,QQ群:173560979群文件中,如果有需要的可以下载。

笔者水平有限,如果设计中,有什么不妥的地方,恳请大佬们指出来。

  欢迎加好友探讨QQ(奋斗的小孩郝旭帅):746833924,QQ群:173560979。

05-11 21:54