SDRAM初始化模块
(这段时间期末考试,一直比较忙没有学习新的内容,忙完了考试今天来更新一下以前的老知识,顺便回忆一下),大家知道现在的DRAM家族已经有5代了包括SDRAM、DDR2、DDR3、DDR4以及DDR5种。下面就SDRAM为例带大家简单认识一下SDRAM的初始化、自刷新、读、写等功能的实现。
SDRAM初始化
本文以w9812g6kh-75芯片为例来对SDRAM初始化的一个过程进行一个简单的讲解。
SDRAM为什么要进行初始化呢?
原文大概是这么说的,在上电的时候,整个系统的工作模式都是未知的,通过初始化化来保证系统能够按照使用者的需求运行。简单的来说,就是为了能让系统能够按照我们预想的模式运行,需要提前对它进行模式的一个功能配置。
初始化过程?
初始化的一个过程:上电--等待一定时间--预充电--N次刷新操作--工作模式配置--延时一段时间,初始化过程结束
1、为什么需要一定的等待时间?
SDRAM作为一个模拟器件,在刚刚上电的那一瞬间是不稳定的,需要一定的等待时间让电路稳定下来,然后才能对它进行操作,常见的SDRAM最少需要一个100us的延时(但是大多数人写代码的时候,都会给它一个200us的延时)而这款以w9812g6kh-75的SDRAM直接点明了需要一个200us的延时。
同时这里还强调了,为了防止DQ出现竞争险象,在这段等待时间内,需要将DQM和CKE信号进行拉高。
2 预充电过程
当等待时间结束以后开始进行预充电操作,预充电的指令是{cs, ras, cas, we} = 4’b0010(这里说一下,控制整个SDRAM初始化、刷新、读写操作都是受这4个引脚控制的)当指令发出以后,系统进行预充电操作,预充电操作完成以后需要一定的等待时间,这个时间里面系统不执行任何命令使用{cs, ras, cas, we} = 4’b0111空命令(大多数器件对这个等待时间的要求是不低于20ns)
预充电过程中必须对所有BANK进行预充电,此时A10拉高,bank1和bank2全部拉低表示所有bank,其他地址为不关心。
3 刷新过程
在预充电过程结束以后,开始刷新操作,刷新操作的指令是{cs, ras, cas, we} = 4’b0001,这里需要进行多次的刷新操作,上一次刷新到这一次刷新是具有一定时间间隔的(大多数SDRAM器件的刷新次数不低于两次,刷新时间一般不低于63ns,所以在写代码时一般都是两次刷新配上一个80ns的时间间隔)
w9812g6kh-75系列的刷新等待时间是不低于60ns,我们就将这段时间间隔取80ns,文中提到了在模式配置之前或之后需要进行8次的自动刷新操作而不是两次(这芯片也是够奇葩的,就是不走寻常路呗,别人2个我就8个我气死你,哈哈哈)。
4模式配置过程
这个模式配置,主要是对SDRAM的地址位进行配置,现在的SDRAM基本上都是13位的地址位了,它的一个配置模式图如下图所示。
本文的模式配置是init_addr = 13’b0_0000_0011_0010表示采用写突发模式,具有三个潜伏周期,采用连续突发,突发长度为4。
下面简单的写一下这款sdram的初始化代码
这里写的比较简单,时钟周期采用的是20ns,通过线性序列机来完成它指令的一个跳转,稍微有点不太规范,标准一点的话可以采用状态机来完成各个指令的跳转。这里只写了sdram初始化的程序,仿真的话还需要写一个SDRAM的顶层通过仿真模型来进行验证,这里就不在将这些代码贴出来了,直接看仿真结果吧。