zoukankan      html  css  js  c++  java
  • mini2440的SDRAM分析

      首先是2440的存储控制器:

      暂时不管是从nand启动还是nor启动,因为我现在只关注内存,从上图可以看到由2440的Memory Controller可以寻址的范围是0x0000,0000---0x4000,0000,总共是1G,这1G又分为8个bank,bank0-bank7,每个bank为128M, 8*128M=1G。其中bank0-bank5这6个bank是只能接SROM,那么什么是SROM,2440数据手册的221页说明了,SROM是ROM或者SRAM。

      

    通用存储设备:

      内存存储设备的存储方式:ROM,RAM

        ROM(Read-Only Memory):只读存储器,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失。如:PC里面的BIOS。

        RAM(Random Access Memory) :随机访问存储器,存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。可以理解为,当你给定一个随机有效的访问地址,RAM会返回其存储内容(随机寻址),它访问速度与地址的无关。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间内随机访问使用的程序。计算机系统里内存地址是一个四字节对齐的地址(32位机),CPU的取指,执行,存储都是通过地址进行的,因此它可以用来做内存。

      RAM按照硬件设计的不同,随机存储器又分为DRAM(Dynamic RAM)动态随机存储器和SRAM(Static RAM) 静态随机存储器。

        DRAM它的基本原件是小电容,电容可以在两个极板上短时间内保留电荷,可以通过两极之间有无电压差代表计算机里的0和1,由于电容的物理特性,要定期的为其充电,否则数据会丢失。对电容的充电过程叫做刷新,但是制作工艺较简单,体积小,便于集成化,经常做为计算机里内存制作原件。比如:PC的内存,SDRAM, DDR, DDR2, DDR3等,缺点:由于要定期刷新存储介质,存取速度较慢。

        SRAM它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。因此其存取速度快,但是体积较大,功耗大,成本高,常用作存储容量不高,但存取速度快的场合,比如CPU的L1 cache,L2cache(一级,二级缓存) ,寄存器。

      由于价格和存储量的限制,mini2440上作为内存的就是DRAM,从上图看得出,只有bank6,bank7才能接DRAM,那么我猜想控制bank6,7的Memory Controller对应的寄存器肯定有一个控制刷新的部分,其他几个不具备,因为不需要。再看看mini2440上的内存芯片怎么和2440接线的,它使用了2块16位宽的SDRAM:

      

      从上图来看,芯片包括了最基本的地址线,数据线,对比2块芯片,发现它们相同的地址线是连在一起的,都是A0-A12,共13根地址线,而数据线一块是连接2440的LDATA0---LDATA15,一个是LDATA16-LDATA31,再看看2440的引脚:

      可以看出,2440的数据线是DATA0-DATA31,可以接收的数据宽度是32位,而它的地址线是ADDR0--ADDR26,一共是27根,那么2^27就是128M,正好是内存控制器一个bank的大小。再联系SDRAM和2440的接线方式,发现数据线32根分别由2块芯片对接,2块芯片分别用16根,而地址线只用了13根,2^13=8K,那怎么可能做到寻址128M呢?何况SDRAM上居然是从LADDR2开始接线的。那么就得看看SRAM的手册,看看它是怎么被寻址的。

      

      mini2440上SDRAM型号是H57V2562GTR,是一个256Mb的16位位宽的DRAM,注意这里是256Mb,是小b,所以总共是256/8=32MB。看看SDRAM内部的结构功能框图:

    这款DRAM内部的存储单元首先是由4个称作BANK的单元组成(图中Memory Cell Array),然后每个BANK单元上是由一个存储矩阵组成,通过XY轴定位到最小寻址粒度的一个单元,也就是一个16bit的存储单元。然后把这个16bit的单元里面的数据放到数据输出口上。打个比方,假设一块DRAM是一个Excel文件,那么它的bank就是Excel的一个sheet,由横坐标(ABCDEF.......)和纵坐标(12345....)定位一个最基本的单元格,这个单元格就是DRAM的基本存储单元,这款DRAM是16位宽的,所以基本存储单元就是16bit。再看看左下角的Address Buffers,A0-A12,13根地址线,BA0-BA1,2根BANK选择线。图中显示一个Memory Cell Array大小是4M * 16 bit,16bit是芯片的基本寻址单元,所以要求地址线要有4M的寻址能力,2^22 = 4M,也就是说需要22根地址线才能做到,但是这里只提供了A0-A12,13根线。如何做到呢?答案是地址线复用。可以看到State Machine那个功能块有RAS、CAS这样两根线(RAS: Row Address Select,CAS:Column Address Select),它们低电平有效。RAS有效时,A0-A12上的地址就是Row Addess,地址信号A0-A12 ---> Address Buffers--->Address Register ---->Row Pre Decoder--->X decorders,同理CAS有效时,A0-A12上就是Column Address,不过此时这款SDRAM只有9个Column地址有效,地址信号A0-A8 ---> Address Buffers--->Address Register ---->Column Pre Decoder--->Y decorders。这样13+9 = 22,22根地址线就通过时分复用的方式出来了。

    上图中只演示了在一个Memory Cell Array内寻址的过程,其实在这之前还有:片选(CS)--->Memory Cell Array号(BA[0:1])选中某块SDRAM的某个Memory Cell Array。

    细看DRAM的介绍:

    原来只有行地址用了13位,列地址只用了9位,那么通过计算一共是2^(13+9+2+1)=32MB,和芯片的规格一致,那么这样解释就合理了。2440怎么使用这2块SDRAM的呢?是用2块拼接起来,一个来存储低16位,一个存储高16位。假设地址0x30000000,寻址它怎么得到这个存储单元的内容呢?首先它是属于1G这个范围内,然后又是处于BA,Array0,行0,列0。

    由此可见仅仅需要29位就可以定位一个access cell,这也就是为什么mini2440地址线只接了A2开始的13位到SDRAm上,由于2440的存储控制器每次只能以4byte对齐访问,一个int的4个byte分别存储在2个芯片上,然后4byte的数据读到存储控制器,地址还未用到的最低2位在存储控制器里面决定是用哪个byte。这就是一个byte的寻址过程。

      2440SDRAM可以使用16位宽的2片拼接,或者8位的4片拼接,32位的1片。显然如果是2片时,这2片的大小必须要一样大的,否则多出来的就会只能存16bit,其他的位会丢失掉,4片也是同样的。

      H57V2562GTR,SDRAM管脚说明

    外接管脚名

    内接管脚名

    全称

    描述

    A2~A14

    A0~A12

    Address

    地址线

    D0 ~D31

    DQ0~DQ31

    Data Input/Output

    数据线

    A24,A25

    BA0,BA1

    Bank Address

    L-BANK片选信号

    DQM0~DQM3

    LDQM, UDQM

    Data Input/Output Mask

    高,低字节数据掩码信号

    SCKE

    SCKE

    Clock Enable

    输入时钟有效信号

    SCLK

    SCLK

    Clock

    输入时钟

    nSCS0

    nSCS

    General Chip Select

    片选信号(它与nGCS6是同一管脚的两个功能)

    nSRAS

    nSRAS

    Row Address Strobe

    行地址选通信号

    nSCAS

    nSCAS

    Column Address Strobe

    列地址选通信号

    nWE

    newnWE

    Write Enable

    写入有效信号

     看2片SDRAM和2440的接线可以看出来,它们只有数据脚和LDQM UDQM引脚不同,这2个引脚来决定数据引脚上高8位和低8位的有效性,由于2440内存控制器只能发出4byte对齐的数据给SDRAM(data线的连接固定了),那么我如果只想存储或者读取一个byte,怎么办?由这2个引脚来控制,它来决定16位宽的高低8位的有效性,确保不想改的byte内容不变。

    参考自:

    http://blog.csdn.net/mr_raptor/article/details/6555786

  • 相关阅读:
    Spring学习笔记
    Bash编程(6) String操作
    Bash编程(5) Shell方法
    Bash编程(4) 参数与变量
    Bash编程(2) 循环与分支
    CentOS 升级 openSSH
    Bash编程(1) 基础
    DNS配置
    资料收集:学习 Linux/*BSD/Unix 的 30 个最佳在线文档
    【数位DP】[LOJ10168] 恨7不成妻
  • 原文地址:https://www.cnblogs.com/thammer/p/4553436.html
Copyright © 2011-2022 走看看