SDRAM的工作原理、控制時序、及相關控制器的配置方法一直是嵌入式系統學習、開發過程中的一個難點。掌握SDRAM 的知識對硬件設計、編寫系統啓動代碼、提高系統存取效率、電源管理都有一定的意義。本文想通過:
1.SDRAM的工作原理。
2.HY57V561620 SDRAM介紹。
3.S3C2410和HY57V561620的接線方法。
4.S3C2410 SDRAM控制器的配置方法。
5.SDRAM控制時序分析
這5個方面來幫助初學者瞭解SDRAM。文章分爲2篇,第1篇講解前3個知識點,第2篇講解後2個。
一、SDRAM的工作原理
SDRAM之所以成爲DRARM就是因爲它要不斷進行刷新(Refresh)才能保留住數據,因此它是 DRAM最重要的操作。
那麼要隔多長時間重複一次刷新呢?目前公認的標準是,存儲體中電容的數據有效保存期上限是64ms(毫 秒,1/1000秒),也就是說每一行刷新的循環週期是64ms。這樣刷新速度就是:行數量/64ms。我們在看內存規格時,經常會看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的標識,這裏的4096與8192就代表這個芯片中每個Bank的行數。刷新命令一次對一行有效,發送間隔也是隨總行數而變 化,4096行時爲15.625μs(微秒,1/1000毫秒),8192行時就爲7.8125μs。HY57V561620爲8192 refresh cycles / 64ms。
SDRAM是多Bank結構,例如在一個具有兩個Bank的SDRAM的模組中,其中一個Bank在進
行預充電期間,另一個Bank卻馬上可以被讀取,這樣當進行一次讀取後,又馬上去讀取已經預充電Bank的數據時,就無需等待而是可以直接讀取了,這也就
大大提高了存儲器的訪問速度。
爲了實現這個功能,SDRAM需要增加對多個Bank的管理,實現控制其中的Bank進行預充電。在一個具有2個以上Bank的SDRAM中,一般會多一
根叫做BAn的引腳,用來實現在多個Bank之間的選擇。
SDRAM具有多種工作模式,內部操作是一個複雜的狀態機。SDRAM器件的引腳分爲以下幾類。
(1)控制信號:包括片選、時鐘、時鐘使能、行列地址選擇、讀寫有效及數據有效。
(2)地址信號:時分複用引腳,根據行列地址選擇引腳,控制輸入的地址爲行地址或列地址。。
(3)數據信號:雙向引腳,受數據有效控制。
SDRAM的所有操作都同步於時鍾。根據時鐘上升沿控制管腳和地址輸入的狀態,可以產生多種輸入命令。
模式寄存器設置命令。
激活命令。
預充命令。
讀命令。
寫命令。
帶預充的讀命令。
帶預充的寫命令。
自動刷新命令。
自我刷新命令。
突發停命令。
空操作命令。
根據輸入命令,SDRAM狀態在內部狀態間轉移。內部狀態包括模式寄存器設置狀態、激活狀態、預充狀
態、寫狀態、讀狀態、預充讀狀態、預充寫狀態、自動刷新狀態及自我刷新狀態。
SDRAM支持的操作命令有初始化配置、預充電、行激活、讀操作、寫操作、自動刷新、自刷新等。所有的操作命令通過控制線CS#、RAS#、CAS#、
WE#和地址線、體選地址BA輸入。
1 、行激活
行激活命令選擇處於空閒狀態存儲體的任意一個行,使之進入準備讀/寫狀態。從體激活到允許輸入讀/寫命 令的間隔時鐘節拍數取決於內部特徵延時和時鐘頻率。HY57V561620內部有4個體,爲了減少器件門數,4個體之間的部分電路是公用的,因此它們不能 同時被激活,而且從一個體的激活過渡到另一個體的激活也必須保證有一定的時間間隔。
2 、預充電
預充電命令用於對已激活的行進行預充電即結束活動狀態。預充電命令可以作用於單個體,也可以同時作用於 所有體(通過所有體預充電命令)。對於猝發寫操作必須保證在寫入預充電命令前寫操作已經完成,並使用DQM禁止繼續寫入數據。預充電結束後回到空閒狀態, 也可以再次被激活,此時也可以輸入進入低功耗、自動刷新、自刷新和模式設置等操作命令。
預充電中重寫的操作與刷新操作一樣,只不過預充電不是定期的,而只是在讀操作以後執行的。因爲讀取操作 會破壞內存中的電荷。因此,內存不但要每64ms刷新一次,而且每次讀操作之後還要刷新一次。
3 、自動預充電
如果在猝發讀或猝發寫命令中,A10/AP位置爲“1”,在讀寫操作完成後自動附加一個預充電動作。操 作行結束活動狀態,但在內部狀態機回到空閒態之前不能給器件發送新的操作命令。
4 、猝發讀
猝發讀命令允許某個體中的一行被激活後,連續讀出若干個數據。第一個數據在經過指定的CAS延時節拍後 呈現在數據線上,以後每個時鐘節拍都會讀出一個新的數據。猝發讀操作可以被同體或不同體的新的猝發讀/寫命令或同一體的預充電命令及猝發停止命令中止。
5 、猝發寫
猝發寫命令與猝發讀命令類似,允許某個體中的一行被激活後,連續寫入若干個數據。第一個寫數據與猝發寫 命令同時在數據線上給出,以後每個時鐘節拍給出一個新的數據,輸入緩衝在猝發數據量滿足要求後停止接受數據。猝發寫操作可以被猝發讀/寫命令或DQM數據 輸入屏蔽命令和預充電命令或猝發停止命令中止。
6 、自動刷新
由於動態存儲器存儲單元存在漏電現象,爲了保持每個存儲單元數據的正確性,HY57V561620必須 保證在64ms內對所有的存儲單元刷新一遍。一個自動刷新週期只能刷新存儲單元的一個行,每次刷新操作後內部刷新地址計數器自動加“1”。只有在所有體都 空閒(因爲4個體的對應行同時刷新)並且未處於低功耗模式時才能啓動自動刷新操作,刷新操作執行期間只能輸入空操作,刷新操作執行完畢後所有體都進入空閒 狀態。該器件可以每間隔7.8μs執行一次自動刷新命令,也可以在64ms內的某個時間段對所有單元集中刷新一遍。
7 、自刷新
自刷新是動態存儲器的另一種刷新方式,通常用於在低功耗模式下保持SDRAM的數據。在自刷新方式 下,SDRAM禁止所有的內部時鐘和輸入緩衝(CKE除外)。爲了降低功耗,刷新地址和刷新時間全部由器件內部產生。一旦進入自刷新方式只有通過CKE變 低才能激活,其他的任何輸入都將不起作用。給出退出自刷新方式命令後必須保持一定節拍的空操作輸入,以保證器件完成從自刷新方式的退出。如果在正常工作期 間採用集中式自動刷新方式,則在退出自刷新模式後必須進行一遍(對於HY57V561620來說,8192個)集中的自動刷新操作。
8 、時鐘和時鐘屏蔽
時鐘信號是所有操作的同步信號,上升沿有效。時鐘屏蔽信號CKE決定是否把時鐘輸入施加到內部電路。在 讀寫操作期間,CKE變低後的下一個節拍凍結輸出狀態和猝發地址,直到CKE變高爲止。在所有的體都處於空閒狀態時,CKE變低後的下一個節拍SDRAM 進入低功耗模式並一直保持到CKE變高爲止。
9 、DQM操作
DQM用於屏蔽輸入輸出操作,對於輸出相當於開門信號,對於輸入禁止把總線上的數據寫入存儲單元。對讀 操作DQM延遲2個時鐘週期開始起作用,對寫操作則是當拍有效。
HY57V561620命令表如下圖所示:
二、HY57V561620 SDRAM介紹
1、HY57V561620的結構
HY57V561620存儲容量爲4M×4bank×16位(32M字節),工作電壓爲3.3V,常見 封裝爲54腳TSOP,兼容LVTTL接口,支持自動刷新(Auto-Refresh)和自刷新(Self-Refresh),16位數據寬度。
HY57V561620引腳分佈如圖2-1所示。
HY57V561620引腳信號描述
更具體的內容可參考HY57V561620的用戶手冊。
三、S3C2410和HY57V561620的接線方法
華清遠見教學用的S3C2410開發板上使用的SDRAM的型號是HY57561620。規格是:
4Banks*4M*16Bit。採用兩片SDRAM組成32位64M的內存空間。
1 、確定BA0 、BA1 的 接線
在S3C2410的Table 5-2. SDRAM Bank Address Configuration 給出了SDRAM接線的參考方法。
上表中各段含義及和我們平臺的對應:
Bank Size: 每個Bank的大小
(HY57561620是4M*16=64MB)Bus Width: 總線寬度
(兩顆HY57561620,32位)
Base Component:個體容量 (256Mb)
Memory Configration:內存配置 ((4M*16*4banks)*2ea )
所以Bank Address對應A[25:24],此處確定了HY57561620的BA0和BA1和S3C2410之間的接線。
2 、確定其它接線
上圖是S3C2410手冊中給出的參考接線,通過這個圖可以確定 HY57561620和S3C2410之間除BA0、BA1的所有其它接線。本例中,詳細的接線方法如“接線原理圖”小節。
3、接線原理圖
引腳描述如下:
nSRAS:SDRAM行地址選通信號
nSCAS:SDRAM列地址選通信號
nGCS6:SDRAM芯片選擇信號(選用Bank6作爲sdram空間,也可以選擇Bank7)
nWBE[3:0]:SDRAM數據屏蔽信號
SCLK0[1]:SDRAM時鐘信號
SCKE:SDRAM時鐘允許信號
DATA[0:31]:32位數據信號
ADDR[2:14]:行列地址信號
ADDR[25:24]:bank選擇線
四、S3C2410 SDRAM控制器的配置方法
在系統使用SDRAM之前,需要對S3C2410X的存儲器控制器進行初始化。其中對與 SDRAM(Bank6)相關的寄存器進行了特殊的設置,以使SDRAM能夠正常工作。由於C語言程序使用的數據空間和堆棧空間都定位在SDRAM上,因 此,如果沒有對SDRAM(Bank6)的正確初始化,系統就無法正確啓動。下面介紹與SDRAM相關的寄存器設置。
1、BWSCON寄存器
BWSCON寄存器主要用來設置外接存儲器的總線寬度和等待狀態。在BWSCON中,除了Bank0, 其他7個bank都各對應4個相關位的設置,分別爲STn,WSn和DWn。這裏只需要對DWn進行設置,例如SDRAM(Bank6)採用32位總線寬 度,因此,DW6=10,其他2位採用缺省值。BWSCON寄存器在Bank6上的位定義如表4-1所示。
表4-1 BWSCON寄存器在Bank6上的位定義
BWSCON |
位 |
描述 |
初始化狀態 |
ST6 |
27 |
這個位決定SRAM在Bank6上是否採用UB/LB |
0 |
WS6 |
26 |
這個位決定Bank6的WAIT狀態 |
0 |
DW6 |
25~24 |
這2位決定Bank6的數據總線寬度 |
0 |
2、BANKCONn寄存器的設置
S3C2410X有8個BANKCONn寄存器,分別對應着Bank0~Bank7。由於 Bank6~Bank7可以作爲FP/EDO/SDRAM等類型存儲器的映射空間,因此與其他bank的相應寄存器有所不同,其中MT位定義了存儲器的類 型。BANKCONn寄存器在Bank6和Bank7上的位定義如表4-2所示。
表4-2 BANKCONn寄存器在Bank6和Bank7上的位定義
BANKCONn |
位 |
描述 |
起始狀態 |
MT |
16~15 |
這2位決定了Bank6和Bank7的存儲器類型 |
11 |
MT的取值又定義該寄存器餘下幾位的作用。當MT=11(即SDRAM型存儲器)時,BANKCONn 寄存器餘下的幾位定義如表4-3所示。
表4-3 BANKCONn寄存器在MT=11時的相關位定義
Trcd是從行使能到列使能的延遲,根據S3C2410X的HCLK頻率(100M)及 HY57V561620T-H的特性(見下圖),此項取01,即3CLKS。SCAN爲列地址線數量,此項根據HY57V561620特性取01,即9位 (A0~A8)。
3 、REFRESH 寄 存器
REFRESH寄存器是DRAM/SDRAM的刷新控制器。位定義如表4-4所示。
表4-4 REFRESH寄存器位定義
4 .BANKSIZE 寄 存器
表4-5 BANKSIZE寄存器定義
BANKSIZE |
位 |
描述 |
初始狀態 |
BURST_EN |
[7] |
ARM 內核猝發操作使能 |
0 |
保留 |
[6] |
不使用 |
0 |
SCKE_EN |
[5] |
SCKE 使能控制 |
0 |
SCLK_EN |
[4] |
只有在SDRAM訪問週期期間,SCLK才使能,這樣 |
0 |
保留 |
[3] |
未用 |
0 |
BK76MAP |
[2:0] |
BANK6/7的存儲空間分佈 |
010 |
初始化時,BURST_EN可以取0或1,爲了提高效率,最好設置爲1。 SCKE_EN設置爲1。SCLK_EN設置爲1。BK76MAP設置爲2。
5、MRSR寄存器
MRSR寄存器有2個,分別對應MRSRB6和MRSRB7,對應着 Bank6和Bank7。見表4-6。
表4-6 MRSRn寄存器定義
此寄存器S3C2410只允許CL可以設置,參照HY57V561620T-H手冊,取011,即 3CLKs。
猝發長度的具體值在程序中沒有給出,根據後面觸發時序猜測應該是8,HY57V561620T支持1、 2、4、8、page猝發長度。
參照前面的HY57V561620命令表,寫Mode寄存器用的是Mode register命令。其中的OP CODE參照下圖:
注意:當代碼在SDRAM中運行時,絕不能夠重新配置MRSR寄存器。
五、SDRAM的控制時序分析
下面列出SDRAM的狀態機及幾種SDARM控制命令的時序。大家掌握了以後可以試着分析其它的命令時 序。
1、SDRAM的狀態機
SDRAM的完整狀態機由多個狀態構成,且狀態轉移是非隨機的(如圖5-1所示)。
正是如此衆多的狀態及其複雜的轉換關係,導致SDRAM的控制較爲複雜。通常FPGA開發人員在設計 SDRAM控制器IP時需要詳細瞭解這些狀態機的過程。而一般開發人員以瞭解爲主。
圖5-1 SDRAM狀態機
下面將結合上圖及SDRAM的指令來分析SDRAM的控制時序
2、SDRAM single模式讀時序
SDRAM初始化主要是由設置S3C2410 SDRAM控制器的模式寄存器(MRSR)完成的。主要設定了SDRAM的burst長度、CAS延時時間、突發類型等。然後就可以進行讀寫操作了。
下圖是S3C2410以single方式讀SDRAM時的時序。
對照HY57V5620的命令表,列出single read 命令實現過程。
CLK |
SCKE |
A10/AP |
nGCSx |
nSRAS |
nSCAS |
nWE |
命令 |
備註 |
1 |
1 |
X |
1 |
1 |
1 |
1 |
空操作(NOP) |
|
2 |
1 |
0 |
0 |
0 |
1 |
0 |
預充電選定bank(PRE) |
Trp=2 |
3 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
4 |
1 |
X |
0 |
0 |
1 |
1 |
Bank激活命令(ACT) |
Trcd=2 |
5 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
6 |
1 |
0 |
0 |
1 |
0 |
1 |
讀操作(READ) |
Tcl=3 |
7 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
8 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
9 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
數據有效 |
3、SDRAM burst模式讀時序
對照HY57V5620的命令表,列出burst read 命令實現過程。
CLK |
SCKE |
A10/AP |
nGCSx |
nSRAS |
nSCAS |
nWE |
命令 |
備註 |
1 |
1 |
X |
1 |
1 |
1 |
1 |
空操作(NOP) |
|
2 |
1 |
0 |
0 |
0 |
1 |
0 |
預充電選定bank(PRE) |
Trp=2 |
3 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
4 |
1 |
X |
0 |
0 |
1 |
1 |
Bank激活命令(ACT) |
Trcd=2 |
5 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
6 |
1 |
0 |
0 |
1 |
0 |
1 |
讀操作(READ) |
Tcl=2 |
7 |
1 |
0 |
0 |
1 |
0 |
1 |
讀操作(READ) |
|
8~13 |
1 |
0 |
0 |
1 |
0 |
1 |
讀操作(READ) |
數據有效 |
14~15 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
數據有效 |
4、SDRAM Self Refresh時序
SDRAM 的Self Refresh功能在電源電源管理時經常使用,如:在主控器進入sleep狀態時,會先讓SDRAM工作在Self Refresh狀態。下圖爲S3C2410發出Self Refresh命令時的時序圖。
對照HY57V5620的命令表,列出進入Self Refresh的過程。
CLK |
SCKE |
A10/AP |
nGCSx |
nSRAS |
nSCAS |
nWE |
命令 |
備註 |
1 |
1 |
X |
1 |
1 |
1 |
1 |
空操作(NOP) |
|
2 |
1 |
1 |
0 |
0 |
1 |
0 |
預充電所有bank(PRE) |
Trp=2 |
3 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
4 |
0 |
X |
0 |
0 |
0 |
1 |
Self Refresh命令(REFS) |
結合CKE的真值表 |
5 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
5、S3C2410 BUS Request時SDRAM控制時序
我以前在做一個項目時涉及到兩個主控器共享一個SDRAM的情 況。現象是另一個主控器可以通過BUS Request功能獲取到總線的控制權。當S3C2410的總線控制權被獲取後,SDRAM控制不會再發出控制時鐘信號。但SDRAM並沒有因爲失去時鐘 而丟失數據。猜想一定是S3C2410在BUS Request時讓SDRAM進入自刷新狀態(就和S3C2410睡眠前要讓SDRAM進入自刷新狀態一樣)、POWER DOWN狀態、或者SUSPEND狀態。下面就根據S3C2410 BUS Request時SDRAM控制時序圖去確認一下到底是哪種。
對照HY57V5620的命令表,列出S3C2410 BUS Request時SDRAM時序過程。
CLK |
SCKE |
A10/AP |
nGCSx |
nSRAS |
nSCAS |
nWE |
命令 |
備註 |
1 |
1 |
X |
1 |
1 |
1 |
1 |
空操作(NOP) |
|
2 |
1 |
0 |
0 |
0 |
1 |
0 |
預充電(PRE) |
Trp=2 |
3 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
4 |
1 |
X |
0 |
0 |
1 |
1 |
Bank激活命令(ACT) |
Trcd=2 |
5 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
6 |
1 |
0 |
0 |
1 |
0 |
1 |
讀操作(READ) |
Tcl=2 |
7 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
8 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
9 |
1 |
X |
1 |
1 |
1 |
1 |
空操作 |
|
10 |
HZ |
HZ |
HZ |
HZ |
HZ |
HZ |
進入Clock suspend |
Note 1 |
Note1:在第10個時鐘週期時,SKE從1變爲’HZ’(高阻)。我想此時SCKE從1變爲高阻對
於SDRAM來說相當於從1->0吧,看了一遍HY57V5620手冊,這個想法沒有得到確認。但也只能這麼理解了,不然後面都說不通了。我想之所
以變爲高阻而不是低電平,是因爲S3C2410要放棄自己對總線控制。
結合HY57V5620手冊分析一下此時SDRAM會進入什麼狀態。
下圖是CKE Enable(CKE) 真值表。
在第10個時鐘週期時,SDRAM處於行激活狀態。此時SCKE由 1->0, 根據真值表可以得出系統會進入Clock suspend狀態
六、總結
本文分析了SDRAM的工作原理、介紹了HY57V561620及其與 S3C2410的接線原理、S3C2410 SDRAM控制器的配置方法、及部分SDRAM的控制時序分析。有些地方理解的不夠深刻,歡迎大家指正。