1、SDRAM内部的逻辑Bank
由于SDRAM的工作原理限制,单一的L-Bank将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在SDRAM内部分割成多个L-Bank,较早以前是两个,目前基本都是4个,这也是SDRAM规范中的最高L-Bank数量。
这样,在进行寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与列进行寻址。
2、SDRAM的引脚与封装
这里需要说明的是,与DIMM一样,SDRAM有着自己的业界设计规范,在一个容量标准下,SDRAM的引脚/信号标准不能只考虑一种位宽的设计,而是要顾及多种位宽,然后尽量给出一个通用的标准,小位宽的芯片也许会空出一些引脚,但高位宽的芯片可能就全部用上了。不过容量不同时,设计标准也会有所不同,一般的容量越小的芯片所需要的引脚也就越小。
1、首先,我们知道内存控制器要先确定一个P-Bank的芯片集合,然后才对这集合中的芯片进行寻址操作。因此要有一个片选的信号,它一次选择一个P-Bank的芯片集(根据位宽的不同,数量也不同)。被选中的芯片将同时接收或读取数据,所以要有一个片选信号。
2、接下来是对所有被选中的芯片进行统一的L-Bank的寻址,目前SDRAM中L-Bank的数量最高为4个,所以需要两个L-Bank地址信号(2的2次方=4)。
3、最后就是对被选中的芯片进行统一的行/列(存储单元)寻址。地址线数量要根据芯片的组织结构分别设计了。但在相同容量下,行数不变,只有列数会根据位宽的而变化,位宽越大,列数越少,因为所需的存储单元减少了。
4、找到了存储单元后,被选中的芯片就要进行统一的数据传输,那么肯定要有与位宽相同数量的数据I/O通道才行,所以肯定要有相应数量的数据线引脚。
3、SDRAM芯片初始化、行有效、列读写时序
首先,我们先认识一下SDRAM的内部结构,然后再开始具体的讲述。
1) 芯片初始化
可能很多人都想象不到,在SDRAM芯片内部还有一个逻辑控制单元,并且有一个模式寄存器为其提供控制参数。因此,每次开机时SDRAM都要先对这个控制逻辑核心进行初始化,关键的阶段就在于模式寄存器(MR,Mode Register)的设置,简称MRS(MR Set),寄存器的信息由地址线来提供。
上述初始化过程仿真结果如下:
SDRAM初始化过程通过init_state状态机来实现(上图倒数第三行信号)。总的功能时序要求是:200us稳定期、预充电,8次自动刷新、写MR寄存器。后面三个阶段的实现是通过发送不同的命令来实现的:具体实现时先发送命令(持续一个时钟周期),然后等待该命令操作完成,即延时若干个周期(取决于具体SDRAM芯片时序参数要求);然后再发送下一个命令......
发送命令之后延时的时钟周期数,是通过一个cnt_clk计数器来确定的。当cnt_clk计数值等于预期的周期数时,cnt_clk被清零,同时开始进入发送下一个命令的状态。在等待周期内发送的是NOP命令。
稳定期200us阶段:
(a)rst_n有效时,init_state被复位为0状态(NOP)。当rst_n进入无效状态后,启动200us计数器(cnt_200us),init_state保持0状态(NOP),直到cnt_200us=20 000 .
预充电阶段:
(b)当cnt_200us=20 000时,init_state从0状态转换为1状态(I_PRE:发送预充电命令)。
(c)下一个时钟周期,init_state从1状态转换为2状态(I_TRP:等待预充电完成,等待TRP=4个时钟周期)。
该阶段的仿真波形放大后如下(到第一根黄线部分结束):
8次自动刷新阶段:
(d)过了4个时钟周期后,init_state从2状态转换为3状态(I_AR1:第一次发送自动刷新命令)。
(e)下一个时钟周期,init_state从3状态转换为4状态(I_TRF1:等待第一次自动刷新完成,等待TRF1=6个时钟周期)
(f)过了6个时钟周期后,init_state从4状态转换为5状态(I_AR2:第二次发送自动刷新命令)。
......如此重复,直到完成8次自动刷新。
上图中两根黄线之间部分为第一次自动刷新。
模式寄存器设置阶段:
(g)完成8次自动刷新后,init_state从18状态转换为19状态(I_MRS:发送写模式寄存器命令)
(h)下一个时钟周期,init_state从19状态转换为20状态(I_TMRD:等待MRS命令完成,等待TMRD=6个时钟周期)
(i)过了6个时钟周期后,init_state从20状态转换为21状态(I_DONE:表示初始化完成)。
上图中前两条黄线之间部分为写模式寄存器(写入数据即bank1 bank0 addr11...addr0为00 0000 0011 0011:突发读写、CAS=3、顺序突发、突发长度=8),延时6个周期后init_state进入状态21,表示初始化完成(此后,init_state一直处于该状态),此状态下busy信号无效,表示sdram空闲。随后的work_state状态机(表示sdram完成初始化之后的工作状态)进入10状态,是对SDRAM进行周期性的刷新,和初始化阶段的自动刷新相同。此后work_state进入0状态,同时busy也变为0,表示sdram空闲,开始等待对SDRAM的读写操作。
至此,完成了对SDRAM的初始化。