SDRAM

本公司目前MCU系列,到目前为止, SWM34x 支持外接8M\16M SDRAM,SWD34S系列已经把SDRAM合封入芯片,合封的SDRAM大小根据芯片型号不同,具体见官方手册。

在SDRAM使用过程中,需要对SDRAMC控制的各个参数进行配置,具体参数如下表格,不同系列芯片参数稍微有点区别,但是配置原理一样。下面以SWM34x  SDRAM_CTRL控制器外接Winbond W9812G6KH-6为例进行参数配置说明。

表一 MCU端需要配置的参数 

1682402690716778.png

以SWM34x 为例,分别说明表一中各项参数的计算方法

1、Bank:指的是SDRAM分了几个块,这个在SDRAM芯片手册里面有说明,如W9812G6KH-6文档中列明Bank等于4

如下图

1.png

2. RowAddr:SDRAM中每个bank单元每一页的地址,如W9812G6KH-6 一个Bank有4096个页,所以页地址占用12bit,故RowAddr=12。

3. ColAddr:SDRAM中每个Bank单元每一页中每一行的地址,如W9812G6KH-6 一个Bank有4096个页,每页有512行,所以行地址暂用9bit,故ColAddr=9,根据寄存器规范,PageSize需设置为0x001

图下图

2.png

4. RR: SDRAM的REFRESH_RATE,即刷新频率,根据W9812G6KH-6芯片手册,刷新周期为64mS,在150M时钟下,则一个clk=6.67nS, RR的计算公式为64000000(nS)/4096(页数量)/6.67nS(每一个clk的时间)=需要的clk数量。所以RR=0x926.

5. RFC(从刷新或加载模式到刷新或激活的最小CLK周期数): SDRAM的手册有列明参数最小值,以W9812G6KH-6芯片手册为例,RFC最小值为60nS(图3), 在MCU工作在150M时钟下,转换成寄存器值:RFC=60ns/6.67=8,即可得SDRAM需要的最小值8(图4)。

3.png

(图3)

4.png

(图4)

6. RP(从预充电到激活或刷新的最小CLK周期数):SDRAM手册会有写明,如W9812G6KH-6芯片RP=15nS,MCU端计算RP方法为RP=15nS/6.67=2.

7. RCD(从激活到读取或写入的最小CLK周期数):SDRAM手册会有写明,如W9812G6KH-6芯片RCD=15nS, MCU端计算RCD方法为RCD=15nS/6.67=2.

8. WR(从上次写入传输到预充电的最小CLK周期数): 固定为2.

9. RAS(从激活到预充电的最小CLK周期数): SDRAM手册会有写明,如W9812G6KH-6芯片RCD=42nS, MCU端计算RAS方法为RAS=42nS/6.67=6.

10. RC(从激活到激活的最小CLK周期数): SDRAM手册会有写明,如W9812G6KH-6芯片RC=60nS, MCU端计算RC方法为RC=60nS/6.67=8. 如下图

5.png

11. RRD(对于不同的bank,从激活到激活的最小CLK周期数): SDRAM手册会有写明,如W9812G6KH-6芯片RRD=12nS, MCU端计算RRD方法为RRD=12nS/6.67=1.

12. XS(从自刷新退出到发出任何命令的最小CLK周期数减1): SDRAM手册会有写明,如W9812G6KH-6芯片RRD=72nS, MCU端计算XS方法为XS=72nS/6.67=10.

13. CASLatency:等于3或者2.

14. RD_Delay: 等于CASLatency、或等于CASLatency+1.

实际应用

如果SWM34x 系统频率为150M,则SDRAM控制器读写W9812G6KH-6(16M SDRAM),各项参数配置如下:

    SDRAM_InitStruct.ClkDiv = SDRAM_CLKDIV_1;

    SDRAM_InitStruct.NbrBank = 2;//SDRAM_BANK_4

    SDRAM_InitStruct.NbrRowAddr = 12;//SDRAM_ROW_12

    SDRAM_InitStruct.NbrColAddr = 1;//SDRAM_COLUMN_9

    SDRAM_InitStruct.CASLatency =3;// SDRAM_CASLATENCY_3

    SDRAM_InitStruct.TimeTRC  =8 ;

    SDRAM_InitStruct.TimeTRRD = 1;

    SDRAM_InitStruct.TimeTRCD = 2;

    SDRAM_InitStruct.TimeTRAS = 6;

    SDRAM_InitStruct.TimeTRP  = 2;

    SDRAM_InitStruct.TimeRFC  =8;

    SDRAM_InitStruct.TimeTXS=10;

    SDRAMC->T64 = 0x926;

    SDRAMC->RDDELAY = SDRAM_InitStruct.CASLatency+1;

(以上只介绍了配置方法,部分参数并没有完全配对,需要修改验证)

来源:华芯微特32位MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 76

SDRAM介绍

同步动态随机存储器(SDRAM)特点:

  • 同步:memory工作时需要同步时钟

  • 动态:存储阵列需要不断刷新

  • 随机:自由指定地址读写数据

  • 容量大价格便宜

SDRAM存储结构

SDRAM支持多BANK,通过指定BANK号,行地址,列地址找到目标存储单元。

1.png图1 存储结构

SDRAM信号线

2.png

SDRAM内部框图

如下以W9825G6KH内部框图举例:

3.png

图2 W9825G6KH框图

  • 1时钟控制

  • 2命令控制

  • 3地址控制4存储阵列,4个BANK

  • 5数据

SDRAM常用命令表

SDRAM通过信号线上的不同状态来产生各种命令。

4.png

表1 SDRAM命令表

注意:L=Low Level   H=High Level   X=don't Care

A10=H表示Precharge all bank,A10=L表示Precharge选择的BANK

No-Operation

表示选中当前设备,当前没有操作。

Bank/Row active

在对SDRAM进行读写时,需要先激活对应的bank和行,该命令用于选择一个bank的一行进行激活,以便接下来进行读写访问。

Read

激活的行有效之后,对列地址进行寻址,读出数据。

Write

激活的行有效之后,对列地址进行寻址,写入数据。

Precharge

预充电命令,在某一行上的读写完成之后,关闭现有的行,准备激活新行。

Refresh

刷新命令,SDRAM

需要不断的刷新操作才能保存数据,根据SDRAM设备参数按照固定周期进行刷新。

Load Mode Register

加载模式寄存器,修改SDRAM设备的功能参数,burst模式,latency等。

5.png

图3 mode register

SDRAM Power On Sequence

6.png

图4 SDRAM Power On

AT32 SDRAM控制器

SDRAM控制器主要特点如下:
同时支持两个SDRAM设备

支持8位/16位数据总线宽度

支持13位行地址,11位列地址(最大可以支持4x16Mx16bit=128MB)

支持4个内部Bank

支持word/half word/byte访问

支持Burst Read,有6x32bit读FIFO缓存

SDRAM时钟支持HCLK/2, HCLK/3, HCLK/4

支持低功耗模式(自刷新模式,掉电模式)

地址映射

7.png

图5 SDRAM地址映射

SDRAM Device1起始地址:0xC0000000

SDRAM Device2起始地址:0xD0000000

I/O引脚配置

8.png

表2 SDRAM IO引脚列表

使用SDRAM IO引脚初始化如下,可根据具体使用引脚进行修改:

9.png

SDRAM读写时序

  • 写SDRAM时序

10.png

  • 读SDRAM时序

11.png

SDRAM配置

通过配置寄存器SDRAM_CTRLx来设置SDRAM设备的容量,访问方式等,详细信息可参考RM。此寄存器包括如下配置:(W9825G6KH作为示例)

  • 行地址/列地址配置

12.png

行地址和列地址根据SDRAM设备地址位数进行配置,如下示例:

13.png

  • 数据总线宽度

14.png

根据SDRAM设备支持数据总线宽度进行配置,如下示例支持16bit数据宽度:

15.png

内部区块个数

16.png

SDRAM设备支持内部bank个数:

17.png

  • 列地址选通延迟(CAS)

18.png

SDRAM设备支持延迟:

19.png

  • 写保护配置(WRP)

如果配置了写保护,在写SDRAM设备时会参数Bus error。

  • XMC_SDCLK时钟分频(CLKDIV)

  • BSTR(连续读)

  • RD(读延时)

配置代码例程:

20.png

SDRAM时序参数配置

要正常使用SDRAM设备,需要正确配置此部分的实现参数,此参数可在SDRAM设备的datasheet中找到对应值。

配置寄存器SDRAM_TMx:

  • TMRD(加载模式寄存器到激活延迟)

  • TXSR(退出自刷新延迟)

  • TRAS(自刷新周期)

  • TRC(刷新命令到激活命令延迟)

  • TWR(写命令到预充电命令延迟)

  • TRP(预充电到激活命令延迟)

  • TRCD(行激活到列延迟)

例TRCD:最小18ns,SDRAM时钟144MHz,一个SDRAM时钟大约为7ns,因此TRCD至少要配置为延迟3个SDRAM时钟周期。

例TWR:SDRAM设备要求2个SDRAM时钟,因此配置为2

SDRAM设备对时序要求:(W9825G6KH作为示例)

21.png

配置代码例程:

22.png

SDRAM启动序列配置

  • Clock enable时钟使能

23.png

  • 预充电

24.png

  • 设置刷新计数器

25.png

计算方法:counter=(SDRAM resfresh period / number of rows)-20;

刷新速率=64ms/8K=7.8125us;

counter=7.8125us*144MHz–20=1105;

26.png

  • 自动刷新

27.png

  • 加载模式寄存器

28.png

SDRAM例程

SDRAM Basic

此例程配置SDRAM设备之后,对SDRAM设备进行读写操作,并判断读写数据是否正确,包括如下步骤:

  • GPIO初始化

  • SDRAM配置

29.png

  • SDRAM启动序列

30.png

  • SDRAM读写访问


31.png

SDRAM DMA

此例程配置SDRAM设备之后,使用对SDRAM设备进行读写操作,并判断读写数据是否正确,包括如下步骤:

  • GPIO初始化(同SDRAM Basic)

  • SDRAM配置(同SDRAM Basic)

  • SDRAM启动序列(同SDRAM Basic)

  • SDRAN DMA读写

32.png

来源:AT32 MCU 雅特力科技

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 94

今天分享扩展SDRAM的内容。

1、概述

在使用MCU的嵌入式系统设计中,当程序或者数据内存占用太大而无法放入片上闪存或SRAM时,开发者通常考虑使用SDRAM。

别问我为什么你的MCU不支持SDRAM图片

SDRAM是同步动态随机存取存储器的缩写,在微控制器应用中,微控制器通过使用外部存储控制器(EMC)操作访问SDRAM ,SDRAM时钟频率通常为100MHz或133MHz。

外部存储控制器通常不支持DDR SDRAM, 数据只是单边沿采样,即并行数据总线可以接受一个命令并在每个时钟周期传输一个数据字。

在SDRAM中执行程序是使用SDRAM的一种典型用法, 这里就介绍一下SDRAM中执行程序的方法和SDRAM执行程序的性能基准。

2、SDRAM初始化

SDRAM必须在使用前进行配置,SDRAM初始化分为6个步骤。

1、配置EMC寄存器的SDRAM时钟频率、字节顺序和时序参数。
SDRAM的时序比较复杂,用户需要通过查阅相关SDRAM芯片的手册获得时序参数(如刷新周期、预、充电命令周期、自刷新退出时间、写恢复时间等等)。
2、发送NOP命令
3、发送预充电命令
4、发送两次自动刷新命令
5、设置SDRAM模式
6、发送正常运行命令

系统启动时,SDRAM尚未初始化,理论上,程序在系统启动后的任何时刻都可以进行SDRAM初始化。然而,由于SDRAM初始化过程比较复杂,使用的系统资源较多,SDRAM初始化必须在所需的系统资源初始化完成后再进行。

具体来讲,开发者在芯片刚刚启动时(如Reset_Handler中)初始化SDRAM需要留心以下细节:

1、由于SDRAM初始化函数使用系统堆栈或全局变量,开发者必须确保系统堆栈或全局变量所在的物理内存上电及时钟使能。

2、在程序跳转到主程序启动之前,全局变量未清零或初始化,如果在主函数之前执行SDRAM初始化,开发者必须手动初始化变量。

举个例子,在LPC5460x中,开发者需要在SystemInit函数中初始化SDRAM,该函数(SystemInit)由Reset_Handler调用。在调用系统初始化之前,要通过设置AHBCLKCTRLSET0寄存器将SRAM时钟使能。

Reset_Handler   PROC
EXPORT  Reset_Handler               [WEAK]
IMPORT  SystemInit
IMPORT  __main
; clock control SRAM1/SRAM2/SRAM3 for stack
LDR     r0, = 0x40000220 ; AHBCLKCTRLSET0
MOV     r1, #0x38
STR     r1, [r0]
LDR     r0, =SystemInit
BLX     r0
LDR     r0, =__main
BX      r0
ENDP

3、SDRAM存储器布局

当使用SDRAM时,外部存储控制器(EMC)分配SDRAM一定的地址空间。开发者可以使用链接描述文件将代码或数据分配到SDRAM中。值得注意的是,链接器脚本编程在不同IDE之间是不同的。

以LPC5460x系列微控制器为例,SDRAM支持4个片选区,每个片选区最大支持256MB空间。

“”

当SDRAM的硬件连接使用SDRAM片选0的情况下,在KEIL平台下,将加载在SPI FLASH的Coremark基准测试程序拷贝到SDRAM中执行需要以下几步。(coremark基准测试程序包括core_list_join.c,core_matrix.c,core_state.c及core_util.c)。

1、定义SDRAM区域,从0xA0000000开始,大小为0x80000。定义SPI FLASH区域,大小为0x80000(SPI FLASH存储器的起始地址为0x10000000)。

2、在C源码中使用“SDRAM_Data” 和 “SDRAM_Function”属性,标记放在SDRAM区域中的数据或程序。(SDRAM_Data和SDRAM_Function只是文本名字)。

3、也可以将整个目标文件的数据和程序段配置到SDRAM

#define m_spifi_start     0x10000000
#define m_spifi_size       0x800000
#define m_sdram_start     0xA0000000
#define m_sdram_size       0x80000
LR_m_text2 m_spifi_start m_spifi_size { ; load to SPIFI
LR_m_sdram_text   m_sdram_start    m_sdram_size {
    *(SDRAM_Data)    *(SDRAM_Function)    core_list_join.o    core_matrix.o    core_state.o
    core_util.o
}

4、配置MPU

在SDRAM中运行程序,开发者可能需要配置ARM内核内存保护单元(MPU)。

内存保护单元(MPU)是一个可编程单元,用于定义内存访问权限。当MPU没有使能时,内存地址空间具有默认的访问权限。

如ARM Cortex™-M4器件通用用户指南中所述,当程序执行SDRAM中的代码且SDRAM内存影射地址的默认属性为禁止执行时, 内核就会产生HARDFAULT异常,且指令访问冲突标志SCB->CFSR为 1,该异常表示处理器尝试从不允许执行的位置获取指令。

“”

因此,当SDRAM被影射到默认不可执行的地址空间时(如在LPC5460x中,SDRAM影射到0xA0000000起始的地址),开发者必须配置并使能MPU才能在SDRAM中执行代码。

如下例中,代码配置并使能MPU,允许从0xA0000000到0xA0100000的内存区域是可执行的。

MPU->RNR = 0;                    //Region number 0
MPU->RBAR = 0xA0000000; //Region base address
/* Full Access | TEX: 000 | S: 0 | C: 0 | B:0 (No cacheable, no shareable)| 1M SIZE | ENABLE */
MPU->RASR = (0 << 28) | (0x3 << 24) | (0x0 << 19) | (0 << 18) | (0 << 17) | (0 << 16) | (0xFF < 8) | (0x13 << 1) | (1 << 0); //Region size and enable
MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_PRIVDEFENA_Msk;

5、SDRAM性能基准

最后,作者在LPC5460x经过程序运行CoreMark性能基准测试,总结了一点点经验,分享给大家

1、SDRAM(16位带宽)中的代码执行效率仅为在内部SRAM中执行效率性能40%,大约是内部FLASH中运行代码性能的50%;

2、代码在SDRAM中运行时,较高的CPU频率(CPU没有Cache)不能改善执行效率,这时SDRAM带宽成为系统性能的瓶颈。

基于这样的测试结果,建议大家在要求较高性能时,把程序代码放在内部SRAM执行,而用片外大容量的SDRAM存放海量的数据。

本文转载自:strongerHuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 361

在使用MCU的嵌入式系统设计中,当程序或者数据内存占用太大而无法放入片上闪存或SRAM时,开发者通常考虑使用SDRAM。

别问我为什么你的MCU不支持SDRAM

SDRAM是同步动态随机存取存储器的缩写。在微控制器应用中,微控制器通过使用外部存储控制器(EMC)操作访问SDRAM ,SDRAM时钟频率通常为100MHz或133MHz。

外部存储控制器通常不支持DDR SDRAM, 数据只是单边沿采样,即并行数据总线可以接受一个命令并在每个时钟周期传输一个数据字。

在SDRAM中执行程序是使用SDRAM的一种典型用法, 小编这里就介绍一下SDRAM中执行程序的方法和SDRAM执行程序的性能基准。

SDRAM初始化

SDRAM必须在使用前进行配置,SDRAM初始化分为6个步骤。

① 配置EMC寄存器的SDRAM时钟频率、字节顺序和时序参数。
SDRAM的时序比较复杂,用户需要通过查阅相关SDRAM芯片的手册获得时序参数(如刷新周期、预充电命令周期、自刷新退出时间、写恢复时间等等)。

② 发送NOP命令

③ 发送预充电命令

④ 发送两次自动刷新命令

⑤ 设置SDRAM模式

⑥ 发送正常运行命令

系统启动时,SDRAM尚未初始化。理论上,程序在系统启动后的任何时刻都可以进行SDRAM初始化。然而,由于SDRAM初始化过程比较复杂,使用的系统资源较多,SDRAM初始化必须在所需的系统资源初始化完成后再进行。

具体上讲,开发者在芯片刚刚启动时(如Reset_Handler中)初始化SDRAM需要留心以下细节:

① 由于SDRAM初始化函数使用系统堆栈或全局变量,开发者必须确保系统堆栈或全局变量所在的物理内存上电及时钟使能。

② 在程序跳转到主程序启动之前,全局变量未清零或初始化,如果在主函数之前执行SDRAM初始化,开发者必须手动初始化变量。

举个例子,在LPC5460x中,开发者需要在SystemInit函数中初始化SDRAM,该函数(SystemInit)由Reset_Handler调用。在调用系统初始化之前,要通过设置AHBCLKCTRLSET0寄存器将SRAM时钟使能。

Reset_Handler   PROC
EXPORT  Reset_Handler               [WEAK]
IMPORT  SystemInit
IMPORT  __main
; clock control SRAM1/SRAM2/SRAM3 for stack
LDR     r0, = 0x40000220 ; AHBCLKCTRLSET0
MOV     r1, #0x38
STR     r1, [r0]
LDR     r0, =SystemInit
BLX     r0
LDR     r0, =__main
BX      r0
ENDP

SDRAM存储器布局

当使用SDRAM时,外部存储控制器(EMC)分配SDRAM一定的地址空间。开发者可以使用链接描述文件将代码或数据分配到SDRAM中。值得注意的是,链接器脚本编程在不同IDE之间是不同的。

以LPC5460x系列微控制器为例,SDRAM支持4个片选区,每个片选区最大支持256MB空间。

SDRAM片选    地址范围

0         0xA0000000 - 0xA7FFFFFF
1         0xA8000000 - 0xAFFFFFFF
2         0xB0000000 - 0xB7FFFFFF
3         0xB8000000 - 0xBFFFFFFF

当SDRAM的硬件连接使用SDRAM片选0的情况下,在KEIL平台下,将加载在SPI FLASH的Coremark基准测试程序拷贝到SDRAM中执行需要以下几步。(coremark基准测试程序包括core_list_join.c,core_matrix.c,core_state.c及core_util.c)。

① 定义SDRAM区域,从0xA0000000开始,大小为0x80000。定义SPI FLASH区域,大小为0x80000(SPI FLASH存储器的起始地址为0x10000000)。

② 在C源码中使用“SDRAM_Data” 和 “SDRAM_Function”属性,标记放在SDRAM区域中的数据或程序。(SDRAM_Data和SDRAM_Function只是文本名字)。

③ 也可以将整个目标文件的数据和程序段配置到SDRAM

#define m_spifi_start     0x10000000
#define m_spifi_size       0x800000
#define m_sdram_start     0xA0000000
#define m_sdram_size       0x80000
LR_m_text2 m_spifi_start m_spifi_size { ; load to SPIFI
LR_m_sdram_text   m_sdram_start    m_sdram_size {
    *(SDRAM_Data)    *(SDRAM_Function)    core_list_join.o    core_matrix.o    core_state.o
    core_util.o
}

配置MPU

在SDRAM中运行程序,开发者可能需要配置ARM内核内存保护单元(MPU)。

内存保护单元(MPU)是一个可编程单元,用于定义内存访问权限。当MPU没有使能时,内存地址空间具有默认的访问权限。

如ARM Cortex™-M4器件通用用户指南中所述,当程序执行SDRAM中的代码且SDRAM内存影射地址的默认属性为禁止执行时, 内核就会产生HARDFAULT异常,且指令访问冲突标志SCB->CFSR为 1,该异常表示处理器尝试从不允许执行的位置获取指令。


因此,当SDRAM被影射到默认不可执行的地址空间时(如在LPC5460x中,SDRAM影射到0xA0000000起始的地址),开发者必须配置并使能MPU才能在SDRAM中执行代码。如下例中,代码配置并使能MPU,允许从0xA0000000到0xA0100000的内存区域是可执行的。

MPU->RNR = 0;                    //Region number 0
MPU->RBAR = 0xA0000000; //Region base address
/* Full Access | TEX: 000 | S: 0 | C: 0 | B:0 (No cacheable, no shareable)| 1M SIZE | ENABLE */
MPU->RASR = (0 << 28) | (0x3 << 24) | (0x0 << 19) | (0 << 18) | (0 << 17) | (0 << 16) | (0xFF < 8) | (0x13 << 1) | (1 << 0); //Region size and enable
MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_PRIVDEFENA_Msk;

SDRAM性能基准

最后,小编在LPC5460x经过程序运行CoreMark性能基准测试,总结了一点点经验,分享给大家

SDRAM(16位带宽)中的代码执行效率仅为在内部SRAM中执行效率性能40%,大约是内部FLASH中运行代码性能的50%;

代码在SDRAM中运行时,较高的CPU频率(CPU没有Cache)不能改善执行效率,这时SDRAM带宽成为系统性能的瓶颈。

基于这样的测试结果,建议大家在要求较高性能时,把程序代码放在内部SRAM执行,而用片外大容量的SDRAM存放海量的数据。

本文转自:嵌入式资讯精选,转载此文目的在于传递更多信息,版权归原作者所有。

围观 65

本文主要介绍的是ARM里的RAM和SDRAM有什么区别,首先介绍了RAM的类别及特点,其次对SDRAM做了详细阐述,最后介绍了RAM和SDRAM的区别是什么。

RAM介绍

Random-Access Memory(随机存取存储器),在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器[或者内存储器和外存储器],主存储器简称内存,内存在电脑中起着举足轻重的作用,一般采用半导体存储单元。因为RAM是内存其中最重要的存储器,所以通常我们直接称之为内存。内存就是存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。

RAM就是既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。目前市场上常见的内存条有 128M/条、256M/条、512M/条等。

RAM的类别

根据存储单元的工作原理不同, RAM分为静态RAM和动态RAM。
  
静态随机存储器(SRAM)

静态存储单元是在静态触发器的基础上附加门控管而构成的。因此,它是靠触发器的自保功能存储数据的。

动态随机存储器(DRAM)

动态RAM的存储矩阵由动态MOS存储单元组成。动态MOS存储单元利用MOS管的栅极电容来存储信息,但由于栅极电容的容量很小,而漏电流又不可能绝对等于0,所以电荷保存的时间有限。为了避免存储信息的丢失,必须定时地给电容补充漏掉的电荷。通常把这种操作称为“刷新”或“再生”,因此DRAM内部要有刷新控制电路,其操作也比静态RAM复杂。尽管如此,由于DRAM存储单元的结构能做得非常简单,所用元件少,功耗低,已成为大容量RAM的主流产品。

RAM的特点

1、随机存取

所谓“随机存取”,指的是当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置或所写入的位置无关。相对的,读取或写入顺序访问(SequenTIal Access)存储设备中的信息时,其所需要的时间与位置就会有关系。它主要用来存放操作系统、各种应用程序、数据等。

2、易失性

当电源关闭时RAM不能保留数据。如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。

3、对静电敏感

正如其他精细的集成电路,随机存取存储器对环境的静电荷非常敏感。静电会干扰存储器内电容器的电荷,引致数据流失,甚至烧坏电路。故此触碰随机存取存储器前,应先用手触摸金属接地。

4、访问速度

现代的随机存取存储器几乎是所有访问设备中写入和读取速度最快的,存取延迟和其他涉及机械运作的存储设备相比,也显得微不足道。

5、需要刷新(再生)

现代的随机存取存储器依赖电容器存储数据。电容器充满电后代表1(二进制),未充电的代表0。由于电容器或多或少有漏电的情形,若不作特别处理,数据会渐渐随时间流失。刷新是指定期读取电容器的状态,然后按照原来的状态重新为电容器充电,弥补流失了的电荷。需要刷新正好解释了随机存取存储器的易失性。

SDRAM介绍

SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器,同步是指Memory工作需要步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是由指定地址进行数据读写。目前的168线64bit带宽内存基本上都采用SDRAM芯片,工作电压3.3V电压,存取速度高达7.5ns,而EDO内存最快为15ns。并将RAM与CPU以相同时钟频率控制,使RAM与CPU外频同步,取消等待时间,所以其传输速率比EDO DRAM更快。

SDRAM从发展到现在已经经历了四代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM.

第一代与第二代SDRAM均采用单端(Single-Ended)时钟信号,第三代与第四代由于工作频率比较快,所以采用可降低干扰的差分时钟信号作为同步时钟。

SDR SDRAM的时钟频率就是数据存储的频率,第一代内存用时钟频率命名,如pc100,pc133则表明时钟信号为100或133MHz,数据读写速率也为100或133MHz。

之后的第二,三,四代DDR(Double Data Rate)内存则采用数据读写速率作为命名标准,并且在前面加上表示其DDR代数的符号,PC-即DDR,PC2=DDR2,PC3=DDR3。如PC2700是DDR333,其工作频率是333/2=166MHz,2700表示带宽为2.7G。

DDR的读写频率从DDR200到DDR400,DDR2从DDR2-400到DDR2-800,DDR3从DDR3-800到DDR3-1666。

很多人将SDRAM错误的理解为第一代也就是 SDR SDRAM,并且作为名词解释,皆属误导,SDR不等于SDRAM。

  Pin:模组或芯片与外部电路电路连接用的金属引脚,而模组的pin就是常说的“金手指”。
  SIMM:Sigle In-line Memory Module,单列内存模组。内存模组就是我们常说的内存条,所谓单列是指模组电路板与主板插槽的接口只有一列引脚(虽然两侧都有金手指)。
  DIMM:Double In-line Memory Module,双列内存模组。是我们常见的模组类型,所谓双列是指模组电路板与主板插槽的接口有两列引脚,模组电路板两侧的金手指对应一列引脚。
  RDIMM:registered DIMM,带寄存器的双线内存模块
  SO-DIMM:笔记本常用的内存模组。
  工作电压:
  SDR:3.3V
  DDR:2.5V
  DDR2:1.8V
  DDR3:1.5V

ARM里的RAM和SDRAM有什么区别

RAM包括SRAM和DRAM,前者是静态随机存储器,主要是依靠触发器存储数据,无需刷新,而后者是动态随机存储器,依靠MOSFET中栅电容存储数据,需不断刷新以补充释放的电荷。由于单管就可以实现数据存储,集成度可以做到更高,功耗也更低,更为主流。需要注意的是由于刷新牵涉电容的充放电过程,DRAM的存取速度不及SRAM。

至于SDRAM,为同步动态随机存储器,属于DRAM的一种,其工作过程需要同步时钟的配合,因此可以不考虑路线延时不同的影响,避免不定态。普通的DRAM属于异步传输,存取数据时,必须等待若干个时钟以后才进行操作(考虑不定态),因为会花费较多的时间,影响了数据的传输速率。随着时钟频率的不断增高,这个瓶颈的限制就会越来越明显,SDRAM的优势也就更能体现出来。

本文转载自:电子产品世界

围观 602

基础一:

SDRAM (Synchronous Dynamic RandomAccess Memory),同步动态随机存储器。同步是指其时钟频率与CPU的前端总线的系统时间频率相同,并且他的内部命令的发送与数据的传输都是以这个时钟为基准的,动态是指存储阵列需要不断的刷新才能保证数据的不丢失。随机是指数据不是线性存储的,是可以自由指定地址进行数据读写。

位宽:是指内存一次数据传输的数据量就是位宽,以位为单位。

SDRAM的内部结构:

SDRAM相当于一个excel,一个工作溥中有几个工作表,每个工作表里有行列。

SDRAM中的一个bank就相当于excel中的一个工作表, SDRAM中的行(Column)与列(Row)相当于工作于中的行与列,我们对内存的读写就是根据bank号 Column 、Row来准确的找到所需要的单元格(存储阵列)。

由于技术、成本等原因,不可能只做一个全容量的Bank,而且最重要的是,由于SDRAM的工作原理限制,单一的Bank将会造成非常严重的寻址冲突,大大降低了内存的效率,所以把SDRAM内部分割成多个Bank,较早以前是2个,目前市面上大多都是4个Bank的,

SDRAM容量的计算。

SDRAM容量 = 单元格的总数(地址总数) X 位宽

单元格的总数 = Bank数 X Column数 X ROW数

如果要以字节为单位的话,刚需要将SDRAM容量(bit) / 8(bit)

型号为:HY57641620XXX的为64Mbit (8M字节)位宽为16bit的SDRAM,内部结构为4个Bank,Column数为8(CA0-CA7),Row数为12(RA0- RA11),SDRAM的行地址线和列地址线是分时复用的,即地址要分两次送出,先送出行地址,再送出列地址。这样,可以大幅度减少地址线的数目。

计算方法为:每个bank的容量为: 2 Row次方 X 2 的Column次方X 16(bit) = 256 X4096 X 16 /1024 = 16384 bit =16 Mbit = 2 M字节,再乘以bank数就是64 Mbit (8M字节了),更简单的方法是行列加起了相当于20根地址线,所以每个bank能访问的地址空间是 2 的20次方 = 1048576 bit= 1M字节,但由于第次传输的数据位宽是16位,所以每个bank的空量是 16 Mbit ,总共有4个bank,所以就有64Bbit的容量,换成字节单位就是8M字节。

基础二:

1、逻辑Bank与芯片位宽

SDRAM的内部是一个存储阵列。因为如果是管道式存储(就如排队买票),就很难做到随机访问了。

阵列就如同表格一样,将数据“填”进去,你可以把它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格(存储阵列)叫什么呢?它就是逻辑Bank(Logical Bank,下文简称L-Bank)。

SDRAM的一些基础知识
L-Bank存储阵列示意图

由于技术、成本等原因,不可能只做一个全容量的L-Bank,而且最重要的是,由于SDRAM的工作原理限制,单一的L-Bank将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在SDRAM内部分割成多个L-Bank,较早以前是两个,目前基本都是4个,这也是SDRAM规范中的最高L-Bank数量。到了RDRAM则最多达到了32个,在最新DDR-Ⅱ的标准中,L-Bank的数量也提高到了8个。

这样,在进行寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与列进行寻址。可见对内存的访问,一次只能是一个L-Bank工作,而每次与北桥交换的数据就是L-Bank存储阵列中一个“存储单元”的容量。在某些厂商的表述中,将L-Bank中的存储单元称为Word(此处代表位的集合而不是字节的集合)。

SDRAM的一个存储单元并不是存储一个bit,一般是8bit的整数倍(8bits,16bits,32bits),这个存储单元的容量就是芯片的位宽(也是L-Bank的位宽),SDRAM内存芯片一次传输率的数据量就是芯片位宽。

SDRAM的一些基础知识

2、内存芯片的容量

现在我们应该清楚内存芯片的基本组织结构了。那么内存的容量怎么计算呢?显然,内存芯片的容量就是所有L-Bank中的存储单元的容量总合。计算有多少个存储单元和计算表格中的单元数量的方法一样:

存储单元数量=2^行数 × 2^列数(得到一个L-Bank的存储单元数量)× L-Bank的数量 “单位:bits”

在很多内存产品介绍文档中,都会用M×W的方式来表示芯片的容量(或者说是芯片的规格/组织结构)。M是该芯片中存储单元的总数,单位是兆(英文简写M,精确值是1048576,而不是1000000),W代表每个存储单元的容量,也就是SDRAM芯片的位宽(Width),单位是bit。计算出来的芯片容量也是以bit为单位,但用户可以采用除以8的方法换算为字节(Byte)。比如8M×8,这是一个8bit位宽芯片,有8M个存储单元,总容量是64Mbit(8MB)。

以MT48LC16M16A2为例,该芯片结构为4 x 16M x 16bits,表示4个bank,4个bank共16M个单元(注意不是每个bank有16M单元),位宽16bits,大小计算
Capacity = 16M * 16bits = 256 Mbits = 32 MBytes

初始化:

上电后,等到VDD和VDDQ稳定后并且CKE设为高电平时。

1.将SDRAM的一些特性写入配置寄存中,如,同步时间,列数,行数,CAS延时等,还有需要将数据线宽度写入模式寄存器,这个数据宽度是要根据实际的硬件接口宽度决定的。

2. 等待一个最少200us 的延时,这个根据不同的SDRAM可能不同

3. 向SDRAM 发一个NOP命令:应用程序需要把模式模式寄存器写为模式1并写一个数到任意地址

4. 设置所有Bank 预冲电(precharge):应用程序需要将模式寄存器设置为模式2并下任意地址写入数据,可能需要延时.

实际上,预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放S-SMP(重新加入比较电压,一般是电容电压的1/2,以有助于判断读取数据的逻辑电平,,S-AMP是通过一个参考电压与存储体的电压比较来判断逻辑值的),以用来准备新的工作。

5. 自动刷新(auto refresh). 提供8个自动刷新时序。将模式寄存器切换到第四种方式,并向任意地址写一个数据,重复8次。

刷新说明,因为SDRAM需要不断的进行刷新,所在称作为动态内存-DRAM,刷新操作有两种,一种是Auto Reresh,简称AR,另一种是Self Refresh ,简称是SR,但不管是哪种刷新方法,都不需要外部提供行地址住处,因为他们都是内部的自动操作。结于AR,SDRAM有一个行地址生成器(也称亻刷新计数器)用来自动依次生成行地址。由于刷新是针对一行中所有存储单无际是行的,所以无需列寻址,或都说CAS在RAS之前,所以AR在有的地方叫作CBR(意思是CAS Before RAS)式刷新。

刷新时间,目前公认的标准是,存储单元中电容的数据有效保存上限是64ms(1000ms =1 s),也就是说每一行新的循环周期是64ms,我们在有的内存上看这样样的参数4096 Refresh Cycles/64ms之类的信息,从中可以看出,这个内存的行是12行,相当于每一行就行地址的扫描时间是64ms / 4096 =15.625us(1000us = 1ms)。

6. 设置CAS延时与突发长度。数据将模式寄存器设置为第三种模式,然后向写入任意数据。

空发时间Burst Length :空发长度是什么呢,如果突发长度(BL)为4,那就是每次传输的的是4 X W(数据宽度)的数据,这样就可能造成第二笔数据是不需要的,这就引入了数据掩码(DQM)技术,通过DQM,,内存可以控制I/O数据取消哪些输出或输入的数据。

7. 设置为正常工作模式,然后向SDRAM写入任意

8. 将刷新率写入SDRAM的刷新计数器中,刷新率=刷新周期之间的延迟。

以上初始化的基于MCU是at91sram7se,SDRAM是HY57V641620XXX

参考来源:
http://blog.csdn.net/xiahouzuoxin/article/details/17174795
http://pctanyicheng.blog.163.com/blog/static/173820242010689367285/

转自: lutherarcher的博客

围观 1076
订阅 RSS - SDRAM