背景
ram是非常常用的ip,前人的经验告诉我们,如果不对ram进行初始化直接读写,不定态在实际上板时会出现不可预知的问题。
我们需要对ram进行初始化写0操作,代码如下。需要注意,复位释放时立马写入可能存在复位抖动的造成ram写入失败的问题,因此可以选择复位后增加一定的延时。
当inital_done信号拉高以后才允许系统开始工作。
下面是复位初始化ram的代码:
parameter C_ADDR = 10;//ram地址位宽 DEPTH = 1024
parameter C_WIDTH = 10;//ram数据位宽
reg s_initial_delay_flag ; //延迟标志
reg [6:0] s_initial_delay_cnt ; //延迟计数器 128 clk
reg [C_ADDR-1:0] s_init_ram_addr ; //初始化写地址
reg s_init_ram_wr ; //初始化写势能信号
reg s_ram_initial_done ; //初始化完成标志
always@(posedge i_clk)begin
if(i_rst)begin
s_initial_delay_cnt <= 7'd0;
s_initial_delay_flag <= 1'b0;
end
else if(s_initial_delay_cnt == 7'b111_1111)begin//计数器结束条件
s_initial_delay_cnt <= s_initial_delay_cnt;
s_initial_delay_flag <= 1'b1;
end
else begin
s_initial_delay_cnt <= s_initial_delay_cnt + 7'd1;
s_initial_delay_flag <= s_initial_delay_flag;
end
end
always@(posedge i_clk)begin
if(i_rst)begin
s_init_ram_addr <= 7'd0;
s_init_ram_wr <= 1'b0;
s_ram_initial_done <= 1'b0;
end
else if(s_init_ram_addr == {C_ADDR-1{1'b1}})begin//
s_init_ram_addr <= s_init_ram_addr;
s_init_ram_wr <= 1'b0;
s_ram_initial_done <= 1'b1;
end
else if(s_initial_delay_flag) begin
s_init_ram_addr <= s_init_ram_addr + 7'd1;
s_init_ram_wr <= 1'b1;
s_ram_initial_done <= 1'b0;
end
end
//例化ram
//initial data = {C_WIDTH-1{1'b0}}