基于FPGA的DDR控制器设计

时间:2022-02-21 02:20:58

基于FPGA的DDR控制器设计

摘要 在分析DDR SDRAM基本操作特性的基础上,本文根据DDR的时序要求,提出了一种基于VerilogHDL语言的控制器实现方案。并且根据具体的应用环境给出了不同的读写方案,以提高时钟效率。控制器逻辑的RTL在FPGA板卡上实现,仿真在modelsim中进行,硬件的验证利用quartusII的逻辑分析仪(signaltapII)完成,以保证存储器的读写高效性与可靠性。

关键词 DDR SDRAM VerilogHDL FPGA

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读写控制的方法具有重要的实际意义。本文第1、2节介绍基于FPGA的DDR SDRAM控制器的设计过程,第3节主要讲述控制器的调试。FPGA为Altera公司的cycloneIII, DDR为Hynix公司的16Mx16的DDR。

1 DDR SDRAM 的基本操作

1.1 DDR SDRAM的指令

1.2 DDR常见读写延时参数

DDR的读写数据是在DQS信号下捕捉的,数据的位数决定了DQS的位数,一位DQS信号负责捕捉八位数据信号。写操作时,DQS在数据信号DQ的中心捕获数据;读操作时,DQS在数据信号的边沿捕获数据[1]。在数据读写之前,需要先进行行有效操作,即ACT命令,然后经过tRCD的时间,执行读或写操作命令。在读操作中,读命令后还要经过CL(CAS latency)时间才开始读取数据。

2 控制器的设计方案

实现DDR的控制,重点需要解决:时钟体系问题,状态转换与指令操作三个方面。本文设计的DDR控制器主要有三个模块,分别是状态转换控制模块,指令译码模块和时钟模块,如图1所示。控制器的用户控制信号有CMD(用户发送的指令)与ADDR(用户地址)、DATAIN(DDR的输入数据)和DATAOUT(DDR的输出数据)。时钟模块提供DDR主时钟和控制器系统内部的数据时钟(CLK_X2)。在使用时,用户首先发送一个CMD到状态转换模块进行状态转换,然后控制器返回一个CMDACK响应用户,在第二个时钟周期将这个命令状态标志输入到指令译码模块进行指令译码,控制指令信号,完成相应的操作。伴随着状态的转换,相应的地址信号也锁存进DDR。

2.1 时钟设计

根据DDR的时序要求,本文一共采用了三个时钟,分别是DDR的一对反相时钟(DDR_CLK_P,DDR_CLK_N)和数据控制时钟(CLK_X2,由时钟模块产生)。根据DDR的要求,指令信号要在DDR_CLK_P的上升沿采样,所以采用其反相时钟信号DDR_CLK_N来同步命令逻辑,使DDR_CLK_P的上升沿恰好在命令的中心。根据DDR读写数据的要求,采用了一个DDR系统时钟频率两倍的数据时钟,用来处理读写数据。

2.2 DDR的状态控制

DDR的控制器主要有读、写、预充电、刷新、配置模式寄存器等操作。图4是各种操作的状态转化图,是指指令之间转换的可能操作。DDR在工作时主要分为两个阶段:上电初始化和读写过程。初始化很重要,主要完成时钟稳定与寄存器配置的过程,它是一些指令的顺序执行过程。本文采用的DDR是Hynix公司的产品,其初始化配置过程如下[1]:

1、上电,开启时钟,并且稳定最小200μs的时间;

2、时钟稳定后,执行空指令,并且CKE=1;

3、配置扩展模式寄存器(EMRS)来使能DLL(Delay Locked Loop,延时锁定环),等待200个周期后进行下一步操作;

4、配置模式寄存器(MRS)来重启DLL,将芯片设置到等待状态(设置A8=1来重启DLL);

5、对所有BANK进行预充电;

6、执行两次或更多自刷新命令;

7、执行一次模式寄存器配置命令,来初始化模式寄存器,设置读写操作的参数;

8、等待200个周期后,初始化完成。

不同厂家的DDR初始化过程不尽相同,其寄存器配置的参数可能也不同,为了提高控制器的通用性,可以在控制器外来配置初始化操作。

2.3 DDR的读写效率

DDR需要定时刷新指令与预充电指令,所以合理地处理这两个指令可以有效地提高读写的效率。刷新是周期性操作,预充电是在地址换行的时候需要执行的操作,所以提高效率的主要方法就是合理的安排预充电命令。读写操作有两种方式:一种是带预充电的读写,一种是普通的读写。在采用普通读写时需要在地址换行的时候用预充电命令来重新进行行使能。两种读写方式在指令上的区别就是:带预充电的读写命令在ACT命令(此时,地址输入为DDR的行地址)时,将A10置高;而普通读写不需要将A10置高。

当然这种方案是在一个行地址中进行数据读写的有效方法,当数据地址随机且经常跨越一行地址时就需要执行预充电命令。如果还是采用普通读写方式的话,下一个读(写)地址随机,这样需要经常在行地址变化时执行预充电命令,就会导致读写的效率下降。例如在视频编码中,预测编码是去冗余的最有效方法,预测就需要图像帧区域搜索[3],这时在存储器中表现为数据地址的随机性。这种情况下可以采用带预充电的读写命令,这样每个指令中都会进行预充电,就不必担心在地址换行的时候发生错误了。但是,每个指令之间必须有一定的间隔(突发长度/2+tRP),例如采用突发为8的读写时,每个指令之间的间隔就要最少有4+tRP个周期,所以设置突发模式为8的时候效率比较高。

4 硬件调试

在硬件调试前,软件仿真是非常重要的,一般在仿真中时序吻合的情况下是可以实现既定功能要求的,在FPGA设计尤其是高速设计中,调试前的时序分析与时序收敛至关重要,只有满足了时序收敛,设计才具有稳定性。本文代码综合阶段,采用了FPGA常用方法提高了设计的速度,比如增加流水线级数与消除亚稳态的方式[4] ,使CLK_X2达到333M,DDR时钟167M,还有时序余量,满足时序要求。

ALTERA提供一个集成于QUARTUSII软件中的FPG上debug工具:SignaltapII,它可以捕获和显示实时信号,观察在系统设计中的硬件和软件之间的互相作用。它的原理就是设定采样周期,实时采样数据并存储到PFGA内RAM中,然后通过JTAG接口传送到QUARTUSII来显示[5]。正是因为SignaltapII的实时性,在调试时需要注意读写验证的方法。初始化的配置过程很难观察到,只能验证后面的读写过程。因为RAM的容量有限,一次捕捉到的数据也是有限的,在板级调试时,需要以循环的方式进行读写数据指令的执行,以便在逻辑分析仪中捕捉到数据。本文采用先将数据写入一段地址中,然后在相同的地址中读出来,并且比较相同地址写入数据与读出数据是否相同的方法来验证DDR控制器是否正常工作。为了保证读写的可靠性,循环的方式采用遍历所有地址范围的方法,观察结果发现写入与读出的数据是完全吻合的。

5 结束语

本文通过对DDR时序的分析,给出了一种DDR控制器的设计方案。并且针对不同的寻址方式,给出了不同的读写方法,提高了读写效率。最终,控制器在ALTERA公司的cycloneIII系列芯片上实现,在板卡上能够控制Hynix公司的DDR芯片稳定地读写数据。存储器工作频率达到167M,数据稳定可靠,读写效率较高。

参考文献

[1] hynix 16Mx16 DDR handbook[Z] Hynix Semiconductor Inc.

[2] 余兆明,査日勇,黄磊,周海骄.图像编码标准H.264技术[M]. 北京:人民邮电出版社,2005.

[3] 毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2005.

[4] (美)Steve Kilts著.高级FPGA设计结构、实现和优化[M] 孟宪元译.北京。机械工业出版社,2009.

[5] Quartus II Handbook Version 9.1 [Z] San Jose, Altera Corporation.

上一篇:浅谈小学德育教育的几点做法 下一篇:我赏识,我快乐