首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iCE40现场可编程门阵列中的级联BRAM

iCE40现场可编程门阵列中的级联BRAM
EN

Stack Overflow用户
提问于 2021-11-16 12:51:41
回答 2查看 100关注 0票数 0

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-26 16:43:12

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-11-16 13:40:53

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69989510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档