zoukankan      html  css  js  c++  java
  • 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引脚上。



    修改代码后,

     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。因此




        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。








  • 相关阅读:
    干掉:“请停用以开发者模式运行的扩展程序”
    电脑分区
    tomcat进行远程debug
    工作流审核到最后一步迟迟不能完成
    DataGrid首次进入页面时,不加载任何数据[转]
    用Excel进行个人敏捷项目看板管理
    cnblogs的编辑器BUG反馈:发布或编辑文章完成后,页面是卡死状态的
    程序员如何优雅地挣零花钱?
    SQL Server导入数据报错"无法在只读列“Id”中插入数据",几百个表怎么批量启用'启用标识插入'选项
    SQL Server 各版本发布时间、开发代号及下载地址
  • 原文地址:https://www.cnblogs.com/pejoicen/p/f17f607946bc96436d54bd940f5f86f8.html
Copyright © 2011-2022 走看看