2440與SDRAM連接的幾點理解

轉自http://blog.mcuol.com/User/TKWTKW/Article/53417_1.htm

最近在分析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)。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章