在了解了sdram的构成原理之后,我们来针对某一款ddr芯片来看看其的内部结构和操作方法,首先来针对一款ddr的芯片看看其硬件的组成的结构。现在以K4T1G084QQ这颗DDR2的芯片为例,此芯片采用的是设计为16MBit×8BANK×8I/Os,共128MByte
管脚功能 | 管脚名称 | 类型 | 描述 |
时钟信号 | CK/nCK | input | 系统时钟差分输入引脚,所有的地址和控制信号在CK的上升沿或者nCK的下降沿采样,输出数据在CK或者nCK的电平发生变化时被采样 |
时钟使能信号 | CKE | input | 内部时钟使能信号,高电平有效,当系统处于掉电、挂机等状态时关闭SDRAM |
片选信号 | nCS | input | 使能或者禁止所有的引脚,当该引脚为高电平时,所有命令失效 |
内部核心终结电阻信号 | ODT | input | 设置为高电平时使能终端电阻匹配 |
读写信号 | nWE | input | 低电平表示写,高电平表示读操作 |
行地址信号 | nRAS | input | 行地址信号 |
列地址信号 | nCAS | input | 列地址信号 |
输入数据控制信号 | DM | input | 当向SDRAM写入数据时来控制数据的输入,在高电平时被采样,如果有不想存入的数据,可以运用此引脚信号来屏蔽 |
bank选择控制信号 | BA0-BA2 | input | 这三个引脚决定SDRAM中哪一个Bank被选中激活 |
数据信号 | DQ[0:7] | input/output | 双向数据输入输出引脚 |
数据输入/输出 控制位 | DQS/nDQS | input/output | 在数据读模式下控制数据输出 在数据写模式下禁止写数据 |
电源信号 | VDD/VDDQ/VDDL/VREF | input | 控制电源 |
地信号 | Vss/Vssq/Vssl | input | 地信号 |
对于计算机系统,我们不可能是一个bit一个bit的访问,一般而言,32 bit的CPU可能是按照Byte(8个bit)、short int(16个bit)或者int(32个bit)进行数据访问。基于这样的概念,对于K4T1G084QQ这颗chip,输出数据总线的宽度是8bit,如果要使用一个32bit的系统,那么可以采用4片连接的组成一个32位的数据,第1片的8位数据引脚连接至CPU的Xm1DATA0-Xm1DATA7;第2片的8位数据引脚连接至CPU的Xm1DATA8-Xm1DATA15;第3片的8位数据引脚连接至CPU的Xm1DATA16-Xm1DATA23;第4片的8位数据引脚连接至CPU的Xm1DATA24-Xm1DATA31,其命令和控制线采用公用的方式即可。
对于一款ddr,我们需要知道通过什么样的方式来控制完成我们需要,我们来看看ddr的状态,ddr的工作就是在这几个状态之间切换
在芯片上电后,芯片处于idle阶段,上图是需要进入各个阶段的时候,应该需要进行那些基本的操作,对于ddr使用比较频繁的几个基本命令访问方式如下
1. 自我刷新模式:当系统进入低功耗模式,只需要发送一条 SRF指令,主要用于休眠模式低功耗状态下的数据保存,比较常见的应用是STR(Suspend to RAM,休眠挂起于内存)。就进入了该模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态
2. 刷新模式:储体中电容的数据有效是有时间限制的,所以为了保证数据的不丢失,所以要对ddr进行定时的刷新,SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行。
3. MRS模式(mode register set):模式寄存器中的数据控制着 DDR2 SDRAM的操作模式.它控制着 CAS 延迟, 突发长度, 突发顺序, 测试模式, DLL复位, WR等各种选项,支持着 DDR2 SDRAM 的各种应用. 模式寄存器的默认值没有被定义, 所以上电之后必须按规定的时序规范来设定模式寄存器的值。
4. EMRS 扩展模式寄存器(1) 存储着激活或禁止DLL的控制信息, 输出驱动强度, ODT 值的选择 和附加延迟等信息
5. 读/写操作:对 DDR2 SDRAM的访问是基于突发模式的; 读写时,选定一个起始地址,并按照事先编程设定的突发长度(4或8)和突发顺序来依次读写.访问操作开始
一个激活命令, 后面紧跟的就是读或者写命令。和激活命令同步送达的地址位包含了所要存取的簇和行 (BA0, BA1 选定簇; A0-A13 选定行). 和读或写命令
同步送达的地址位包含了突发存取的起始列地址 ,并决定是否发布自动预充电命令。
其操作指令如下图
那么我们怎么去实现一个ddr的驱动呢?下载一份ddr的spec来看看,一头雾水,基本没有可以配置地方,除了一些硬件管脚,电压参数之外,全部是一些关于timing的参数设定,那么对于这块全部落在ddr controller的身上,即ddr controller一方面要完成指令的操作,同时肩负着ddr timing的各个参数设定,同时这些参数时刻关系着我们程序的稳定性,那么对于ddr控制器,对于软件重点的就是配置这些参数