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文件的格式