高速电路PCB网,专注于嵌入式方案,信号完整性和电源完整性仿真分析,高速电路PCB设计,各种EDA工具(Cadence\Mentor\\AD\\CAM\ANSYS HFSS)交流学习。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
最近在分析uboot中关于6410的 cpu_init.s,这是对DDR的配置,由于DDR是SDRAM的升级,所以就先看了一下SDRAM,以下是最近的总结。 看下图:  这是64M(32M+32M),SDRAM的原理图 1、为什么2440或2410中地址线都是从ADDR2中开始连接的? 2440或2410中地址线都是从ADDR2中开始连接的,即A0-ADDR2、An- ADDR(n+2)、这是因为ARM是32位处理器所以它一次处 理数据都是以32位为单位的,也就是说它读或者写数据时,地址只能为0x0、0x04、0x08、。。。即4字节对齐,因为一般DDR 的数据线都为16位,所以为了得到32位的数据,一般都是将2个DDR连在一起,它们的地址相同,所以对已DDR而言是一个地址 对应4个字节(因为一个DDR对应2个字节,两个DDR就对因4个字节),但是对于CPU而言一个地址只对应1个字节,所以这里 就存在一个地址转换问题,即使CPU的0~3地址里的数据对应DDR的0地址数据,CPU的4~7地址的数据对应DDR的1地址的数据 ,所以CPU的0地址对应DDR的0地址,0X04地址对应DDR中1地址,0x08地址对应DDR中2地址,可以看出,DDR的地址刚好是 CPU寻址向右移动两位,所以2440或2410中地址线都是从ADDR2开始连接的。 2、为什么寻 32M只用了13根地址线? 要想了解这个首先的从DRAM的结构说起,下图是关于DRAM的内部结构图: 可以看到一片DRAM其实是由4片4Mx16的存储块组成,其中4M指的是4Mbit个存储单元,16指的是每个存储单元存储的 位数,即2个字节,由此可知,bank0和bank1就是用来选择4片存储块的,bank0和bank1是用来确定是那个存储块,在 K4S561632C中有4个bank,00代表bank0, 01代表bank1, 10代表bank2, 11代表bank3,需要知道的是这4片存储块是相互 独立的,并且每个存储块都是阵列结构,所谓阵列结构指的是它是由行列组成的,行列是什么请看下图: 我们可以把一个bank看做是由一个个方格组成的存储块,而方格的个数就是4Mbit,每个方格的容量则为16bit,你要想 确定一个方格的地址首先要确定它的行地址,再确定它的列地址,两线相交确定一点,这一点就是你要的地址。 一般SDRAM的地址线都采用分时复用原则,即先送行地址,再送列地址,K4S561632C这款芯片Row address : RA0 ~ RA12, Column address : CA 0 ~ CA8,即前9个地址线是复用的。 所以寻址的时候先发送RA0 ~ RA12行地址,在发送CA 0 ~ CA8列地址,而RA0 ~ RA8和CA 0 ~ CA8用的其实是同一个 管脚,按照行地址13个,列地址9个,算,最多能寻址2^22,即4194304个地址,换算成Mbit刚好是4Mbit,即一个bank的 大小,这就是为什么寻32M只用了13根地址线的原因。 3、为什么bank0和bank1与2440的ADDR24和ADDR25连接? 前面我们已经了解到bank0和bank1是用来选择存储块的,32M的空间需要25根地址线寻址,但是对于K4S561632C只需 要24根,因为它每个存储单元存储2个字节,我们来分一下,这24根地址线的前13根行地址,紧接着的9根为列地址,那么最 后两根是干嘛?显而易见它是bank地址,用来选择存储块,所以BANK0接23, BANK1接24,但是由于我们是从ADDR2开始 连得原因前面已经解释过了,所以每个地址加2.最后的地址连接方法,就是ADDR2~ ADDR14对应行地址, ADDR15~ ADDR23 对应列地址,(由于管脚的分时复用其实是DDR2~ ADDR14对应行地址, ADDR2~ ADDR10对应列地址)ADDR24~ ADDR25 对应BANK0~ BANK1,这就是bank0和bank1与2440的ADDR24和ADDR25连接的原因。 补充:可以看到最上面那副图,是由两片K4S561632C组合在一起的,这样做的效果是什么? 我们已经知道1片K4S561632C有4个bank,两片K4S561632C就有8个bank了,当连接一个K4S561632C时,一个地址对应2个 字节,现在连接了两片K4S561632C那么,一个地址就对应4个字节了,即一个字,总共64MB,当一个地址存放1个字节,我们需 要64Mbit个地址才能达到64MB的容量,现在容量不变,每个地址里存放的字节数增多了,那么必然需要的地址数就减少了, 根据存储容量(BYTE)=地址数*每个地址能存的字节数,可知当每个地址里存放的字节数增大4倍时,我们的地址数会变 为原来的1/4, 当一个地址存放4个字节,我们只需要16Mbit个地址就能达到64MB的容量,16Mbit代表24根地址线 (2^24=16Mbit=16*1024*1024),但是对于2440而言,一个地址只能对应1个字节,即是以BYTE为单位的,比如现在定义一个 数组并对它进行初始化:uchar a[]={0,1,2,3};假设0存放在地址a处,那么1就存放在a+1处, 2就存放在a+2处, 3就存放 在a+3处,也就是说对于2440而言每个地址只存放一个字节, ,所以对于2440而言,寻址64MB的内存需要26根地址线,如果 我们把这4个字节存放进上面的SDRAM中,其实他们都是存放在一个地址里的,0和1存放在左边的K4S561632C中,2和3 存放在右边的K4S561632C中,存放的地址都相同,可以看出2440寻址64MB的SDRAM时用到了26根线(最高两位刚好 是25~24印证了问题3),但是这64MB的SDRAM实际只需要24根线就可以寻完(因为2440中的4个地址相当于SDRAM中的 1个地址),所以2440中最后两根地址线就没什么用了(印证了问题1)。
该帖已经同步到电子微博网 易阳的微博 |