常见的SDRAM控制器代码都是基于连续突发读写模式的,在需要传输连续地址的大批量数据时十分方便。但是需要进行随机的地址读写时,突发读写的控制器便不方便使用。例如将SDRAM作为CPU的内存模块使用时,常常需要访问和修改随机地址的数据,故需要设计SDRAM随机读写控制器。
本文介绍SDRAM的基本知识后,详细介绍SDRAM随机读写控制器的设计和使用。本SDRAM随机读写控制器是基于altera的nios ii 处理器的sdram控制器设计而成。用户端基于Avalon-MM接口进行控制。
常见的SDRAM的引脚如下图所示:
各个引脚的功能如下:
CLK: | SDRAM工作的时钟,并且所有的输入信号都是在CLK的上升沿进行检测的,也就是说我们给SDRAM给的任何命令,一定要在CLK的上升沿保持稳定,以免SDRAM获取我们给出的命令时出现错误。 |
---|---|
CKE: | 时钟使能信号,是用来控制SDRAM内部时钟是否工作的一个信号(在SDRAM内部也是有时钟的哦) |
CS: | 片选信号,这里需要注意的是,如果要对SDRAM进行操作,必须要将片选信号拉低 |
BA0,BA1: | Bank地址线,用来给bank的地址,可以控制SDRAM的4个bank |
A0~A11: | 地址线,当我们选择SDRAM某个Bank的Row地址的时候,需要到12根地址线(A0~A11);当选择Col地址的时候,只用A0~A8这9根线;A10这个信号可以用来控制Auto-precharge。 |
RAS、CAS、WE: | 这三根线就是用来给SDRAM发命令的,包括初始化、读、写、自动充电等命令。 |
UDQM、LDQM: | 数据输入/输出掩码。 |
DQ0~DQ15: | SDRAM的数据线,为双向的,向SDRAM写数据或者从SDRAM中读出来的数据都是在DQ上进行传输的 |
3,SDRAM操作流程
SDRAM的操作步骤可分为如下几项:
首先,芯片上电后延时等待大约200us的时间,然后进行芯片的初始化,进行操作模式配置。初始化成功后便可以进行数据的读写操作。在进行数据读写时,先进行行选中,然后进行列选中,同时根据控制端口的信号,进行数据的读或写操作。读和写操作可以配置成突发模式,一次可以连续传输多个数据。每个操作都需要延迟一定的时钟周期。
另外,还需要对芯片进行定期的刷新操作,以保证SDRAM内部的数据不被丢失,两次刷新之间的最大时间间隔为15us。同时提醒大家,SDRAM每进行一次刷新,是对每一行进行操作的,并不是单独针对每一个电容进行充电,所以每进行一次刷新,该行中的电容进行充电我们可以理解为是同步发生的。
在进行不同的操作步骤时,都有对应的控制指令,用以区分这些操作步骤,下面介绍控制指令。正常操作下,保持CKE=1,CSn=0。
初始化操作过程如下
具体步骤为:一次预充电--->两次自刷新--->模式配置。每一次操作之间都要有一定的延迟时间。
该控制器的功能方块图如下所示:
SDRAM端口外接到SDRAM芯片。Avalon-MM为用户控制信号。SDRAM的端口不在介绍。下面介绍下Avalon-MM接口。
Avalon 接口是 Altera FPGA的Qsys软核系统使用的总线协议。Avalon-MM是Avalon Memory Mapped Interface的简称,是基于地址读写典型的主从连接关系的接口。Avalon-MM 接口信号类型,如下表所示。
在该控制模块中,使用的端口如下。
5,数据读写操作流程
上电启动后,控制模块会自动完成sdram的初始化,模式配置,并自动进行周期性自刷新。用户只需要利用Avalon-MM接口便可以进行数据的读写。
写数据操作:进行写数据操作时,将写地址和写数据放置在az_addr和az_data端口,同时将写使能信号az_wr_n置低,直到za_waitrequest信号为低时,数据写入成功,然后将写使能信号az_wr_n置高即可。
读数据操作:进行读数据操作时,将读地址放置在az_addr端口,同时将读使能信号az_rd_n置低,等到返回数据有效信号za_valid为高时,有效的读数据在za_data端口输出,然后将读使能信号az_rd_n置高即可。此时数据读操作完成。
空闲时,保持写使能信号az_wr_n和读使能信号az_rd_n为高。
利用该模块,建立一个sdram设计读取的dome,并利用signaltap工具进行在线调试,抓取模块运行时的波形。
(1)初始化时序图
该模块在运行初始化时,进行了1次预充电,7次自刷新,和一次模式寄存器配置。
(2)初始化寄存器配置
在进行模式配置时,由于是对数据进行随机地址读写,不需要进行数据的连续传输,即将突发长度配置为1即可,使得每次只读写一个数据。
(3)自动刷新
初始化配置完成后,该模块便自动进行周期的自刷新操作。
(4)读数据操作
(5)写数据操作