当前位置:   article > 正文

fpga中SDRAM与DDR的学习(SDRAM部分)_fpga初始化ddr必须在上电瞬间吗

fpga初始化ddr必须在上电瞬间吗

DDR 与 SDRAM

fpga的很多程序中都有调用DDR,其全程为“双倍数据流SDRAM”,和RDRAM都是双倍速率传输的同步动态随机存取内存。DDR的全称就是DDR SDRAM。因此要搞清楚就必须先弄清楚SDRAM的工作原理,再就能搞清楚DDR和SDRAM的不同之处,这样就能实现融汇贯通。

SDRAM

SDRAM 的全称即同步动态随机存储器(Synchronous Dynamic Random Access Memory) ,这里的同步是指其时钟频率与对应控制器(CPU/FPGA)的系统时钟频率相同,并且内部命令的发送与数据传输都是以该时钟为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机指数据的读取和写入可以随机指定地址,而不是必须按照严格的线性次序变化。通常FPGA还有个SRAM来存储其程序和其他数据,它在工作时可以不需要外部时钟。

存储数据的方式:不像SRAM用晶体管来存数据(最少6个晶体管才能存一个数据,因此它的容量不会太高),SDRAM存储数据采用“行列式”的电容存储方式。如下图:
在这里插入图片描述
其简单的工作原理如下:SDRAM 存储数据是利用了电容能够保持电荷以及其充放电特性。一位数据的存取时存储单元主要由行列选通三极管,存储电容,刷新放大器组成。首先需要打开行地址,然后打开列地址,则电容的电平状态就
能呈现在数据线(data_bit)上,即实现了读取。 或者,数据线上的电平值被送到电容上,从而实现写入数据。当然这里只是做一个简要的介绍,因为在实际过程中的各个操作之间的时间上并不是完全同步的。比如:
1.打开行地址(激活)是需要一定时间的,即从打开行地址到可以打开列地址进行读写,这之间有一定的时间间隔,这个间隔叫做 tRCD(ACTIVE-to-READ or WRITE delay)。
2.当列地址被打开后,数据并不是立即出现在最终的数据总线引脚上,而是有若干个时钟的延迟,这个延迟叫做列选通潜伏期(CL,CL = CAS READ latency)。这个值只在读出去的时候有,写入时不存在CL,它会在很多的时序图当中产生。
下图是 SDRAM 内部存储矩阵的一个简化模型,对于每一行列,只展示了 1bit 的数据。主要是为了展示行列地址与存储电容的对应关系。实际读写时,打开一个确定的行和列,就
能唯一确定一个存储单元。
在这里插入图片描述
因此通过对应的地址赋值与相关操作就可以对每个存储单元来进行读写。通常SDRAM的存储大小也是按行列乘积、每个单元的存储位数、bank数三部分构成。

SDRAM 引脚说明
对于一个SDRAM芯片而言,通常它有下面这些引脚定义:
在这里插入图片描述
和其他芯片比,比较少见的是时钟使能引脚、数据掩码的概念。数据掩码的简单理解就是一个16位的数据可以通过它来决定不需要高低字节哪个字节的数据(即三态屏蔽,从 DQM 有效到数据总线状态对应发生变化,有两个时钟周期的延迟)。
由于有行列地址的概念这个SA地址总线会根据不同的模式决定地址存储的是行还是列地址。

芯片工作原理
在这里插入图片描述
1.SDRAM 是拥有四个 BANK 的动态刷新存储器,存储器工作在 3.3V 的电压下,拥有一个同步接口, SDRAM 的所有信号都在时钟信号的上升沿被寄存。(这点很重要)在这里插入图片描述

2.对于 SDRAM 的读写是以突发的方式进行的,即对 sdram 的获取(读或者写)是从一个指定的地址开始,并按照编程好的数量(长度,即很多手册中写到的BL)的地址,以编程好的数据顺序读写数据。
3.对 SDRAM 的获取(读写)是以一个激活命令开始,然后跟随一个读或者写命令。下文会提到具体怎么用。简单的说激活就是打开行地址,要读写时就要打开列地址,这样数据才能对电容存储进行操作,这样行列地址就构成了上面说的突发地址。
具体的操作要根据输入的信号来判断工作的方式:
在这里插入图片描述
对这些命令进行解释:
命令禁止:时钟都没使能,所有的信号(命令都进不来)
空命令:只要时钟使能,行列地址都没打开,并且也没有写使能,自然也不会有命令作用到电容上。
加载模式寄存器(也就是后面的MES):可以看到都使能了(这是sdram内部的结构实现的,不能理解为正常的写,写的时候行地址使能是不工作的),并且这一步必须在bank未激活时使用(激活了就要开始读写了)。这一步要设置这些东西:
在这里插入图片描述
这些数据都是写在地址总线SA[0:11]中。突发类型指顺序还是隔行。M9表示是否用突发方式(0用突发)。M7 8设置成00,表示使用标准模式。CAS都是针对的时钟上升沿

激活:只使能时钟和行地址(12位全用)。同时要确定好bank地址和行地址的具体值,该行会一直保持激活状态并可以进行读写,只有执行一个预充电命令(PRECHARGE)后,该行才会被关闭。只要关闭某个行才能激活下一行。

预充电:相当于是打开写使能,但又关闭列地址,打开了行地址,这说明写入电容的数据不是外部数据“充电”给它的,而是内部的某个结构,它的作用就是关闭某个或全部bank中打开的行。在 PRECHARGE 命令执行并经过 tRP 时间后,对应的 BANK 将可以重新被操作。A10 为高电平,则对所有 BANK 行进行预充电,若 A10 为低电平,则只对 BA0 和 BA1 指定的 BANK 中的行进行预充电。处理之后该bank处于空闲。自动预充电通过读写的A10位决定。
:使能时钟和列地址(根据sdram的数据位数来决定用几位,A0–A9, A11 (x4), A0–A9 (x8), or A0–A8 (x16)),用来启动对一个已经激活行的突发读取操作,同样BA0 和 BA1 指定需要读取的 BANK。A10 控制是否在突发读取完成之后立即执行预充电,即关闭当前行操作(高电平有效,不关闭的话可以连续读)。读的时候有CAS延迟。
:打开列地址(根据sdram的数据位数来决定用几位,A0–A9, A11 (x4), A0–A9 (x8), or A0–A8 (x16))和 BANK 地址,使能列地址、写使能、时钟使能,没有cas延迟。A10 控制是否在突发写完成之后立即执行预充电,即关闭当前行操作。同样若 DQM 为高电平,则数据总线上对应字节的数据不会被写入到 SDRAM中。
突发终止:写使能,但关闭了行地址和列地址。突发中断命令用来截断固定长度或者整页长度的突发。当突发中断命
令被执行时,离该命令最近的一次被 SDRAM 寄存的读或者写命令被截断,突发中断命令并不会对对应行进行预充电,即执行了突发中断操作后,该行任然处于被激活状态,除非预充电命令被执行,该 BANK 才会被关闭。
自动刷新:由于电容的电荷会在过程中有损失,因此需要经常把对电容值进行刷新操作。在执行自动刷新命令之前,所有的 BANK 必须被预充电(关闭)使其处于空闲态。自动刷新时,行地址由 SDRAM 芯片内部的刷新控制器自动更新。(注意是以行为单位来进行刷新)—各bank之间呢?

自刷新命令能够用来保持 SDRAM 中的数据,即使系统中其他部分已经掉电。在自刷新模式下, SDRAM 不需要外部的时钟信号就能够保持数据。只是自刷新命令的 CKE 是被置为了低电平。自刷新模式开启后, SDRAM 内部自己产生时钟,用来作为自动刷新的周期。 进入自刷新模式后,最少需要保持在自刷新模式下 tRAS 的时间。退出自刷新模式需要执行一串命令,首先,在 CKE 信号恢复到高电平之前,时钟信号
CLK 必须稳定(稳定的时钟可由对应的时钟引脚经过约束后的时钟提供)。当 CKE 信号回复到高电平后,必须保持 NOP 命令最低 2 个时钟周期,因为必须保证内部可能正在执行的刷新操作完成。在退出自刷新模式后,就需要每 7.81us 或者更短的时间内执行一次自动刷新操作。(自刷新和自动刷新都是利用了内部的行刷新计数器。)

操作时序

在对 SDRAM 进行正常的操作之前, SDRAM 必须被初始化。 SDRAM 的上电和初始化需
要按照预先定义好的方式进行,非这些指定的操作之外的命令可能导致不可预知的操作。
当 SDRAM 的 VDD 和 VDDQ 上电,并且时钟稳定后, SDRAM 首先需要延时等待 100us,
在这个等待期间,对于 SDRAM 只能赋给禁止命令(INHIBIT)或者空操作(NOP)命令。
100us 的延时之后,需要对 SDRAM 首先执行一次预充电命令,所有的 BANK 都必须被预充电,以使器件所有的 BANK 都处于空闲状态。进入空闲状态后,至少需要执行两个周期的自动刷新命令,自动刷新命令完成之后,就可以对 SDRAM 进行加载模式寄存器了,因为模式寄存器上电后处于未知的状态,因此在执行任何的操作命令之前必须加载模式寄存器,在需要的时候,在模式加载完成后可以执行两
次自动刷新命令。之后就可以按需要来对SDRAM进行读写。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/539390
推荐阅读
相关标签
  

闽ICP备14008679号