FPGA设计中RAM和ROM初始化的方法-FPGA常见问题社区-FPGA CPLD-ChipDebug

FPGA设计中RAM和ROM初始化的方法

     FPGA设计中RAM和ROM作为存储器用来存储可变或不可变类型的数据,根据使用场景不同有不同的初始化方法。ROM初始化一般是加载固定数据,RAM声明时默认为不定态数据,初始化时可以让数据为全1或者全0.

RAM的初始化方法

方法1:小型RAM复位时按地址写入初值

针对小型的RAM可以直接在复位时按地址写入初值,实例如下。

always @(posedge Wr_clk or negedge rst_n)begin
    if (!rst_n) begin
        Mem[0] <= 24'b0;
        Mem[1] <= 24'b0;
        Mem[2] <= 24'b0;
        Mem[3] <= 24'b0;
        Mem[4] <= 24'b0;
    end
    else if (Wr_en) begin
        Mem[Wr_addr] <= Wr_data;
    end
    else begin
        Mem[Wr_addr] <= Mem[Wr_addr];
    end
end

 

方法2:大型RAM通过init和for循环来初始化

针对大型的RAM可以通过init和for循环来进行初始化

 

 

方法3:大型RAM通过读文件形式初始化

RAM还可以使用读.dat文件,.mif文件等方式进行初始化。这种方式RAM使用较少,一般ROM初始化时喜欢采用这种做法。

parameter   INIT_FILE = "../dat/ram_init.dat"
reg [DATA_WIDTH-1:0]    ROM [(2**ADDR_WIDTH)-1:0];
 
initial
begin: read_file_BIN
    $readmemb(INIT_FILE, ROM);
end

 

ROM的初始化方法

方法1:小型ROM按地址写入初值

针对小型的ROM可以直接按地址写入初值,实例如下。

always @ (posedge Clk or negedge Rst_n)begin
    if(!Rst_n)begin
        Rom_data_0[0]   <= 24'd0;
        Rom_data_0[1]   <= 24'd0;
        Rom_data_0[2]   <= 24'd0;
        Rom_data_0[3]   <= 24'd0;
        Rom_data_0[4]   <= 24'd0;
        Rom_data_0[5]   <= 24'd0;
    end
    else if(Rom_cs == 1'b1)begin        // ‘A’
        Rom_data_0[0]   <= 24'b000000000011000000000000;
        Rom_data_0[1]   <= 24'b000000001100110000000000;
        Rom_data_0[2]   <= 24'b000000111000011100000000;
        Rom_data_0[3]   <= 24'b000001110111101110000000;
        Rom_data_0[4]   <= 24'b000011100000000111000000;
        Rom_data_0[5]   <= 24'b000111000000000011100000;
    end
    else begin
        Rom_data_0[0]   <= 24'd0;
        Rom_data_0[1]   <= 24'd0;
        Rom_data_0[2]   <= 24'd0;
        Rom_data_0[3]   <= 24'd0;
        Rom_data_0[4]   <= 24'd0;
        Rom_data_0[5]   <= 24'd0;
    end
end

 

方法2:大型ROM通过读文件形式初始化

大型ROM多数采用加载mif或者dat文件的格式

 

请登录后发表评论