我只挑要点讲一下,关于DRAM的详细使用指南,请您参考Altera提供的随机help文档。
1。准备工作:
1。关于创建并使用NiosII系统,请参考我之前写的文章“也疯狂(五)--Step By Step创建标准(Standard)niosII系统”。
2。开发板上至少要有一片DRAM。FPGA
2。使用DRAM:
1)在sopc_builder中,双击MEMORY下的SDRAM Controller,可以创建SDRAM 控制器。
Data Width:数据位宽,ezNiosDK的用户请选择 16 Bits
Chip Selects:芯片的片选信号,ezNiosDK的用户请选择 1。
Banks:设定DRAM芯片的Bank数目。ezNiosDK的用户请选择 4。
Row : 设定行地址线的数量。ezNiosDK的用户请选择 12。
Column : 设定列地址线的数量。ezNiosDK的用户请选择 8。
其余的请按照上图中设置。
2)设定DRAM的时序参数
CAS latency cycles:在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位一般为时钟周期数,具体耗时由时钟频率决定。ezNiosDK的用户可以选择 2
Initialization refresh cycles:初始化过程中所需的刷新周期,ezNiosDK的用户可以选择 2
Isssue one refresh command every:刷新周期。ezNiosDK的用户可以选择 15.625 us
DRAM之所以称为DRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作之一。
刷新操作一般是用S-AMP先读再写。
那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个L-Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。
刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于AR, SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说CAS在RAS之前有效。所以,AR又称CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新过程中,所有L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期(PC133标准),之后就可进入正常的工作状态,也就是说在这9 个时钟期间内,所有工作指令只能等待而无法执行。64ms之后则再次对同一行进行刷新,如此周而复始进行循环刷新。显然,刷新操作肯定会对SDRAM的性能造成影响,但这是没办法的事情,也是DRAM相对于SRAM(静态内存,无需刷新仍能保留数据)取得成本优势的同时所付出的代价。
SR则主要用于休眠模式低功耗状态下的数据保存,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在SR期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态。
Delay after powerup,before initialization:上电后的稳定期。手册上一般给出的是200us,通常我们选择 100us即可。
Duration of refresh command:刷新周期。一般是60或者70ns.ezNiosDK的用户可以选择 70ns
Duration of prechange command:预充电周期。在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。tRP的单位一般也是时钟周期数,具体值视时钟频率而定。ezNiosDK的用户可以选择 20ns。
实际上,预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放芯片内部的比较器(重新加入比较电压,一般是电容电压的1/2,以帮助判断读取数据的逻辑电平),以准备新行的工作。具体而言,就是将放大/驱动比较器中的数据回写。存储单元中的电容容量很小,即使是没有工作过的存储体也会因行选通而使存储电容受到干扰,所以也需要进行读后重写。
ACTIVE to READ or WRITE delay:ezNiosDK的用户可以选择 20ns
在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。tRCD是SDRAM的一个重要时序参数。广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于运行在100M的SDRAM,tRCD=2,代表20ns的延迟,对于PC133则为15ns。
Access time: 访问时间。ezNiosDK的用户可以选择 5.4ns
从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向读出放大器,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间我们称之为tAC(Access Time from CLK,时钟触发后的访问时间)。tAC的单位是ns,对于不同的频率各有不同的明确规定,但必须要小于一个时钟周期,否则会因访问时过长而使效率降低。比如PC133的时钟周期为7.5ns,tAC则是5.4ns。需要强调的是,每个数据在读取时都有tAC,包括在连续读取中,只是在进行第一个数据传输的同时就开始了第二个数据的tAC。
Write recover time:回写延迟。ezNiosDK的用户可以选择 14ns
写操作虽然是0延迟进行,但每笔数据的真正写入则需要一个足够的周期来保证,这段时间就是写回周期(tWR)。所以预充电不能与写操作同时进行,必须要在tWR之后才能发出预充电命令,以确保数据的可靠写入,否则重写的数据可能是错的,这就造成了写回延迟。
3。在Nios IDE中使用DRAM:
在Nios IDE中使用DRAM非常简单。DRAM可以用作Program memory 或者 Read-only data memory 或者 Read/write data memory,如下图范例中,在system library properties中,设置Program memory,Read-only data memory , Read/write data memory,均为DRAM的名字:sdram_0 。这样把所有的数据都放在DRAM中