04-内存控制器与SDRAM

声明:

本文是在韦东山的笔记上做一些自己的注释,方便学习理解。原文地址:

第1节 内存接口概念

1.1 GPIO/门电路接口、协议类接口

首先来分析下操作GPIO控制器和操作UART控制器两者的区别。
如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。
在这里插入图片描述
配置GPIO控制器相应的寄存器(如图中的,CPU传输某个值给GPFCON、GPFDAT),即可让引脚输出高低电平;配置UART控制器相应的寄存器(如图中的,CPU传输某个值给UCON0、UTXH0),即可让引脚输出波形。
前者相对简单,类似门电路,后者相对复杂,属于协议类接口(类似的协议类接口还有iic、iiGPFDATs、spi等)。
总结下来就是:对于CPU是不管什么接口的,它只写相应的寄存器,由控制器(如GPIO控制器、UART控制器)根据寄存器的配置去控制具体的引脚。
那么CPU是如何访问各个不同的寄存器(如GPFCON、UCON0等)的呢?
答:CPU只管发出一个地址,内存控制器根据该地址选择不同的模块,然后从模块中得到数据或者发送数据到模块中。(CPU发出地址让内存控制器去根据这个地址选择寄存器,然后CPU发出数据以配置寄存器)。

1.2 内存类接口

前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部,接下来的内存类接口,会把地址输出到外部,比如Nor Flash、网卡、SDRAM。
如图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去,然后内存控制器根据片选信号 选择相应的设备并让这个设备去接收地址和数据信号(这里的设备指的是SDRAM、DM9000网卡、Nor Flash),以达到SDRAM、DM9000和Nor Flash之间互不干扰的目的。
在这里插入图片描述
片选信号和地址的关系怎么确定?这个是由2440芯片特性决定的。
在这里插入图片描述
上图,当选择Nor Flash启动时:
(1)当CPU发出的指令的地址范围处于0x0000000 - 0x08000000时,内存控制器就会使nGCS0处于低电平(片选引脚被选中),Nor Flash被选中。
(2)当CPU发出的指令的地址范围处于0x20000000 - 0x28000000,内存控制器就会使nGCS4处于低电平(片选引脚被选中),网卡被选中。
(3)当CPU发出的指令的地址范围处于0x30000000 - 0x38000000,内存控制器就会使nGCS6处于低电平(片选引脚被选中),SDRAM被选中。
内存控制器根据不同的地址范围,发出不同的片选引脚,只有被片选引脚选中的芯片才能正常工作,不被选中的芯片就像不存在一样,不工作。

1.3 Nand flash接口

1.3.1 GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。而对于Nand Flash,在原理图上它的地址线并没有连接到CPU,因此它不参与CPU的统一编址。它的数据线也接到了数据总线上,为了防止干扰,它也有一个片选信号(CE)。当CPU访问Nand Flash时,Nand Flash控制器才会片选Nand Flash,让其接收数据总线上的数据。
在这里插入图片描述
1.3.2 再来看下Nor Flash的空间,0x00000000 * 0x08000000,为128M,即每一个片选信号可以选择的空间是128M=2^27,也就需要A0、A1……A26,共27根地址线。CPU发出的32位地址线给内存控制器,内存控制器根据地址范围,片选上相应的bank(这里的bank可以理解为设备即Nor flash,对应上上一幅图片的0x00000000 * 0x08000000即nGCS0片选信号,并对应2440中的BANKCON0寄存器),并将地址转化为27位
在这里插入图片描述

第2节 不同位宽设备的连接

2.1 先来观察一个现象:

参考2440芯片手册,可以看到内存接口与8-bit ROM连接时,2440的A0与外部芯片的A0相连。
(ROM是以前的名称,现在叫flash)
在这里插入图片描述
当与两个8-bit ROM拼接成的一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。
在这里插入图片描述
当与四个8-bit ROM拼接成的一个32-bit ROM连接时,2440的A2与外部芯片的A0相连。
在这里插入图片描述
当与一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。
在这里插入图片描述
可以看出的现象是:外接芯片的位宽有变化时,地址线的接法也会有变化(8bit的是A0接A0,两个8bit拼接为一个16位的是A1接A0,四个8bit的拼接为32位是A2接A0,一个16bit的是A1接A0,)。那这个变化有什么规律呢?

假设CUP执行如下命令:

MOV R0, #3  @去地址为3的内存上
LDRB R1, [R0]  @ 从内存为3的地址上,读出一个字节(B表示Byte)

如图有8bitROM、16bitROM、32bitROM。
在这里插入图片描述
首先说明一点:8个bit组成一个字节,字节是计算机的最小的存储单位,因此我们读取数据肯定都是8bit的倍数。

(1)对于8bitROM ,8bit是一次读写的最小单位,即0地址是第一个8bit,1地址是第二个8bit;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,8bitROM的A0和A1收到的也都是1,于是找到了ROM上地址为3的8bit数据,包含了我们需要的数据。
(2)对于16bitROM ,16bit是一次读写的最小单位,即0地址是第一个16bit,里面有两个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,16bitROM的A0和A1分别收到的是1和0,于是找到了ROM上地址为1的16bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。
(3)对于32bitROM ,32bit是一次读写的最小单位,即0地址是第一个32bit,里面有四个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为0,32bitROM的A0和A1收到的都是0,于是找到了ROM上地址为0的32bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。
在这里插入图片描述
对这个例子进行总结:接到芯片(ROM)上的引脚用来确定读取芯片上的哪一个单元的数据,把这个单元的数据返回给内存控制器。内存控制器会根据没有连接芯片的引脚,来确定返回该单元数据中的哪一个字节(你这里传递的是8位,是一个字节),并将这个字节给CPU。

2.2 再举一个例子

: 假如传递一个32位的数据时

MOV R0,   #4
LDR  R1,  [R0]  @去地址4,读取4字节数据(即4567四个字节)

执行过程如下:
(1)8bitROM: 当CPU发出地址(000100),内存控制器会把000100,000101,000110,000111处的地址转发给ROM,ROM会把得到的地址000100,000101,000110,000111,上的数据返回给内存控制器,内存控制器会把得到的4个8bit的数据组装成一个32位的数据返回给CPU。
(2)16bitROM: 当CPU发出地址(000100),内存控制器会把00010,00011处的地址转发给ROM,ROM会把得到的地址00010,00011,上的数据返回给内存控制器,内存控制器会把得到的2个16bit的数据组装成一个32位的数据返回给CPU。
(3)32bitROM: 当CPU发出地址(000100),内存控制器会把0001处的地址发送给ROM,ROM会把得到的地址0001上的数据返回给内存控制器,内存控制器会把得到的1个32bit数据返回给CPU。

2.3 最后一个问题

:怎样确定芯片的访问地址?
答: 1. 根据片选信号确定基地址, 2. 根据芯片所接地址线确定范围
2.3.1 对这个问题做一个实例:
(1) Nor Flash 使用的是片选0(nGCS0),基地址为0,用到A20,A19…A1,A0共21条地址线,所以地址范围为0x00000000 ~ 0x1FFFFF也就是2M的空间大小。
(2)网卡(Net)使用的是片选4(nGCS4),基地址为0x20000000,用到A2,A0共2根地址线,所以地址范围为0x20000000 ~ 0x20000005。
(3) SDRAM使用的是片选6(nGCS6),基地址为0x30000000。
注:这里的基地址是上面的第三张图(即2440芯片手册中的Figure 5-1. S3C2440A M

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值