【xilinx DDR3 初探1】用户接口刷新问题

时间:2024-03-29 22:51:14

 

转载自EETOP http://bbs.eetop.cn/thread-875310-1-1.html

【背景】一年多没有写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】
【xilinx DDR3 初探1】用户接口刷新问题
1.2 尝试自动刷新操作
 
刷新信号
现象
结论
1
app_ref_req,app_zq_req,app_sr_req
刷新后app_rdy等信号短时拉高,读写基本要长时间等待
 
2
app_ref_req,app_zq_req
IP核可用,app_rdy持续拉低的时间变多
 
3
app_ref_req
IP核可用,app_rdy拉低间隔不等
 
4
不刷新
   







 

刷新代码修改如下:
                        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核出问题。


 

【xilinx DDR3 初探1】用户接口刷新问题

 

【操作2】 停止手动刷新app_sr_req新号,IP核工作正常,但是在2333和3057这两个时刻,app_rdy拉低似乎比不刷新的时候拉低的频率更高。


 

【xilinx DDR3 初探1】用户接口刷新问题

 

【操作3】只刷新ref_req信号,app_rdy长时间拉低的情况仍然存在。

 

【xilinx DDR3 初探1】用户接口刷新问题

 

【操作4】 不刷新
【空闲地方】往往在读数据的时候出现,他的间隔反倒为1480的整数倍,非常标准;1480,2960,4440!!
【app_wdf_rdy】偶尔拉低一拍,数据要等一下;

 

【xilinx DDR3 初探1】用户接口刷新问题
App_wdf_rdy偶尔拉低一拍的时间间隔也是1480Tclk,和app_rdy偶尔出现的拉低间隔是一致的,这里是巧合吗?

 

【xilinx DDR3 初探1】用户接口刷新问题


 

1.3 app_rdy拉低时间分析
读取时间拉低前面4Tclk后面14Tclk。数据读出时间为段1+17Tclk ;也就是读取数据经过fifo至少需要缓存18+1(后面也会顿一拍)个数据。

 

【xilinx DDR3 初探1】用户接口刷新问题


 

【xilinx DDR3 初探1】用户接口刷新问题
【重要】
【读取数据分析】
写数据,一开始,地址比数据提前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菜鸟的求学之路。。。。。。。。