DDR 复位

将FPGA代码和实际的数字电路对应起来。   



always @ (negedge clk_ref_200)

    begin
    if(ddr3_init_done)     //DDR3 没起来的时候,计数器开始计数。
         ddr_init_cnt<=28'b0;
    else
         ddr_init_cnt<=ddr_init_cnt+1;    //计数器
    end

    always @ (negedge clk_ref_200)
    begin
    if(ddr3_init_done)
        begin
            ddr_init_rst<=1'b0;    //现在感觉这个多此一举。只需要根据计数器的情况对复位信号进行控制即可。
        end
    else
        begin    //实际想实现的功能是,DDR3 的init done信号没起来的时候,计数器开始计数当记到一定数时复位DDR3,然后一段时间后释放复位。
            if(ddr_init_cnt[27]==1'b1)
                ddr_init_rst<=1'b0;
            else if(ddr_init_cnt[27:26]==2'b11)  //明显有问题,这两个判断条件相互冲突。并且是ddr_init_cnt[27:26]==2'b11时将DDR3复位信号置1.但是释放复位的条件不对。
                ddr_init_rst<=1'b1;
        end
    end


RTL图可以看到,ddr_init_cnt[27:26]==2'b11时,ddr_init_rst_i__0输出1,并且连接到ddr_init_rst_reg的set引脚上,产生DDR3 复位信号。

ddr_init_rst_i的S引脚上连接的是ddr3_init_done信号,当ddr3_init_done为1时,ddr_init_rst_i输出1,连接到ddr_init_rst_reg的rst引脚上。

671019-20160216120654407-2041337027.png



修改代码后,

 always @ (negedge clk_ref_200)

    begin

    if(ddr3_init_done)

        begin

            ddr_init_cnt<=28'b0;

        end

    else

        begin

           ddr_init_cnt<=ddr_init_cnt+1;

        end

    end


    always @ (negedge clk_ref_200)

    begin

    if(ddr3_init_done)

        begin

            ddr_init_rst<=1'b0;

        end

    else

        begin

            if(ddr_init_cnt[27]==1'b1)

                ddr_init_rst<=1'b1;

            else if(ddr_init_cnt[27:26]==2'b11)

                ddr_init_rst<=1'b0;

        end

    end

   

always @(posedge clk_ref_200) begin ddr_init_rst_r   <= ddr_init_rst    ; end


下图中可以看到,ddr_init_rst_i__0的S引脚上为2B'11时输出1,然后ddr_init_rst_i__1的S引脚上为1'b1时,输出1。因此

671019-20160216120655767-130271298.png



    always @ (negedge clk_ref_200)

    begin

    if(ddr3_init_done)

        begin

            ddr_init_cnt<=28'b0;

        end

    else

        begin

           ddr_init_cnt<=ddr_init_cnt+1;

        end

    end


    always @ (negedge clk_ref_200)

    begin

    if(ddr3_init_done)   //实际上,ddr_init_rst复位是没有什么必要的。

        begin

            ddr_init_rst<=1'b0;

        end

    else

        begin

            if(ddr_init_cnt[27:26]==1'b10)   //应该是2'b

                ddr_init_rst<=1'b1;

            else if(ddr_init_cnt[27:26]==2'b11 || ddr_init_cnt[27:26]==2'b00 || ddr_init_cnt[27:26]==2'b01)

                ddr_init_rst<=1'b0;

        end

    end

   

always @(posedge clk_ref_200) begin ddr_init_rst_r   <= ddr_init_rst    ; end


因为       if(ddr_init_cnt[27:26]==1'b10)   //应该是2'b  写错,导致下面ddr_init_rst_i和ddr_init_rst_i的S引脚上为“00”时输出为1。应该ddr_init_rst_i和ddr_init_rst_i的S引脚上为“10”时输出为1。

671019-20160216120657032-264964903.png







转载于:https://www.cnblogs.com/pejoicen/p/f17f607946bc96436d54bd940f5f86f8.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vivado中进行DDR复位的步骤如下: 1. 首先,在设计中找到与DDR相关的模块或IP核,并确定DDR3芯片的型号设置。根据引用的信息,可以选择适合的DDR3芯片型号。 2. 确定DDR的时序和时钟设置。根据引用和,DDR3的用户读写时钟为100MHz,可以利用用户提供的系统时钟来生成这个时钟。 3. 在Vivado设计界面中,打开Block Design视图。在该视图中,可以看到连接到DDR的各个信号线。 4. 找到与DDR复位相关的信号线。通常,DDR复位信号线会有一个名为"reset"或者"reset_n"的信号。 5. 根据设计需求,在设计界面中添加一个适当的复位控制电路。这可以是一个寄存器、一个状态机或者其他类型的逻辑电路。 6. 将复位控制电路连接到DDR复位信号线上。确保复位控制电路的输出正确地连接到DDR复位信号线的输入。 7. 在设计中生成位文件并进行综合、布局和布线。确保在这些步骤中,复位控制电路正常工作,并将DDR复位信号正确地传递给DDR芯片。 8. 进行仿真和验证。使用适当的测试模式和数据,确保DDR复位功能正常并且DDR能够正常工作。 需要注意的是,以上步骤仅提供了一个通用的指导,具体的步骤可能因设计和DDR芯片型号而有所不同。在进行DDR复位之前,请参考相关的文档、手册或者参考设计,以确保正确地配置和操作DDR芯片。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Xilinx VIVADO 中 DDR3(Naive)的使用(1)创建 IP 核](https://blog.csdn.net/weixin_41791315/article/details/126147879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值