FPGA之SDRAM基础知识学习

        各位同学大家好,话说回上节,咱们搭建好了ov7725摄像头的数据采集模块,下一步的工作就是要将这些数据存储起来,SDRAM作为一种常见的临时数据存储方式,自然是我们必须要掌握的内容啦!

目录

        数据有那些存储方式?

RAM

        结构

!SDRAM!

        SDRAM存取原理

        SDRAM芯片引脚

SDRAM操作指令汇总

一、禁止指令(Command Inhibit)

二、空指令(NOP)

三、模式寄存器配置指令(Load Mode Register)

四、预充电命令

 五、刷新命令

六、写命令

七、读命令

八、激活命令

九、突发终止命令(Burst Terminate)

结尾


        数据有那些存储方式?

        无论大家是否对这一块知识清楚,我还是要介绍一下数据存储,这个简单而又陌生的话题。我们日常生活中常见的存储数据的方式有磁盘,U盘,磁带等等,但是总的来说,存储器可以分为内存和外存,其中内存按照读写功能又分为两大类:ROM(Read Only Memory,只读存储器)和RAM(Random Access Memory,随机读写存储器),经常有人会问?电脑的硬盘是RAM还是ROM呢?我的回答是既不是RAM也不是ROM,它属于外存。再多嘴一下,内存的RAM一般就是我们常说的内存条,而ROM常常用来做BIOS等的存储芯片。

        回到正题,我们摄像头的数据只是暂存,并不需要存储,因此不需要用硬盘存储,因此我们的目标就投向了RAM上。

RAM

        我们所说的RAM一般是半导体存储器,根据电路结构的不同,我们可以将RAM分为两大类:静态RAM(SRAM)和动态RAM(DRAM)。两者之间的区别在哪里呢?

        静态存储单元(SRAM)是在静态触发器的基础上附加门控管而构成的。因此,它是靠触发器的自保功能存储数据的。而动态ram(DRAM)则为动态随机存取存储器,也是一种比较常见的系统内存,使用的是电容存储,动态RAM的存储矩阵由动态MOS存储单元组成。因为电容存储的数据时间久了容易丢失,因此每隔一段时间就要刷新一回数据,这就是动态的由来

        结构

DRAM:

(图中没有展现刷新电路) 

 SRAM:

!SDRAM!

        所谓SDRAM的英文全称叫“Synchronous Dynamic Random Access Memory”,即“同步动态 随机存取内存”或者叫“同步动态随机存储器”,属于动态随机存储器(Dynamic Random Access Memory,简称 DRAM)的一种。

   

 (来源 :野火电子)

        大家的疑惑往往在于“随机”这两个字上,存储我明白,可随机是个什么随机?数据怎么可以随机存放呢?其实这里的“随机”意味着可以直接访问任意地址单元,我举个例子大家就明白了:比如说磁带,我们叫顺序存储,比如说我在磁带某一段存了一段音乐,对于顺序存储的存储器,为了访问中间的这一段,必须要先访问之前的所有段,而随机存取直接就可以定位到这一段,而不需要从头开始找,这便是随机与顺序的最大不同。

        SDRAM存取原理

        我们把SDRAM内部类比成一个矩阵,我们要查找某个单元格的数据需要知道这个单元格的行地址(ROW),同时还需要知道列地址(Column),然后才能读写这个单元格内的数据;当然这只是一个类比,由于成本和制作工艺的因素,SDRAM内其实是先将这些单元格分割为不同的区(Bank) ,然后每个区包含了单元格矩阵。因此数据寻址过程是:确定数据所在区--》确定数据的行列地址。

        SDRAM芯片引脚

        以镁光公司的一块芯片为例:

 引脚功能:


CLK系统时钟引脚,作为SDRAM的驱动时钟,上升沿采样
CKE时钟使能引脚,高电平有效。无效时将冻结当前操作(冻结时钟)
CS_N片选信号,低电平有效。无效时将屏蔽所有输入输出端口,CLK、 CKE、DQM 除外。并且屏蔽所有 命令,但已经突发的读/写操作不受影响。
CAS_N列选通信号,低电平有效,有效时,A[8:0]为列地址
RAS_N行选通信号,低电平有效,有效时,A[12:0]输入的 为行地址
WE_N写使能信号,低电平有效,有效时,使能写操作以及预充电
DQM掩码信号(一般为DQML或者DQMH),高电平有效,有效时,在下一时钟周期上升沿,低字节/高字节 为高阻态(顾名思义,遮掩起来)

BA[1:0](2bit)

L-Bank 地址:选择不同的逻辑 Bank 进行相关数据操作。
A[12:0](13bit)地址总线:不同命令下含义是不同的。
DQ[15:0](16bit)数据总线,数据输入/输出 用。

 并且,很重要一点,SDRAM有许多的操作可以通过{CS#、CAS#、RAS#、WE#}这四位组成的数据段,进行配置。

SDRAM操作指令汇总

一、禁止指令(Command Inhibit)

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b1XXX

        任何情况下都能使用,执行此命令后,SDRAM 芯片不被选择,新的命令无法写入,但已经执行的命令不受影响。

二、空指令(NOP)

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0111

        任何状态均可写入,使用的目的是为了防止SDRAM 处于空闲或等待状态时,其他命令被写入,此命令对正在执行的命令无影响。

三、模式寄存器配置指令(Load Mode Register)

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0000

        此命令只有所有 L-Bank 均处于 空闲状态时才可被写入,否则配置出错,而且在执行此命令后,SDRAM 必须等待相应的 响应时间 tRSC(Register Set Cycle),模式寄存器配置周期)后,才可写入新的命令。使用目的是配置 突发传输类型以及突发传输的长度、列选通潜伏期(CAS Latency)长度、运行模式(Operating Mode)、写模式。

        并且还需要地址总线 A0-A11 辅助寄存器 的模式设置:

        突发传输

                普通的传输方式是 “地址-->数据” ,而突发传输是“地址-->相邻的n个数据”,因此突发传输的效率更高,因为只需要执行一次读操作。

        

(图片来源:野火电子) 

         长度配置:地址总线的低三位 A0-A2 是突发长度的控制位,SDRAM 芯片的突发长度可设置为 1、2、4、8 和整页,单位为字节,整页表示一次突发传输一整行的数据量,具体数值视芯 片而定。

        类型配置:突发类型的设置位为 A3,可将突发类型设置为两类,顺序和隔行

列选通潜伏期(CAS Latency)

        从前两幅图我们可以看到,列选通潜伏期是指从读命令被寄存到数据总线上到出现第一个有效数据之间的时钟周期间隔。列选通潜伏期可被设置为 2 个或 3 个时钟周期,设置位A6,A5,A4,当 { A6A5A4}=3’b010 时,潜伏期为 2 个时钟周期;当{ A6A5A4}=3’b011 时,潜伏期为 3 个 时钟周期。

 运行模式(Operating Mode)

        配置位 A7,A8,。默认只需将 A7,A8 设置为低电平进入标准模式 即可。

写模式

        写模式设置位为 A9,控制 SDRAM 的写模式。当 A9 为低电平时,SDRAM 的读/写操 作均采用突发方式,突发长度由突发长度寄存器(A0-A2)设定;当 A9 为高电平时, SDRAM 的读操作依然采用突发方式,突发长度由突发长度寄存器(A0-A2)设定,但 SDRAM 的写操作不在使用突发方式,每一个写命令只能写入一个数据。

         A10-A12 为保留位,对模式寄存器的配置不起作用,赋值为 0 即可

 至此,LMR命令介绍完成!

四、预充电命令

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0010,A10、BA[1:0]辅助选择

        当 A10 为高电平时,执行全部 预充电命令,对所有的 L-Bank 进行预充电,无需关心 BA[1:0]信号的输入;

        当 A10 为低电 平时,只对由 BA[1:0]选定的 L-Bank 进行预充电。注意:当某个 L-Bank 执行预充电操作后,该 L-Bank 处于空闲状态,在下次读写操作之前必须重新激活。

        顾名思义,所谓预充电就是SDRAM启动前的预备工作:关闭所有的Bank或者指定的Bank中激活的行。预充电命令执行 后,必须等待对应的等待时间 tRP(tRP(Precharge command Period),预充电命令周期),相对 应的 L-Bank 才可以被重新操作

 五、刷新命令

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0001,辅助位为CKE(时钟使能位)

        当 CKE 为高电平时,写入刷新指令,执行自动刷新操作

        注意:在执行自动刷新命令前,必 须先要执行预充电命令,将所有 L-Bank 关闭,SDRAM 内部刷新计数器会依次自动生成行地址,刷新是针对一行中的所有存储单元,所以无需列寻址。由于刷新涉及到所有 Bank,因此在刷新过程中,所有 Bank 都停止工作,而每次刷新需要等待对应的时钟周期,之后就可进入正常的工作状态,在此期间,所有工作指令只能等待而无法执行。 64ms 之后则再次对同一行进行刷新,如此周而复始进行循环刷新。

        当 CKE 为低电平时,写入刷新指令,执行自刷新操作

        注意:自刷新操作主要用于休眠模式 低功耗状态下的数据保存,在发出刷新命令时,将 CKE 置于无效状态,就进入了自刷新模 式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自刷新期间除了 CKE 之外的所有外部信号都是无效的,只有重新使 能CKE 才能退出自刷新模式并进入正常操作状态。

六、写命令

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0100,辅助位为:BA[1:0]、A[9:0]、A10。

       BA[1:0]指定需要写入数据的特定 Bank,地址总线 A0-A9 指定需要写入存储单元的起始列地址,A10 的电平变化控制突发写 操作完成后是否立即执行自动预充电操作,若 A10 为高电平,突发写操作完成后,立即执行自动预充电操作,关闭当前行;若 A10 为低电平,突发写操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。

         作用是用来实现对已激活的特定 L-Bank 的特定行的数据突发写入操作。大家可能会疑惑,写一个存储单元,不是要确定行列地址才行吗?这是当然的,在写命令和读命令之前会有一个激活命令,以此来确定行地址。

七、读命令

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0101、辅助位为:BA[1:0]、A[9:0]、A10

        和写命令一样,BA[1:0]指定需要读取数据的特定 Bank,地址总线 A0-A9 指定需要读取存储单元的起始列地址,A10 的电平变化控制突发读操作完成后是否立即执行自动预充电操作,若 A10 为高电平,突发读操作完成后,立即执 行自动预充电操作,关闭当前行;若 A10 为低电平,突发读操作完成后,当前行依然处于 激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。

        

八、激活命令

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0011、辅助位是BA[1:0]、A[12:0]

        注意:只有 SDRAM 处于空闲状态下才可被响应。逻辑 Bank 地址线 BA[1:0]和地址总线 A0-A12 选择要激活的特定 L-Bank 的特定行, 激活该行后,该行一直保持激活状态,并可以进行后续读/写操作,操作完成后,只有执行 一次预充电命令(Precharge)后,被激活的特定行被关闭。每次激活只能激活一个 L-Bank, 同一个 L-Bank 中每次只能激活一行,当需要对同一 L-Bank 中其他行进行操作时, 必须先 执行一个预充电命令关闭当前行,再激活另一行进行操作。

        功能是:为后续操作激活某一特定 L-Bank 中的某 一行。

九、突发终止命令(Burst Terminate)

        {CS_N,RAS_N,CAS_N,WE_N} = 4’b0110

        注意:SDRAM 处于读/写操作过程中可被写入,此命令操作并不会通过预充电关闭当前激活行,需通过预充电操作关 闭被激活行。

        作用:突发 停止操作被用来截断固定长度或者整页长度的突发。执行突发停止命令后,最近执行的数据读/写操作被终止。

结尾

        到这里,对于SDRAM的简单介绍就完成了,下一篇博客我们将实战SDRAM控制器Verilog代码的实现。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值