tag 标签: sdram读写

相关博文
  • 热度 28
    2015-10-16 21:42
    1007 次阅读|
    2 个评论
       (三)INIT模块状态机   SDRAM 必须在一个预定义的模式下上电和初始化:       1.  上电后进入 IDLE 状态       2.  在 IDLE 状态下    自动进入 POWER_ON 状态       3.  在 POWER_ON 状态下    延时 200us 给出 Precharge 指令并进入 PRECHARGE 状态。       ?  200us :在发除了 NOP 与 INHIBIT 之外的指令之前必须先延时 200us       ?  Precharge 指令:用来去激活某一特定 BANK 中的 open row (已激活的行),或者所有 BANK 中的 open row 。    4. 在 PRECHARGE 状态下 自动进入 NOP 状态,重复 4-6 两次。    5. 在 NOP 状态下  满足延时要求后,如果发送 REF 指令,跳入 AUTOREFRESH 状态,如果发送 MRS 命令,跳入 MRS 状态       ?  满足延时要求:根据手册,每两个指令之间都有一定的延时,来满足指令的执行。       ?  REF 指令:执行 AUTOREFRESH (自动刷新)操作,将被刷新的 BANK 与行地址将会自动完成该操作。    6. 在 AUTOREFRESH 状态下          自动跳转到 PRECHARGE 状态    7. 在 MRS 状态下          自动跳转回 NOP 状态。延时一定周期发送 INIT 结束标志。 (四)刷新流程图(图片已经调到最小了,还是这个样子)   具体流程如下:    1 . 接收到 init_end==1 ,定时器 timer 开始。    2. 经过 12us 的定时器,产生一个 flag_12us 的标志。    3. 根据 flag_12us 发送刷新请求。    4. 主模块接收到刷新请求,返回一个刷新使能信号,当该信号有效时,发送刷新命令。    5. 刷新结束后,产生一个结束标志,结束刷新操作。        (五)WRITE状态机   1.  在 IDLE 状态下 等待,检测到 w_req_lvds 信号有效,跳转到 W_REQ_STATE 状态。 2.  在 W_REQ_STATE 状态下 检测到 w_en 信号有效,跳转到 ACT_STATE 状态。 3.  在 ACT_STATE 状态下 发送 ACT 命令,并延迟 tRCD=3 cycles , act_end 信号有效,并跳转到 WRITE 状态。 4.  在 WRITE 状态下 检测到 w_row_end==1 或者 burst_end==1 ,跳转到 BREAK 状态。 A.w_row_end==1 ,发送完一行数据结束。 B.burst_end==1 ,写突发时被刷新命令打断操作。 5.  在 BREAK 状态下 使能 break_end 信号,若同时 w_row_end_flag==1 ,跳转到 IDLE 状态;若 burst_end_flag==1, 跳转到 W_REQ_STATE 状态。     (六)READ状态机     1.  在 IDLE 状态下 等待,检测到 read_req 信号 ( 来自 GEN 模块 ) 有效,跳转到 R_REQ_STATE 状态。 2.  在 R_REQ_STATE 状态下 检测到 r_en 信号有效,跳转到 ACT_STATE 状态。 3.  在 ACT_STATE 状态下 发送 ACT 命令,并延迟 tRCD=3 cycles , act_end 信号有效,并跳转到 READ 状态。 4.  在 READ 状态下 检测到 r_row_end==1 或者 r_burst_end==1 ,跳转到 BREAK 状态。 A.r_row_end==1 ,读完完一行数据结束。 B.r_burst_end==1 ,读突发时被刷新命令打断操作。 5.  在 BREAK 状态下 使能 break_end 信号,若同时 r_row_end_flag==1 ,跳转到 IDLE 状态;若 r_burst_end_flag==1, 跳转到 R_REQ_STATE 状态。      三.我走的弯路,希望你们不要走 1.时序要卡好:波形是设计出来的,而不是看仿真堆出来的。         2.有两种情况 a)一行写完 跳转回IDLE状态 。 b)被刷新打断 跳转回w_req_state状态。   写文档时没有写出b)情况的时序,理所当然的认为情况差不多,后面修改代码时更不想画时序,根据仿真波形改,由于信号实在太多,有些信号相互之间又打拍,导致代码修改起来很痛苦。  文档要设计好,不要想当然。 3.中间修改代码时,将某些组合逻辑改为时序逻辑,状态机以及一些变量的时序都要修改,而某些信号的漏改,导致命令没有对应上。  4.在刷新被打断的情况下,lvds_test模块的地址什么时候保持,什么时候加,要控制约束。 5.仿真时,要看接口的波形,而不要看当前模块的波形 。