在Cyclone IV系列芯片中,嵌入式块RAM(BRAM)的结构都是M9K,当然在进行设计时,如果我们的逻辑资源足够,我们也可以使用逻辑资源(也就是分布式RAM)。如果逻辑资源紧张,可以指定使用BRAM。
在Verilog中,有时候会使用类似C语言等高级语言的数组定义,定义一个有深度和宽度的存储器
如:reg [7:0] fifo_buffer [7:0];
一般,编译器会默认认为,这个fifo_buffer是使用的是分布式ram,也就是FPGA内部逻辑资源LUT,但是当需要的fifo_buffer大的话,使用逻辑资源太浪费,我们可以告诉编译器我们使用BRAM。使用方法如下:
( ram_style = “block” ) reg [10:0] fifo_buffer [7:0];这样就会使用BRAM了。
但是,需要注意的是,因为使用的是BRAM,而在Cyclone IV中的BRAM的读写有时钟和读写使能控制。所以不能像分布式ram那样可以随读随写。
所以BRAM(M9K)常用来配置成RAM、ROM、FIFO等。
如图,可以看到,EP4CE10F17C8一共有46个M9K,每个M9K 9kbit,46 * 9 * 1024 = 423936 bit,刚好,总的内存423936 bit。
M9K特性如下:
可以看到,不同数据深度和数据宽度最终能够使用的M9K最大资源都不一样。
如果数据宽度为1、2、4、8、16、32,那么最终一个M9K只能使用8192 bit的内存;
但是当数据宽度为9、18、36的话,最多就能够使用整个M9K的内存9216 bit。
并且如果配置成真双口RAM和ROM的话,数据宽度不能是32和36。
可以通过时钟使能控制信号将时钟禁用,从而M9K不会检测到任何时钟边沿,所以不会执行任何操作。
读写使能控制信号可以控制M9K每个端口的读写操作。当不需要读写操作时,可以将wren和rden禁用,从而降低功耗。
另外还有奇偶校验位支持和字节使能,这个就不作详细介绍了。