SDRAM(4):写操作

一、SDRAM 写状态

1、SDRAM 内部状态机

  粗线表示自动跳转,细线表示满足条件才跳转。经过前面的设计我们此时来到了 IDLE 状态,要完成写模块设计就要考虑两个问题:

(1)IDLE 状态到 WRITE 状态

  ① 在 IDLE 状态需要先给 ACT 命令激活某一行,此时处于 Row Active 状态。

  ② 在 Row Active 状态之后,给 Write 命令则会进入 WRITE 状态。

  ③ 在 WRITE 状态后,再给一次 Write 命令,就可以继续写入数据。

(2)WRITE状态到 IDLE 状态 (经常需要进行刷新操作,必须从 IDLE 状态进入)

  ① 在 WRITE 状态给 PRE 命令,则 SDRAM 将跳出 WRITE 状态进入 Precharge 状态;
  ② 在 Precharge 状态后,会自动进入 IDLE 状态。
 
  注:WRITEA 状态不使用,因为当处于 WRITEA 状态时,它会自动的进入到 Precharge 状态。想要继续进行写操作就要先再次激活行,也就是说 WRITEA 比在 WRITE 状态的工作效率要低很多。
 
2、退出 WRITE情况
  在 WRITE 状态时,有 3 种情况是我们必须要退出 WRITE 状态的。
(1)本次设计已经完全被写完。都写完了肯定得退出 WRITE 状态啊,还折腾啥呢。
(2)SDRAM 需要进行自刷新操作。64ms内至少4096次的刷新操作是必须的,要刷新了就麻利的退出 WRITE 状态去刷新。
(3)数据未写完,但已经填满了 SDRAM 的一行,需要激活下一行。因为每次激活都是激活的一行,所以要换行时得退出 WRITE 进行下一行的激活。
 
二、写操作设计时序分析
1、WRITE 命令时序图
  由写命令时序图中我们可以得到如下信息:
① 其命令为 {CS_n,RAS_n,CAS_n,WE_n} = {4‘b0100}。
② A0-A9 提供 cow 列地址;
③ A11和A12不用管;
④ A10控制是否在突发写完成之后立即执行预充电,即关闭当前行操作。为0时不关闭当行,使其仍处于激活状态,方便紧接着对该行进行新的读写操作。为1时就是进入了 WRITEA 状态,会立即执行预充电即关闭当前行,导致下次进行写又得重新激活该行。本次设计我们 A10 为 0。
⑤ BA0-BA1 提供 Bank 地址。
   (这里没有提及 row 地址,是因为在 WRITE 前是 ROW ACTIVE,这就已经激活了行,因此不用再次激活。)
 
2、WRITE 总时序图
① 给出一个 ACT 命令,同时指明 Bank 和 row。然后等待时间 tRCD。
② tRCD 时间后,给出一个 WRITE 命令,同时指明 Bank 和 col,A10为低电平,然后等待4个时钟周期(突发长度为4)。
③ 不想写了就给一个 PRECHARGE 命令,跳出写状态。如果需要重新写,则要给一个 ACT 命令。
 
三、设计写模块
1、写模块状态转移
  本次设计在 SDRAM 内写入两行数据,方面查看换行等操作的变化。其内部状态机如下所示:
2、写模块时序设计
  本次设计的写模块时序图如下所示:
  具体代码就不贴了。
 
四、仿真验证
  本次仿真只需要在 testbench 中设计一个 wr_trig 信号触发一下写即可,写数据则直接在写模块内部手动赋值,看看有没有错即可。
 

参考资料:[1]威三学院FPGA教程

        [2]开源骚客FPGA教程

原文地址:https://www.cnblogs.com/xianyufpga/p/12237443.html