作者:田凱文
日期:2011-6-6 14:59:16
PS:本人總結,備於日後查閱,如若轉載,請註明出處
QQ:1324343063
最近在分析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的儲存塊也就是bank組成,其中4M指的是4Mbit個儲存單元,16指的是每個儲存單中繼存放區的位元,即2個位元組。由此可知,bank0和bank1就是用來選擇訪問哪個bank的,在K4S561632C中有4個bank,00代表bank0,01代表bank1, 10代表bank2, 11代表bank3,需要知道的是這4片儲存塊是相互獨立的,並且每個bank都是陣列結構,所謂陣列結構指的是它是由行列組成的,行列是什麼請看:
我們可以把一個bank看做是由許多方格組成的儲存塊,而方格的個數就是4Mbit,每個方格的容量則為16bit,你要想確定一個方格的地址首先要確定它的行地址,再確定它的列地址,兩線相交確定一點,這一點就是你要的地址。
一般SDRAM的地址線都採用分時複用原則,即先送行地址,再送列地址,K4S561632C這款晶片Row address : RA0 ~ RA12, Column address : CA 0 ~ CA8,即前9個地址線是被行列複用的。
所以定址的時候先發送bank地址和RA0 ~ RA12行地址,然後再發送CA 0 ~ CA8列地址。按照行地址13個,列地址9個,總容量為4 * 2^13 * 2 ^ 9 * (16 / 8) = 32MB
3、為什麼bank0和bank1與2440的ADDR24和ADDR25串連?
前面我們已經瞭解到bank0和bank1是用來選擇儲存塊 (bank)的,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)。
Y(^_^)Y