0

我对 FPGA 和 Verilog 真的很陌生。我一直在研究控制 Noritake Itron VFD 显示器的 Tri-SPI PHY。我想要实现的功能之一是 FPGA 本身的帧缓冲存储器。我正在使用具有 64kbit BRAM (8Kbytes) 的 iCE40LP1K。但是 Verilog BRAM Primitive 是 4kbit,我需要 3003 字节作为缓冲区。

问题是如何级联 BRAM?在数据表(请参阅 iCE40 LP/HX 系列数据表,第 2-6 页)中提到使用多个 BRAM。有没有办法可以使用多个 SB_RAM40_4K 实例?后者将其视为一个大型 mem 数组。

4

2 回答 2

0

通常,您会使用 FPGA 制造商提供的一些工具。您有一些向导可以实例化您需要的 IP,这是很常见的(甚至可能是允许的)。

在这样的向导/编辑器/生成器中,您将选择所需的内存类型(单/双端口、宽度、深度等),该工具将生成将实例化所需硬件块的文件。该向导负责以最佳方式执行此操作,例如使用最小宽度和最大深度拼接 ram 块,以尽量减少多路复用器上浪费的元素数量。

于 2021-11-16T13:40:53.490 回答
0

我可以按照自己的意愿成功使用 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
于 2021-11-26T16:43:12.443 回答