近期调试FPGA,学习了很多新的知识与值得注意的点,记录之。
一、关于FPGA的RAM空间构成
EP3C16Q240这个FPGA所用的RAM由56个M9K组成,称为内存块,这一点从《Cyclone III HandBook》里很容易查出来:
M9K从字面上理解,自己初以为就是9KB的可使用存储空间,然而实际上这里有两个坑点:第一,9KB的单位实际上是9Kbits,并不是一般人所理解的9Kbytes,也就是说,实际上一个M9K仅为9K/8 = 1.125KB,数据手册也提到了:
第二,9K(实际为1.125KB)的空间实际只有8K(也就是1KB)可用,另外1K用于校验等功能无法使用。
二、关于双口RAM的位宽问题
双口RAM分两种,一种叫伪双口RAM,数据手册里称之为Simple Dual-Port Mode,另一种叫真双口RAM,官方说法为True Dual-Port Mode。这两种最大的差别就在于伪双口RAM仅有一个数据输出口,而真双口具有两个输出。在数据手册里,有一个特别值得注意的点,真伪双口RAM所支持的最大位宽不一样,真双口RAM最大支持18位,而伪双口RAM可以支持到36位。
如果所使用的RAM超过了上述表格所支持的最大位宽,综合器将会使用多个M9K来综合,这样其实造成了很大的资源浪费,M9K利用率太低了。
三、关于伪双口RAM的输出延时
伪双口RAM在数据输出的时候,对于某一个读地址变化,数据不会马上输出,而是会在下一个读时钟周期将数据输出,此时仅延迟一个读时钟周期。如果在生成双口RAM时,勾选了“ Read output port(s) 'q' ”选项,由于在输出端新增了一个D触发器,因此RAM输出将再次延迟一个读时钟周期才能正确输出数据(加上本身延迟,一共两个读周期)。如果没有勾选,则输出端口将直接输出,不存在第二个延迟。