在FPGA內(nèi)部資源中,RAM是較為常用的一種資源。 通常實例化RAM中,一種使用為BLOCK RAM 也就是塊RAM 。另外資源可以通過寄存器搭,也就是分布式RAM。前者一般用于提供較大的存儲空間,后者則提供小的存儲空間。 在實際應(yīng)用過程中,一般使用的包括,單端口、雙端口RAM,ROM等形式等不同的形式。 實際應(yīng)用中FIFO也是利用RAM和邏輯一起實現(xiàn)的。 對于一塊RAM中,其能夠例化的深度是有限的。例如cyclone4的RAM9k中可以例化的資源如下所示: 因此:例化化深度 那是不是可以例化成雙端口RAM,通過高位地址區(qū)分,變?yōu)閮蓚單端口RAM(width:32,depth:128)來使用,這樣就可以節(jié)省資源了? 而對于雙端口RAM來說,每個M9K能夠配置是的最小深度就變成是512,而最大寬度為18,如下圖所示,因此作為真雙端口RAM使用,深度小于512的話,仍然會占用1塊RAM。且寬度》18就會多占用額外的一塊RAM,因此上述的節(jié)省資源的方式是不正確的。 通過查看datasheet的中RAM能夠配置的方式,從而能夠正確的使用RAM資源,從而達(dá)到高的利用效率?梢钥闯觯琑AM9K其應(yīng)用方式受限,主要是因為RAM的端口的連接信號受限,例如:該RAM9K的讀端口最大支持36根信號線,因此對于單端口其支持的寬度為36,雙端口為18(兩個端口,總共36根數(shù)據(jù)線),作為FPGA來說,其布線資源是有限的,不可能無限制的增加其端口數(shù)。 RAM例化時,有時需要初始化RAM,ALTERA和XLINX的初始化方法如下所示: (1)ALTERA RAM中,例化時為MIF文件,其格式為: DEPTH = 32; -- The size of memory in words WIDTH = 8; -- The size of data in bits ADDRESS_RADIX = HEX; -- The radix for address values DATA_RADIX = HEX; -- The radix for data values CONTENT -- start of (address : data pairs) BEGIN 00 : 0; -- memory address : data 01 : 1; END; (2)在XILINX的RAM中,RAM出示化文件為COE文件,其格式為: MEMORY_INITIALIZATION_RADIX=2; 設(shè)定進(jìn)制 MEMORY_INITIALIZATION_VECTOR= 初始化向量 值得注意的是:XILINX的RAM初始化后會自動生成MIF文件,而此mif文件與ALTERA mif文件格式不同。不能用于初始化ALTERA的 RAM。 鑒于例化不同IP的復(fù)雜性,現(xiàn)在編譯工具也支持利用VERILOG語言來描述RAM,而編譯工具自動識別為RAM,自動產(chǎn)生相應(yīng)的IP核,下面以XILINX的EDA工具為例簡要介紹。 module ram( clk, wr,addr,din,dout ); input clk; input [7:0] addr; input wr; input [31:0] din; output [31:0] dout; reg [31:0] mem [0:255]; reg [31:0] dout; always@(posedge clk) if(wr) mem[addr] FPGA內(nèi)部一種基本資源,掌握RAM的特性和基本用法,則是FPGA工程師的基本技能,能夠充分利用FPGA內(nèi)部的資源,畢竟對于FPGA來說“資源就是金錢”,節(jié)省資源就是省錢。 |