FPGA实现SDRAM接口(3)--自动刷新

文章来源:FPGA技术联盟

1、刷新

     SDRAM 内部存储体是利用电容能够保持电荷以及可充放电的特 性制成,而电容所存储的电荷会随时间不断流失,会造成存储数据的丢失。为保证 SDRAM 中数据的可靠性,需要对 SDRAM 进行不断刷新。

     从SDRAM的名字(synchronous dynamic random-access memory,同步动态随机存取内存)中的Dynamic也可以看出SDRAM是一种需要刷新的器件。SDRAM 的刷新方式分为自刷新和自动刷新两种,这两种刷新方式,在实现和作用上存在差异。

  • 自动刷新模式是在 SDRAM 的正常操作过程中,保证数据不丢失,自动刷新过 程需要外部时钟的参与,但刷新行地址由内部刷新计数器控制,无需外部写入

  • 自刷新模式则主要用于休眠模式低功耗状态下的数据保存,自刷新过程无需外部时钟参与,与自动刷新相同的是,刷新行地址由内部刷新计算器控制,无需外部写入

     两者的操作命令相同,当 CKE信号保持高电平时,写入刷新指令,进入自动刷新模 式;当CKE 信号为低电平时,写入刷新指令,进入自刷新模式。

     本系列文章因为后续不涉及SDRAM的休眠模式,所以本文只讲SDRAM的自动刷新操作。接下来,以Mircon公司的SDRAM芯片MT48LC64M4A2的数据手册为例,学习一下SDRAM的自动刷新操作,并进行仿真验证其正确性。

2、自动刷新

     需要注意,SDRAM的所有操作都需要在完成初始化操作后才能进行,自动刷新操作自然也不例外。下图是MT48LC64M4A2的自动刷新时序图:

1.png

各信号说明如下:

    CK:工作时钟,具体时钟频率视不同的芯片而不同 

     CKE:时钟使能,在整个初始化过程中都需要拉高

     COMMAND:SDRAM命令,由4根线拼接而成,分别是CS#(片选信号),RAS#(行选通信号),CAS#(列选通信号),WE#(写使能信号),通过这4根命令线,再结合SDRAM的地址、输入输出数据等,就可以对SDRAM进行各种命令操作

     DQM/DQML,DQMU:数据掩码,通过数据掩码可以实现对输入或输出数据的某一位进行“掩埋”,也就是使某一位失效

     A[9:0],A[12:11]:数据地址线,同时也可用来设置模式寄存器

     A10:数据地址线,同时也可以用来使能一些具体操作,比如控制自动预充电使能、使能预充电bank数量

     BA[1:0]:bank地址

     DQ数据:在初始化过程中无数据输出,保持高阻态就行

通过对时序图的分析可以总结出初始化过程如下:

     1.对所有BANK进行预充电操作,A10拉高即是选中所有BANK

     2.进行预充电操作后需要等待一定的时间,即tRP,在此期间同样需要发送NOP空指令(发送空指令是为了防止对SDRAM进行误操作)

     3.等待结束后发送自动刷新指令

    4.进行自动刷新操作后需要等待一定的时间,即tRFC,在此期间同样需要发送NOP空指令(发送空指令是为了防止对SDRAM进行误操作)

     5.重复进行发送自动刷新指令与等待tRFC

     6.tRFC等待时间结束后,SDRAM 自动刷新完成

3、状态机

     根据自动刷新的时序图,不难绘制出如下状态机:

2.png

对各个状态、状态跳转条件、输出进行说明:

  • ATREF_IDLE:   初始状态,直到初始化完成后且仲裁模块发送自动刷新使能信号后,跳转至下一状态ATREF_PRE,在此状态发送NOP指令

  • ATREF_PRE:    发送预充电指令状态、只维持一个时钟周期、下个时钟就跳转到状态ATREF_TRP,在此状态发送预充电指令

  • ATREF_TRP:    预充电指令等待状态、在此状态等待时间满足TRP后就跳转到下一个状态ATREF_AR,在此状态发送NOP指令  

  • ATREF_AR:      发送自动刷新指令状态、只维持一个时钟周期、下个时钟就跳转到状态ATREF_TRFC,在此状态发送自动刷新指令    

  • ATREF_TRFC: 自动刷新指令等待状态、在此状态等待时间满足TRFC时进行判断,若自动刷新次数满足要求(2次)后就跳转到下一个状态ATREF_END,在此状态发送NOP指令,若不满足自动刷新次数要求就继续进行自动刷新操作,跳转到状态ATREF_AR

  • ATREF_END:   自动刷新结束状态,完成自动刷新后停留在这个状态一个周期;在此状态发送NOP指令,并发送一个自动刷新完成脉冲信号以通知仲裁模块自动刷新结束

4、接口定义与整体设计

     Verilog编写的SDRAM自动刷新模块的整体框图、输入输出信号如下所示:

3.png

 其中信号描述如下表:

4.png


5、Verilog代码

     有如下两点需要特别注意:

自动刷新机制:

     因为SDRAM的操作有自动刷新、和读、写。在SDRAM进行刷新的时候,肯定是不能进行读或写,同理,进行读写的时候也不能进行自动刷新,为了反正自动刷新与读写冲突、或者读、写冲突,所以或许还需要设计一个仲裁模块。

     当自动刷新模块需要进行自动刷新时,需要给仲裁模块发送自动刷新请求,仲裁模块根据当前SDRAM的工作状态进行判断,能否响应这个自动刷新信号;当自动刷新信号可以被响应,仲裁模块发送自动刷新使能给自动刷新模块。自动刷新模块接收到使能信号后开始进行自动刷新操作,刷新完成后发送结束信号给仲裁模块,以便仲裁模块进行下一次的判断。

自动刷新时间:

      根据数据手册,可知道MT48LC64M4A2的刷新要求是  64ms完成所有行(8192行)的刷新,换算下来就是7.8125us要完成一次刷新操作。考虑到裕量,这里通过localparam例化的方式将其选定为7us。

      根据上述状态机描述、整体设计不难编写出模块实现的Verilog代码:

5.png

6.png

7.png

8.png

9.png

10.png

11.png


代码是用三段式状态机写的,其实用线性序列机也可以,只是三段式的会规范点。

6、Testbench

     Testbench除了例化了上面编写的SDRAM初始化模块外,还例化了一个PLL模块,分别输出50M、100M和相位偏移-30°的100M时钟信号(PLL模块就不给出了,都看到SDRAM了,不可能PLL都不会吧?),还有之前设计的SDRAM初始化模块,SDRAM的所有操作都需要在初始化完成后才能进行。

     除此之外还例化了一个网上找的SDRAM的仿真模型sdram_model_plus,作者是李晟、陈乃奎、罗瑶。

12.png

13.png

14.png

15.png

16.png


7、仿真结果

     仿真结果截取如下:

17.png


上图:

  • 在计数器cnt_atref计时到700后清零,此时init_end为高电平,所以拉高自动刷新请求

  • 仲裁模块(模拟的)接收到刷新请求后发送刷新使能信号给自动刷新模块

  • 自动刷新模块接收到刷新使能信号后跳转到预充电状态ATREF_PRE

  • 发送预充电指令后,进行等待,满足2个时钟的TRP时序要求后进行第一次自动刷新操作

  • 发送第一次自动刷新操作指令后,进行等待,满足7个时钟的TRFC时序要求后机型第二次自动刷新操作

  • 等待到满足7个时钟的TRFC时序要求后跳转到状态ATREF_END

  • 在状态ATREF_END拉高atref_end一个周期,通知给仲裁模块自动刷新操作完成

  • 因为输出是用的时序逻辑,所以输出会落后条件一个时钟周期

     modlesim命令窗口打印的信息如下:

18.png


 可以看到:

  • 在第一次初始化完成后约7us后进行了第一次自动刷新操作;

  • 后续的几次自动刷新操作间隔为7us 。

最新文章

最新文章