iCE40 FPGA中的级联BRAM



我对FPGA和Verilog非常陌生。我一直在研究控制NoritakeItron VFD显示器的Tri-SPI PHY。我想要实现的功能之一是FPGA本身的帧缓冲存储器。我使用的是iCE40LP1K,它有64kbit BRAM(8KB(。但是Verilog BRAM Primitive是4kbit,我需要3003字节的缓冲区。

问题是如何级联BRAM?在数据表中(参见iCE40 LP/HX系列数据表,第2-6页(提到了使用多个BRAM。有没有一种方法可以让我使用SB_RAM40_4K的多个实例?以及后面的处理为一个大mem阵列。

通常您会使用FPGA制造商提供的一些工具。通常(甚至可能是理所当然的(,您会有一些向导来实例化您需要的IP。

在这样的向导/编辑器/生成器中,您将选择所需的内存类型(单端口/双端口、宽度、深度等(,该工具将生成实例化所需硬件块的文件。该向导负责以最优化的方式完成这项工作,比如使用最小宽度和最大深度缝合ram块,以最大限度地减少复用器上浪费的元素数量。

我能够成功地使用我想要的BRAM。事实证明,我只是将寄存器声明为8位数组。只需确保有输入和输出到该寄存器阵列。由于我需要3004个字节,下面的代码就是我的工作方式:(注意:名称并不重要,Yosys足够聪明,可以映射到SB_RAM40_4k。此外,您还可以更改数组大小和地址位宽(。

module BRAM(
input R_CLK,
input W_CLK,
input [7:0]BRAM_IN,
output reg [7:0]BRAM_OUT,
input [11:0] BRAM_ADDR_R,
input [11:0] BRAM_ADDR_W,
input B_CE_W,
input B_CE_R);
reg [7:0] mem [3003:0];
always@(posedge R_CLK) begin// reading from RAM sync with system clock 
if(!B_CE_R)
BRAM_OUT <= mem[BRAM_ADDR_R];   
end 
always@(posedge W_CLK) begin// writing to RAM sync with Slave SPI clock.
if(!B_CE_W)
mem[BRAM_ADDR_W] <= BRAM_IN;
end
endmodule

最新更新