SRAM的拼接
存储器中有深度和宽度,深度对应字扩展(word),宽度对应位扩展(bit),在一个存储器模型中,可以把存储器表示成4096*64,那么4096对应存储器的深度,64对应存储器的宽度。2^n=4096,n=12即代表该存储器需要的地址数。
在soc设计中,往往存储器的模型达不到我们需要的标准,这个时候就需要进行字或者位的拼接。字扩展即扩展深度,需要串联存储器;位扩展即扩展宽度,即并联存储器。以下举一个简单的例子来说明。
2048x32的存储器要拼接4096x64的存储器:
2048x32->2048x64,通过位扩展即扩展宽度来完成,采用并联的方式。两个需要例化的ram_addr和en接一样的信号,输出data是两个2048x32的拼接,一个为high一个low,分别是低32bit和高32bit,这样就完成了宽度的扩展。
2048x64->4096x64,通过字扩展即扩展深度来完成,采用串联的方式。深度为4096需要12位地址,深度为2048需要11位地址。要完成深度的扩展,首先需要了解字扩展的规则。
存储器在串联时,需要将地址码分成两个部分,一部分送芯片地址线,一部分经译码后送存储芯片的片选位。译码方式有很多种,如2-4译码器等等。
对于该存储器,低11位地址接前两个ram,第12位做片选信号,其他信号接2048x32的各信号,示例代码如下:
12345678910111213141516171819202122SOC_ram_2048X64 ram_2048X64_h(
.rd_clk(rd_clk)
,.wr_clk(wr_clk)
,.wr_addr(wr_addr[10:0])
,.rd_addr(rd_addr[10:0])
,.wr_data(wr_data)
,.rd_data(rd_data)
,.wea(wea)
,.rd_en((!sel_en)|rd_en)
,.wr_en((!sel_en)|wr_en)
);
SOC_ram_2048X64 ram_2048X64_l(
.rd_clk(rd_clk)
,.wr_clk(wr_clk)
,.wr_addr(wr_addr[10:0])
,.rd_addr(rd_addr[10:0])
,.wr_data(wr_data)
,.rd_data(rd_data)
,.wea(wea)
,.rd_en(sel_en|rd_en)
,.wr_en(sel_en|wr_en)
);
|