gpt4 book ai didi

verilog - 如何在 Verilog 中初始化推断 block RAM (BRAM) 的内容

转载 作者:行者123 更新时间:2023-12-02 17:42:32 25 4
gpt4 key购买 nike

我在 Verilog 中初始化推断 RAM 的内容时遇到问题。 ram的代码如下:

module ram(
input clock, // System clock
input we, // When high RAM sets data in input lines to given address
input [13:0] data_in, // Data lines to write to memory
input [10:0] addr_in, // Address lines for saving data to memory
input [10:0] addr_out, // Address for reading from ram
output reg data_out // Data out
);

reg [13:0] ram[2047:0];

// Initialize RAM from file
// WHAT SHOULD GO HERE?

always @(posedge clock) begin
// Save data to RAM
if (we) begin
ram[addr_in] <= data_in;
end

// Place data from RAM
data_out <= ram[addr_out];
end
endmodule

我遇到了命令 $readmemh。然而,它的文档似乎很少。我应该如何格式化包含数据的文件?另外,在实例化此模块时如何将文件作为参数传递,以便我可以从不同的文件加载此模块的不同实例?

我希望初始化的内容可用于模拟和实际实现。这样 FPGA 就已经用 RAM 中的内容启动了。

我正在使用 Vivado 2015.4 对 Kintex xc7k70 FPGA 进行编程。

最佳答案

您应该在初始 block 中使用 $readmemh ,这是正确的。为了使模块的不同实例可以有不同的初始化文件,您应该使用如下参数:

parameter MEM_INIT_FILE = "";
...
initial begin
if (MEM_INIT_FILE != "") begin
$readmemh(MEM_INIT_FILE, ram);
end
end

IEEE1800-2012规范第21.4节描述了该格式;通常,该文件只是一堆包含正确位长度的十六进制数字的行,如下所示:

0001
1234
3FFF
1B34
...

请注意,没有“0x”前缀,每行代表一个相邻的地址(或任何分隔的空格)。在上面的示例中,$readmemh 会将 14'h0001 放入 ram[0],将 14'h1234 放入ram[1]14'h3FFF 转换为 ram[2] 等。您还可以使用 ///* */ 在十六进制文件中包含注释。最后,您可以使用 @ 符号指定以下号码所在的地址,如下所示:

@0002
0101
0A0A
...

在上述文件中,ram[0]ram[1] 将未初始化,ram[2] 将得到 14'h0101。这些是十六进制文件格式的所有主要结构,尽管您也可以像在其他 Verilog 数字中一样使用 _xz您可以在上面的部分中阅读更多规则。

关于verilog - 如何在 Verilog 中初始化推断 block RAM (BRAM) 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com