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

2015-10-16 21:42 1003 26 28 分类: FPGA/CPLD
 (三)INIT模块状态机

1.gif

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

      1. 上电后进入IDLE状态

      2. IDLE状态下

   自动进入POWER_ON状态

      3. POWER_ON状态下

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

      ? 200us:在发除了NOPINHIBIT之外的指令之前必须先延时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结束标志。

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

  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状态。

2. W_REQ_STATE状态下

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

3. ACT_STATE状态下

发送ACT命令,并延迟tRCD=3 cyclesact_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状态机

4.gif
 

  1. IDLE状态下

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

2. R_REQ_STATE状态下

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

3. ACT_STATE状态下

发送ACT命令,并延迟tRCD=3 cyclesact_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.仿真时,要看接口的波形,而不要看当前模块的波形 。

文章评论2条评论)

登录后参与讨论

用户1847035 2015-12-27 12:50

在里面逛了逛,谢谢分享这个网址!

用户1016120 2015-12-22 08:52

我認為最快的方法是使用 mbed 標準去寫,這樣不受限於任何廠牌的ARM https://developer.mbed.org/platforms/

83642879_827020636 2015-10-16 21:43

可以看了

用户616421 2015-10-16 11:50

hi 为什么看不到图片呢?
相关推荐阅读
洋仔 2023-03-07 19:51
时钟约束小练习
400m时钟使用sigma_delta算法产生(a)m的时钟使能clk_en,用来平滑156m时钟带来的vld(vld是有缺口的),然后使用400m时钟与clk_en进行时钟的2分频,产生clk_b,...
洋仔 2022-07-05 16:23
PRBS码型生成器&验证器结构
1.生成器结构2.验证器结构        PRBS Error :高电平有效,代表出错...
洋仔 2022-01-12 11:15
基于vcs+uvm+xilinx ip的仿真平台的半自动化搭建
1. 总体概述1.1软件环境   系         统:ubuntu 18.04&nbs...
洋仔 2021-12-24 09:35
Vivado仿真UVM
1.修改仿真配置在Settings->Simulation->1.1Target simulator为默认配置Vivado Simulator1.2在以下位置修改配置Compliation->xsim...
洋仔 2021-12-23 17:30
Vivado调用VCS仿真
1.编译仿真库Tools->Compile Simulation Libraries在Simulator executable path中添加vcs 仿真器可执行文件的位置2.修改仿真配置在Setti...
洋仔 2021-07-06 15:40
Vivado的一些tcl命令记录(待补充)
1.Report Clock Networks  report_clock_networks -name {network_1}2.分析设计中逻辑级数的分布  report_des...
我要评论
2
26
关闭 站长推荐上一条 /2 下一条