实现数据的高速大容量存储是数据采集系统中的一项关键技术。本设计采用Altera 公司Cyclone系列的FPGA完成了对DDR SDRAM 的控制,以状态机来描述对DDR SDRAM 的各种时序操作,设计了DDR SDRAM 的数据与命令接口。用控制核来简化对DDR SDRAM 的操作,并采用自顶至下模块化的设计方法,将控制核嵌入到整个数据采集系统的控制模块中,完成了数据的高速采集、存储及上传。使用开发软件Quartus II 中内嵌的逻辑分析仪SignalTap II 对控制器的工作流程进行了验证和调试。最终采集到的数据波形表明,完成了对DDR SDRAM 的突发读写操作,达到了预期设计的目标。
DDR SDRAM 是Double Data Rate SDRAM 的缩写,即双倍速率同步动态随机存储器。
DDR 内存是在SDRAM 内存基础上发展而来的,能够在时钟的上升沿和下降沿各传输一次数据,可以在与SDRAM 相同的总线时钟频率下达到更高的数据传输率。本设计中采用Altera 公司Cyclone 系列型号为EP1C6Q240C8 的FPGA 实现控制器,以Hynix 公司生产的型号为HY5DU121622B(L)TP 的DDR SDRAM 为存储器,完成了对数据的高速大容量存储。
1 DDR SDRAM 的控制原理及存储功能的实现
DDR SDRAM 支持的常用命令有7 种:空操作(NOP)、激活操作(Active)、突发读(BurstRead)、突发写(Burst Write)、自动刷新(Autorefresh)、预充电(Precharge)、模式寄存器配置(Mode Register Set)。所有的操作命令都是通过信号线RAS_N、CAS_N、WE_N 共同控制来实现的。在对DDR SDRAM 进行存取数据操作之前,首先要对其初始化,即设置DDR SDRAM的普通模式寄存器和扩展模式寄存器,确定DDR SDRAM 的工作方式,这些设置包括突发长度、突发类型、CAS 潜伏期和工作模式以及扩展模式寄存器中的对DDR SDRAM 内部延迟锁定回路(DLL)的使能与输出驱动能力的设置。
初始化完成之后,DDR SDRAM 便进入正常的工作状态,此时便可对存储器进行读写和刷新。DDR SDRAM 在一对差分时钟的控制下工作。命令(地址和控制信号)在每个时钟的上升沿被触发。随着数据DQ 一起传送的还包括一个双向的数据选通信号DQS,接收方通过该信号来接收数据。DQS 作为选通信号在读周期中由DDR SDRAM 产生,在写周期中由存储器的控制器产生。该选通信号与数据相关,其作用类似于一个独立的时钟,并满足相应的时序要求。由于DDR SDRAM 的数据接口在时钟的两个沿的触发下工作,其数据宽度是存储器数据宽度的一半。为实现数据的大容量存储,设计时采用的是一个控制核同时对两片DDR SDRAM 进行操作,外接数据线的宽度由单片DDR SDRAM 的16 位扩展到32位。
对DDR SDRAM 的读和写操作是基于突发的,即从一个选定的地址单元开始,连续存取已设置长度的地址单元,该长度就是所谓的突发长度。DDR SDRAM 提供的可编程的读或写的突发长度为2,4 或8。数据的存取以一个激活命令(Active)开始,接着便是读(BurstRead)或写(Burst Write)命令。与激活命令一起被触发的地址位用来选择将要存取的区和页(或行),与读或写命令一起被触发的地址位用来选择突发存取的起始列单元。读命令被触发后,数据将在1.5~3 个时钟周期之后出现在数据总线上。这个延迟就是所谓的CAS 潜伏期(CAS latency),即从DDR SDRAM 内核读出数据到数据出现在数据总线上所需要的时间。CAS 潜伏期的大小与SDRAM 的速度和存储器的时钟频率有关。当要存取一个不同行的地址单元时,需要通过一个预充电(Precharge)操作关闭当前行。
自动刷新(Autorefresh)命令用来周期性地刷新DDR SDRAM,以保持其内部的数据不丢失。2 DDR SDRAM 控制器的设计DDR SDRAM 控制器的功能包括:
(1)初始化DDR SDRAM;
(2)简化DDR SDRAM的读写时序;
(3)将DDR SDRAM 接口的双时钟沿数据转换为单时钟沿数据,使得对DDR SDRAM 的操作类似于普通RAM;
(4)控制器还要产生周期性的刷新命令来维持DDR SDRAM 内的数据而不丢失。其控制转换图如图1 所示。
在对DDR SDRAM 初始化完成之后,就可进行读、写或其他操作。在执行读(写)命令之前,先要激活将要读(写)的行,之后便可对该行进行突发读(写)。在控制器的设计中,所有的读写命令都是不带预充电的,因此,某一行被激活之后将一直处于激活状态,直到用户发送突发终止命令,此时控制器将自动产生一个预充电命令来关闭当前行。这样,某一行被激活之后用户便可进行连续的突发读(写)操作,从而节省了每次突发读写所需要的激活时间,提高了系统的数据吞吐率。
2.1 DDR SDRAM 的读操作流程
通过对DDR SDRAM 的读时序的分析,将整个读操作过程分解为7 个状态,每一个状态都对应着不同的命令(CMD)值,DDR 控制核通过对CMD 的译码完成对DDR SDRAM的操作。从整体的控制过程来看,读操作流程如图2 所示。其中实线表示的是读操作的控制流程,虚线表示的读操作的状态转换流程。控制流程的实现依赖于控制器内部状态转换产生的控制信号。实现各状态之间切换的控制信号主要有命令应答信号CMDACK,外部控制信号RDREQ 以及程序内部的计数器Count_READ。当系统的主状态机进入到读数据状态时,控制信号CBE=“010”;控制器内部的状态机进入到读状态。读流程中另一个重要的信号为RDREQ,它是由控制器后端的缓存(FIFO)产生的,当缓存中数据容量低于设定值时,信号RDREQ 被置高,读状态由PRE_NOP 进入READA,发起一次读操作,完成8 个数据的传送。程序内部的计数器Count_READ 保证控制核在经过设定的CAS 潜伏期后从数据总线上读取数据。
3 DDR SDRAM 控制器的FPGA实现
3.1 控制电路主状态机设计
主状态机用于控制整个数据采集系统的工作流程。各功能模块的配合,命令的发送,数据的采集、存储和传输都需要状态机来协调并严格控制时序关系。其状态转换图如图4 所示。控制器上电或复位时进入IDLE 状态,其中LA 和LD 分别为PCI 局部总线的地址线和数据线,上位机的发送的命令通过PCI 总线及接口芯片传送到PCI 局部总线,其中地址线的变化将引起状态机内部的状态转换,状态转换的同时,相应的配置字将出现在数据线上。配置完参数之后,转态机进入等待数据状态(WAIT_DATA),当触发信号满足要求之后(TRG=‘1’),自动进入到保存数据状态(SAVE_DATA),在此状态下,控制程序开始进行数据采集。指定存储深度的数据采集完成后,主状态机自动进入等待读数据状态,在接受到地址线上的状态转换命令后,分别进入读取A 通道和B 通道数据的状态。数据读完之后,上位机发送命令使状态返回到IDLE 状态。
3.2 DDR SDRAM 控制器各模块结构图
系统的顶层文件DATA_SAMPLE 的结构如图5 所示,FPGA 内置的主要有前端缓存模块DATATO_RAM、后端缓存模块TO_LD 和DDR SDRAM 的控制模块SDRAM。从数据流程上看,前端缓存将双路AD 采集到的数据合并成64 位,当缓存中的数据达到设定的存储深度时,控制模块在100MHz 的时钟下将数据读出,并将64 位数据拆分成32 位分别存储到两片DDR SDRAM 中。进入到读状态时,控制模块同时从两片DDR SDRAM 中读出32位的数据,根据用户所选择的数据通道,控制逻辑将相应的数据送入后端缓存中,后端缓存再将数据拆分成16 位,通过PCI 局部总线传送到上位机中。从控制流程上看,DATATO_RAM和TO_LD 中都设置了数据计数器,当DATATO_RAM 中存储的数据量超过设定值时,读使能RDEN 有效,控制模块从缓存中一次读走4 个数据。后端缓存的控制方式与此类似。
控制模块SDRAM 由两部分组成,其结构如图6 所示。其中ADDR 为地址产生模块,给控制核ddr_sdram 提供数据操作的行地址和列地址。控制核ddr_sdram 完成的功能包括将内部状态转换产生的CMD 控制命令译码成DDR SDRAM 所能实现的各种操作并实现以双倍的速率与DDR SDRAM 进行数据交换的接口。ddr_sdram 的结构框图如图7 所示。
控制核ddr_sdram 采用自顶而下模块化的设计方法,由4 个模块构成:ddr_sdram 顶层模块、控制接口模块、命令模块和数据路径模块。ddr_sdram 顶层模块初始化并把其余三个模块有机地结合起来;控制接口模块接收CMD 命令和相关存储器地址,对命令进行译码并将请求发送给命令模块;命令模块接收从控制接口模块译码后的命令和地址,产生相应的命令给DDR SDRAM;数据路径模块在读命令READA 和写命令WRITEA 期间处理数据交换。控制接口模块包含1 个命令译码器和1 个16 位的刷新减计数器及相应的控制电路。 命令译码器译码并将译码后的命令及相应的地址转送给命令模块。减计数器和相应的控制电路用来产生刷新命令给命令模块。其值就是由LOAD_REG2 命令写入到REG2 中的值。当计数器减到0 时,控制接口模块就向命令模块发Request 并一直保持到命令模块发Ack 来响应该请求。一旦控制接口模块接收到Ack,减计数器就会重新写入REG2 中的值。命令模块由1 个简单的仲裁器、命令发生器及命令时序器组成。它接收从控制接口模块来的译码后的命令,同时接收刷新控制逻辑发来的刷新请求命令并产生正确的命令给DDR SDRAM。仲裁器在控制接口发来的命令和刷新控制逻辑发来的刷新请求命令之间进行仲裁。刷新请求命令的优先级高于控制接口来的命令。
在仲裁器收到命令译码器发来的命令后,该命令就传送到命令发生器,命令时序器即用3 个移位寄存器产生正确的命令时序后发给DDR SDRAM。1 个移位寄存器用来控制激活命令时序,1 个用来控制READA 和WRITEA命令,1 个用来计时操作命令的持续时间,为仲裁器确定最后的请求操作是否完成。数据路径模块提供了DDR SDRAM 到FPGA 的数据通道。在和DDR SDRAM 接口的一方,数据路径模块将从DDR SDRAM 过来的数据总线宽度翻倍,并在200MHz 的时钟频率接收DDR SDRAM 在100MHz 时钟的上下沿送出的数据。在和FPGA 接口的一方,数据路径模块将从FPGA 送来的数据宽度减半并以2 倍的速率送给DDR SDRAM。4 系统实现的功能及结果分析逻辑分析仪SignalTap II 是Quartus II 软件中集成的一个内部逻辑分析软件,使用它可以观察本设计的内部信号波形。在系统的软件设计和仿真完成之后,将编译后的文件下载到系统的硬件中,对DDR SDRAM 控制器的状态转移和读写流程中各个信号进行了实时的采集与显示。
如图8 所示,是控制器读数据时嵌入式逻辑分析仪采集到的波形图。第9 行到第15行的信号显示的是读流程中各状态之间的切换过程。读命令发出之后,经过CAS 潜伏期,DDR SDRAM 突发传输8 个数据,并产生选通信号DQS。控制器在读到数据线DQ 上的数据后,将数据宽度加倍,传送到后端缓存中。
写数据的波形图如图9 所示,当主状态机在SAVE_DATA 状态时,DDR SDRAM 从控制器的数据总线上一次存储8 个数据。图中的选通信号HI_LO 是由控制器产生的,在信号的上升沿和下降沿存储器存储数据总线上的数据,存满8 个完成一次写操作。直到前端缓存的读使能信号有效时,控制器从前端缓存读取数据,并发起下一次写操作。
将所设计的控制器用于最高采样速率为10MHz 的数据采集系统中,DDR SDRAM 工作的差分时钟为100MHz,容量为32MByte,系统运行性能良好,能够较好的完成DDR SDRAM与AD 转换模块,PCI 总线接口模块之间的数据交换。图10 为数据采集卡对10kHz 正弦信号采样的波形。
5 特色描述
(1) 本设计在深入了解DDR SDRAM 工作原理的基础上,确定了DDR SDRAM 控制器的总体方案和模块化设计方法。
(2) 用FPGA实现的DDR SDRAM的控制器能在很高的速度下完成数据的读写和复杂的控制操作,工作可靠。
(3) 该控制器解决了DDR SDRAM 用于高速数据采集的关键技术问题,对增加数据采集系统的缓存容量具有重要意义。