| 
本帖最后由 南竹轩 于 2020-2-24 17:55 编辑
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 【背景】一年多没有写FPGA代码了,最近开始搞DDR项目,想深入研究一下DDR IP核的三个刷新接口
 【平台】A7 + DDR3
 【结论】结果发现这三个接口刷新与否没有本质区别,不用主动刷新此接口;IP核自己刷新就行;
 
 【步骤】将黑金A7101的代码移植到另一块开发板上,在DDR读写结束的时候,手动将app_ref_req,app_zq_req,app_sr_req等信号拉高一拍,观察刷新效果。
 本来以为刷新的话可以控制app_rdy等信号被拉低的位置的,进而简化读写过程,减小数据输入输出时间,结果发现手动刷新只是徒然增加app_rdy拉低的几率o(╥﹏╥)o
 
 
 调试记录如下:
 
 1. DDR初探 1.1官方说明  【见图片1】  
    
    
            1   1.2 尝试自动刷新操作 | 
 |  |  |  |  |  | app_ref_req,app_zq_req,app_sr_req | 刷新后app_rdy等信号短时拉高,读写基本要长时间等待 | 
 |  |  |  |  | 
 |  |  |  |  | 
 |  |  |  | 
 | 
 | 
 
 
 
 
 
 
 
 刷新代码修改如下:                         READ_END:                         begin              //    state <= IDLE; MEN_REF_TEST                   state <= MEN_REF_TEST;                 app_ref_req <= 1'b1;                 app_zq_req <= 1'b1;                    app_sr_req <= 1'b0;                 app_ack_cnt <= 3'd0;                 app_ack_timeout <= 10'd0;             end              /////////////////////////////////////////             //add by leo,test ref_req, zq_req 
                         MEN_REF_TEST:                         begin                      //state <= IDLE;                     app_ref_req <= 1'b0;                     app_zq_req <= 1'b0;                        app_sr_req <= 1'b0;                     app_ack_cnt <= app_ack_cnt + app_sr_active + app_ref_ack + app_zq_ack;                     app_ack_timeout <= app_ack_timeout + 1;                     if(app_ack_cnt == 2 || app_ack_timeout >= 100)                      begin                         state <= MEN_REF_TEST_END;                         app_ack_cnt <= 0;                         app_ack_timeout <= 0;                     end                  end              MEN_REF_TEST_END:                  state <= IDLE;             //add by leo end  
 
 也就是同时刷新3个信号,结果如下 (0217初探刷新问题) 
 
 【操作1】示例,spec称sr_req需要接地,这里刷新了,IP核出问题。 
 
 
    
    
            2   
 【操作2】 停止手动刷新app_sr_req新号,IP核工作正常,但是在2333和3057这两个时刻,app_rdy拉低似乎比不刷新的时候拉低的频率更高。 
 
  
    
    
            3   
 【操作3】只刷新ref_req信号,app_rdy长时间拉低的情况仍然存在。 
  
    
    
            4   
 【操作4】 不刷新 【空闲地方】往往在读数据的时候出现,他的间隔反倒为1480的整数倍,非常标准;1480,2960,4440!! 【app_wdf_rdy】偶尔拉低一拍,数据要等一下; 
  
    
    
            5   App_wdf_rdy偶尔拉低一拍的时间间隔也是1480Tclk,和app_rdy偶尔出现的拉低间隔是一致的,这里是巧合吗? 
 
    
    
            6   
 
 1.3 app_rdy拉低时间分析 读取时间拉低前面4Tclk后面14Tclk。数据读出时间为段1+17Tclk ;也就是读取数据经过FIFO至少需要缓存18+1(后面也会顿一拍)个数据。 
 
    
    
            7   
 
 
    
    
            8   【重要】 【读取数据分析】 写数据,一开始,地址比数据提前1Tclk(-1)数据中断了1Tclk(-1),地址由于app_rdy中断了10Tclk(+10) 也就是数据写完了后10-1-1=8Tclk后,地址写完了。这个地址不提前,试一下看行不行。。。
 【重要】 【读取数据分析】 从读指令发起APP_CMD=1开始,读取数据有效延时了13Tclk,数据中断19Tclk,如果用FIFO缓冲,读取延时取3Tclk, 总延时为35Tclk = 13+19+3Tclk; 保险起见,提前40Tclk发起读数命令,保证数据可达性; 写数据的话,中间断断续续大概10Tclk,数据写完,但是地址没有写完,等8Tclk写完 (0218提出3个问题) 
 
 
 另外,黑金A7101开发板的程序写的真的很不错,接口加一个fifo就可以搞定了,赞一个! 
 下一次写一写黑金代码解读吧。 
 
 FPGA菜鸟的求学之路。。。。。。。。 
 
 
 |