一、SDRAM

1、存储结构

  SDRAM的内部是一个存储阵列。阵列就如同表格一样,将数据“填”进去。在数据读写时和表格的检索原理一样,先指定一个行(Row),再指定一个列 (Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理

ARM的STRB和LDRB指令分析-LMLPHP

  这个单元格(存储阵列)就叫逻辑 Bank(Logical Bank,下文简称 L-Bank)。 由于技术、成本等原因,不可能只做一个全容量的 L-Bank,而且最重要的是,由于 SDRAM的工作原理限制,单一的 L-Ban k将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在 SDRAM内部分割成多个 L-Bank,目前基本都是 4个(这也是SDRAM规范中的最高L-Bank数量),由此可见,在进行寻址时就要先确定是哪个 L-Bank,然后在这个选定的 L-Bank中选择相应的行与列进行寻址。

ARM的STRB和LDRB指令分析-LMLPHP

2、引脚说明

ARM的STRB和LDRB指令分析-LMLPHP

  DQM可以阻塞其对应的空间长度(8位)的有效性。例如,当LDQM有效时,如果输出时,将输出的[7,0]位置成高阻态;如果输入,则阻碍[7,0]的输入,也就是不能修改[7,0]的数据。当UDQM有效时,如果输出时,将输出的[15,8]位置成高阻态;如果输入,则阻碍[15,8]的输入,也就是不能修改[15,8]的数据。

3、S3C2440与内存相关的硬件电路图

  SDRAM以两片32M的K4S561632构成64M的RAM存储为例进行说明。

ARM的STRB和LDRB指令分析-LMLPHP

ARM的STRB和LDRB指令分析-LMLPHP

4、对SDRAM访问的步骤

(1) CPU发出片选信号nSCS0有效,选中SDRAM芯片

(2) SDRAM中有4个L-Bank,需要2根地址信号选中一个,利用的是ADDR24和ADDR25

(3) 先后发出行地址信号和列地址信号。K4S561632的行地址数是13,列地址数是9。所以,当nSRAS有效时,ADDR2~ADDR14上发出的是行地址信号,它对应32位地址空间的bit[23:11];当nSCAS有效时,ADDR2~ADDR10上发出的是列地址信号,它对应32位地址空间的bit[10:2]。由于BANK6以32位宽度外接SDRAM,ADDR0、ADDR1恒为0,不参与译码。

(4) 找到存储单元后,被选中的芯片就要进行统一的数据传输了。

二、分析ldrb/strb指令

1、S3C2440有关ldrb/strb指令的描述

ARM的STRB和LDRB指令分析-LMLPHP

 2、LDRB

  ldrb指令会根据提供的地址,从数据总线中选择需要的字节。例如:

    ldrb r0,0x30000000取的是0x30000000这个字的[7,0]

    ldrb r0,0x30000001取的是0x30000000这个字的[15,8]

    ldrb r0,0x30000002取的是0x30000000这个字的[23,16]

    ldrb r0,0x30000003取的是0x30000000这个字的[31,24]

  也就是说ldrb指令会先把0x30000000这个地址的字取出来,然后根据ldrb指令提供的地址选择合适的字节。

  ldrb指令接下来要把取到的数据放在目的寄存器的低8位,然后将高24位填充为0。

3、STRB

  STRB指令首先数据总线(整个字的四个字节)都填充上要写入的一个字节的数据。然后,外部存储系统激活合适的字节存储子系统去存储这一个字节的数据。

  “外部存储系统激活合适的字节存储子系统去存储这一个字节的数据”这句话,我是这样理解的,以"strb r3,[r4]"为例进行说明。

  假设r3 = 0x12 ,r4 = 0x30000001

  STRB指令首先数据总线上都填充上要写入的一个字节的数据,也就是数据总线为0x12121212,访问的字地址是0x30000000。因为要存储一个字节的数据到0x30000001,而0x30000000这个字的其他单元不能更改,所以就将DQM0、DQM2、DQM3都有效,而不屏蔽DQM。这样在写入的过程中,只将0x12写入到0x30000001单元中,而其他三个单元不修改,从而完成strb指令规定的任务。

参考资料:编译器对变量存储地址的处理

      S3C2440 SDRAM内存驱动

数据掩码DQM0,DQM1,DQM2,DQM3

05-08 15:10