马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 南竹轩 于 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菜鸟的求学之路。。。。。。。。
|