王维平,张正炳,贺东芹 (长江大学电子信息学院,湖北荆州434023)
DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,双倍速率随机存储器)采用2.5V的工作电压,在核心时钟的上升沿和下降沿传输数据,具有比SDR(single data rate)SDRAM多一倍的传输速率的优点。FPGA(Field-Programmable Gate Array)是一种可编程器件,在FPGA上可以实现任意数字电路功能。在电子通讯领域,数据量越来越大,对存储器的需求也越来越大;FPGA具有并行性、可编程等优点,它的应用场合也越来越广,在FPGA板卡上嵌入SDRAM已经应用在很多系统中,因此研究在FPGA平台上来实现DDR读写控制的方法具有重要的实际意义。下面,笔者在分析DDRSDRAM基本操作特性的基础上,根据DDR的时序要求,提出了一种基于VerilogHDL语言的控制器实现方案。
笔者采用的DDR具有4个BANK(就是被分为4个块)、15根地址总线、16根数据总线 (DQ15~DQ0)、2根数据捕获探针 (DQS,双向信号线)、2根写掩码信号 (DM1~DM0,可一直设置为0)、1对相位相反的主控时钟线 (CLK_P,CLK_N)、1根时钟使能信号 (CKE)、4根命令信号线:CS_N(片选信号),RAS_N(行地址使能信号),CAS_N(列地址使能信号)和WE_N(写使能信号)。
DDR的指令与SDR的指令基本一致,主要由CS_N,RAS_N,CAS_N和WE_N 4个信号控制,真值表如表1所示。命令是在主时钟的上升沿捕获。
表1 DDR的基本指令真值表
1)CL CAS latency,列地址有效到读出数据的延时,是在读数据时读命令到数据输出的时间长度,它由厂商确定,主要有2,2.5,3(时钟周期个数)3个数值,可以通过寄存器配置。
2)tRCD RAS to CAS latency,行地址 (ACT命令)有效到列地址有效的最小延时,不可配置。
3)tRAS 行有效 (ACT命令)到预充电命令的最小时延。
4)tRP 预充电命令到行有效的最小时延。
DDR的读写数据是在DQS信号下捕捉的,数据的位数决定了DQS的位数,一位DQS信号负责捕捉8位数据信号。写操作时,DQS在数据信号DQ的中心捕获数据;读操作时,DQS在数据信号的边沿捕获数据。在数据读写之前,需要先进行行有效操作,即ACT命令,然后经过tRCD的时间,执行读或写操作命令。在读操作中,读命令后还要经过CL(CAS latency)时间才开始读取数据。
笔者设计的DDR控制器主要有3个模块,分别是状态转换控制模块、指令译码模块和时钟模块,如图1所示。控制器的用户控制信号有CMD(用户发送的指令)与ADDR(用户地址)、DATAIN(DDR的输入数据)和DATAOUT(DDR的输出数据)。时钟模块提供DDR主时钟和控制器系统内部的数据时钟 (CLK_X2)。在使用时,用户首先发送1个CMD到状态转换模块进行状态转换,然后控制器返回1个CMDACK响应用户,在第2个时钟周期将这个命令状态标志输入到指令译码模块进行指令译码,控制指令信号,完成相应的操作。伴随着状态的转换,相应的地址信号也锁存进 DDR。REF_CLK与RESET_N是系统时钟和全局复位信号,除了这2个信号与前述的用户控制信号外,图1中剩下的接口信号就是DDR的接口信号了。
图1 DDR控制器框图
图2是各种操作的状态转化图,是指指令之间转换的可能操作。
图2 DDR状态转换图
根据DDR的时序要求,一共采用了3个时钟,分别是DDR的1对反相时钟 (DDR_CLK_P,DDR_CLK_N)和数据控制时钟(CLK_X2,由时钟模块产生)。根据DDR的要求,指令信号要在DDR_CLK_P的上升沿采样,所以采用其反相时钟信号DDR_CLK_N来同步命令逻辑,使DDR_CLK_P的上升沿恰好在命令的中心。根据DDR读写数据的要求,采用了1个DDR系统时钟频率2倍的数据时钟,用来处理读写数据。时序参见图3和图4。
DQS是双向信号,在读数据时由DDR本身产生,在写数据时需要控制器来产生。因为在DDR中DQS与其系统时钟保持一致,只不过是有个偏差范围,所以采用DDR_CLK_P的开关时钟作为DQS信号,写操作中产生DQS信号 (数据位宽为16,DQS位宽则为2)的Verilog代码:
DDR的控制器主要有读、写、预充电、刷新、配置模式寄存器等操作,如图2所示。DDR在工作时主要分为2个阶段:上电初始化和读写过程。初始化很重要,主要完成时钟稳定与寄存器配置的过程,它是一些指令的顺序执行过程。笔者采用的DDR是Hynix公司的产品。不同厂家的DDR初始化过程不尽相同,其寄存器配置的参数可能也不同,为了提高控制器的通用性,可以在控制器外来配置初始化操作。因为DDR的地址线是有限的,读写的时候是采用时分复用技术来实现完全的寻址过程的。DDR的地址线有15根,其中2根是BANK地址 (BA1~BA0),剩下的是行列地址 (13根,A12~A0),其中行地址为A12~A0,列地址为A8~A0,行地址与列地址分时复用,这样等效寻址线就是24根 (2+13+9),寻址空间正好是16M。在初始化完成以后就可以进行读写了,按照DDR的时序要求,先进行行锁定 (ACT命令),然后经过tRCD的时间,再执行读/写操作,同时锁定列地址。图3和图4分别是在Modelsim仿真中的写、读时序图,突发长度为8(一次读/写8个数据),CL为3,tRCD时间大约为3个时钟周期;在ACT命令周期 (CS_N=0,RAS_N=0,CAS_N=1,WE_N=1),锁定行地址,即将图中的SA=0000H赋给A12~A0地址线;经过tRCD时间执行读/写命令,注意在读写命令时,列地址SA=0425H,实际上此时的列地址是0025H,只不过此时读写方式是带预充电的读写方式 (A10=1,加上A8~A0=0025H,所以整个SA=0425H)。如图3所示,DQ是在CLK_X2时钟下产生的,正好在DQS的边沿锁存。在读数据时DQ与DQS是边沿对齐;如图4所示,数据时钟(CLK_X2)的上升沿正好在数据的中心,符合DDR时序要求。
图3 写时序仿真结果
图4 读时序仿真结果
DDR需要定时刷新指令与预充电指令,所以合理地处理这2个指令可以有效地提高读写的效率。刷新是周期性操作,预充电是在地址换行时需要执行的操作,所以提高效率的主要方法就是合理的安排预充电命令。读写操作有2种方式:一种是带预充电的读写,一种是普通的读写。在采用普通读写时需要在地址换行的时候用预充电命令来重新进行行使能。2种读写方式在指令上的区别就是:带预充电的读写命令在ACT命令 (此时,地址输入为DDR的行地址)时,将A10置高;而普通读写不需要将A10置高。
DDR的数据突发模式只有2、4、8三种,寻址一个完整地址都要进行ACT到 READ/WRITE的过程,如果读写数据在一个行时可以省去后续数据读写的ACT过程。笔者采用了突发为2的DDR读写方式,只在第一组数据时执行一个ACT命令,它可以实现一个行内的任意偶数个数据的连续读写。例如视频领域经常对一帧图像数据进行处理 (如去隔行处理[1]),存储器就可以连续的处理大批量的数据,时钟效率是比较高的。
当数据地址随机且经常跨越一行地址时,如果还是采用普通读写方式的话,需要经常在行地址变化时执行预充电命令,就会导致读写的效率下降。例如在视频编码中,预测编码是去冗余的最有效方法,预测就需要图像帧区域搜索[2],这时在存储器中表现为数据地址的随机性。这种情况下可以采用带预充电的读写命令,这样每个指令中都会进行预充电,就不必担心在地址换行的时候发生错误了。但是,每个指令之间必须有一定的间隔 (突发长度/2+tRP),例如采用突发为8的读写时,每个指令之间的间隔就要最少有4+tRP个周期,所以设置突发模式为8时效率比较高。
在硬件调试前,软件仿真是非常重要的,一般在仿真中时序吻合的情况下是可以实现既定功能要求的,在FPGA设计尤其是高速设计中,调试前的时序分析与时序收敛至关重要,只有满足了时序收敛,设计才具有稳定性。笔者在代码综合阶段采用了FPGA常用方法提高了设计的速度,比如增加流水线级数与消除亚稳态的方式[3],使CLK_X2达到333M,DDR时钟167M,还有时序余量,满足时序要求。
ALTERA提供一个集成于QUART USII软件中的FPGA片上debug工具:SignaltapII,它可以捕获和显示实时信号,观察在系统设计中的硬件和软件之间的互相作用。它的原理就是设定采样周期,实时采样数据并存储到PFGA内RAM中,然后通过JTAG接口传送到QUARTUSII来显示。正是因为SignaltapII的实时性,在调试时需要注意读写验证的方法。初始化的配置过程很难观察到,只能验证后面的读写过程。因为RAM的容量有限,一次捕捉到的数据也是有限的,在板级调试时,需要以循环的方式进行读写数据指令的执行,以便在逻辑分析仪中捕捉到数据。笔者采用先将数据写入一段地址中,然后在相同的地址中读出来,并且比较相同地址写入数据与读出数据是否相同的方法来验证DDR控制器是否正常工作。为了保证读写的可靠性,循环的方式采用遍历所有地址范围的方法,观察结果发现写入与读出的数据是完全吻合的。如图5、图6所示,写入数据与读出数据一致。
图5 SignaltapII捕获的写入数据时序图
图6 SignaltapII捕获的读出数据时序图
通过对DDR时序的分析,给出了一种DDR控制器的设计方案。并且针对不同的寻址方式,给出了不同的读写方法,提高了读写效率。最终,控制器在ALTERA公司的cycloneIII系列芯片上实现,在板卡上能够控制Hynix公司的DDR芯片稳定地读写数据。存储器工作频率达到167M,数据稳定可靠,读写效率较高。
[1]余兆明,査日勇,黄磊,等.图像编码标准H.264技术 [M].北京:人民邮电出版社,2005.
[2]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2005.
[3]Kilts S.高级FPGA设计结构、实现和优化 [M].孟宪元译.北京:机械工业出版社,2009.