基于FPGA的图像采集之三 SDRAM控制器 (二)

文章详细描述了SDRAM的INIT模块状态机流程,包括上电后的IDLE到POWER_ON,再到PRECHARGE、NOP、AUTOREFRESH和MRS等状态的转换。强调了刷新流程的时间限制和刷新请求的处理。此外,还介绍了WRITE和READ状态机的工作机制,特别是如何处理写操作和读操作的中断,以及刷新命令的影响。文章提醒读者注意时序设计的重要性,避免文档和代码的疏漏导致的问题。
摘要由CSDN通过智能技术生成

(三)INIT模块状态机
1.gif

SDRAM必须在一个预定义的模式下上电和初始化:

  1. 上电后进入IDLE状态

  2. 在IDLE状态下

自动进入POWER_ON状态

  1. 在POWER_ON状态下

延时200us给出Precharge指令并进入PRECHARGE状态。

? 200us:在发除了NOP与INHIBIT之外的指令之前必须先延时200us

? Precharge指令:用来去激活某一特定BANK中的open row(已激活的行),或者所有BANK中的open row。

  1. 在PRECHARGE状态下

自动进入NOP状态,重复4-6两次。

  1. 在NOP状态下

满足延时要求后,如果发送REF指令,跳入AUTOREFRESH状态,如果发送MRS命令,跳入MRS状态

?满足延时要求:根据手册,每两个指令之间都有一定的延时,来满足指令的执行。

REF指令:执行AUTOREFRESH(自动刷新)操作,将被刷新的BANK与行地址将会自动完成该操作。

  1. 在AUTOREFRESH状态下

    自动跳转到PRECHARGE状态

  2. 在MRS状态下

    自动跳转回NOP状态。延时一定周期发送INIT结束标志。

(四)刷新流程图(图片已经调到最小了,还是这个样子)

2.gif

具体流程如下:

1.接收到init_end==1,定时器timer开始。

2.经过12us的定时器,产生一个flag_12us的标志。

3.根据flag_12us发送刷新请求。

4.主模块接收到刷新请求,返回一个刷新使能信号,当该信号有效时,发送刷新命令。

5.刷新结束后,产生一个结束标志,结束刷新操作。

(五)WRITE状态机

3.gif

  1. 在IDLE状态下

等待,检测到w_req_lvds信号有效,跳转到W_REQ_STATE状态。

  1. 在W_REQ_STATE状态下

检测到w_en信号有效,跳转到ACT_STATE状态。

  1. 在ACT_STATE状态下

发送ACT命令,并延迟tRCD=3 cycles,act_end信号有效,并跳转到WRITE状态。

  1. 在WRITE状态下

检测到w_row_end1或者burst_end1,跳转到BREAK状态。

A.w_row_end==1,发送完一行数据结束。

B.burst_end==1,写突发时被刷新命令打断操作。

  1. 在BREAK状态下

使能break_end信号,若同时w_row_end_flag1,跳转到IDLE状态;若burst_end_flag1,跳转到W_REQ_STATE状态。

(六)READ状态机

4.gif

  1. 在IDLE状态下

等待,检测到read_req信号(来自GEN模块)有效,跳转到R_REQ_STATE状态。

  1. 在R_REQ_STATE状态下

检测到r_en信号有效,跳转到ACT_STATE状态。

  1. 在ACT_STATE状态下

发送ACT命令,并延迟tRCD=3 cycles,act_end信号有效,并跳转到READ状态。

  1. 在READ状态下

检测到r_row_end1或者r_burst_end1,跳转到BREAK状态。

A.r_row_end==1,读完完一行数据结束。

B.r_burst_end==1,读突发时被刷新命令打断操作。

  1. 在BREAK状态下

使能break_end信号,若同时r_row_end_flag1,跳转到IDLE状态;若r_burst_end_flag1,跳转到R_REQ_STATE状态。

三.我走的弯路,希望你们不要走

1.时序要卡好:波形是设计出来的,而不是看仿真堆出来的。

2.有两种情况a)一行写完 跳转回IDLE状态 。b)被刷新打断 跳转回w_req_state状态。

写文档时没有写出b)情况的时序,理所当然的认为情况差不多,后面修改代码时更不想画时序,根据仿真波形改,由于信号实在太多,有些信号相互之间又打拍,导致代码修改起来很痛苦。

文档要设计好,不要想当然。

3.中间修改代码时,将某些组合逻辑改为时序逻辑,状态机以及一些变量的时序都要修改,而某些信号的漏改,导致命令没有对应上。

4.在刷新被打断的情况下,lvds_test模块的地址什么时候保持,什么时候加,要控制约束。

5.仿真时,要看接口的波形,而不要看当前模块的波形 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下一个雨天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值