ram的使用——初始化很重要

背景

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}}
相关推荐
FPGA小迷弟8 小时前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga
码农小韩1 天前
FPGA学习(二)——LED闪烁
fpga开发·verilog·fpga·led·组合逻辑·分频设计
9527华安2 天前
FPGA纯verilog实现DP视频接口,支持2K60帧分辨率,提供3套工程源码和技术支持
fpga开发·音视频·dp
ChaseVLSI2 天前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
9527华安3 天前
FPGA实现ARINC818总线协议,基于GT Transceivers Wizard高速收发器,提供7套工程源码和技术支持
fpga开发·transceivers·arinc818
小蘇的FPGA3 天前
fpga-wide-data-crc32
fpga开发
落雨无风4 天前
fpga板级调试常见问题
fpga开发
码农小韩4 天前
FPGA学习(一)——LED点灯与开发流程
学习·fpga开发·入门·环境配置·仿真·点灯
FPGA小迷弟4 天前
FPGA 与千兆以太网:各类物理接口的形式、区别、使用方法与应用场景详解
tcp/ip·macos·fpga开发·udp·fpga
NamoAmitabha1284 天前
Zynq 的 AXI GPIO,是“ARM 通过一条国际标准高速公路(AXI 总线),去遥控 FPGA 里的一个寄存器”。---deepseek
fpga开发·zynq--ps