详解内存SDRAM原理(P-Bank、L-Bank、刷新、预充电等)
嵌入式設備上的內存大多使用SDRAM,今天通過這篇文章徹徹底底搞清楚,SDRAM結構、原理,以及L-BANK,P-BANK等概念。
本文部分內容借鑒了《高手進階!終極內存技術指南》一·文,寫得非常好,我也不知道原作者是誰,在此表示敬意。
SDRAM: Synchronous Dynamic Random Access Memory,同步動態隨機存儲器。
同步是指其時鐘頻率與CPU前端總線的系統時鐘頻率相同,并且內部的命令的發送與數據的傳輸都以它為基準;
動態是指存儲陣列需要不斷的刷新來保證數據不丟失;
隨機是指數據不是線性依次存儲,而是自由指定地址進行數據的讀寫。
1. 物理Bank(P-Bank)
先來看兩個概念
CPU數據總線的位寬:
CPU在一個傳輸周期能接受的數據容量就是CPU數據總線的位寬,單位是bit(位)。例如S3C2440個周期最多能接受32位數據,因此它數據總線的位寬是32位的。
內存芯片位寬:
每個內存芯片也有自己的位寬,即每個傳輸周期能提供的數據量。例如:EM63A165 SDRAM的位寬是16位的。
要使CPU正常工作,內存總線的數據位寬應當等同于CPU數據總線的位寬。
P-Bank(Physical Bank)其實就是一組內存芯片的集合,這個集合的容量不限,但這個集合的總位寬必須與CPU數據位寬相符。
假設CPU位寬為32位:
如果有一個內存芯片位寬為32位,那1個芯片就可以稱為P-Bank;
如果有一個內存芯片位寬為16位,那2個這個芯片合在一起叫P-Bank;
如果有一個內存芯片位寬為8位,那4個這個芯片合在一起叫P-Bank。
2.? 邏輯Bank(L-Bank)
SDRAM的內部簡單地說是一個存儲陣列。
陣列就如同表格一樣,將數據“填”進去,你可以它想象成一張表格。
內存芯片尋址的基本原理:和表格的檢索原理一樣,先指定一個行(Row),再指定一個列(Column),我們就可以準確地找到所需要的單元格。
對于內存,這個單元格可稱為存儲單元,那么這個表格(存儲陣列)叫什么呢?它就是邏輯Bank(Logical Bank,下文簡稱L-Bank)。
存儲單元的位寬就是內存芯片的位寬。我們的芯片是16位的,所以我們的存儲單元也就是16位的。
由于技術、成本等原因,不可能只做一個全容量的L-Bank,人們在SDRAM內部分割成多個L-Bank,基本都是4個。
這樣,在進行尋址時就要先確定是哪個L-Bank,然后再在這個選定的L-Bank中選擇相應的行與列進行尋址。
3. 內存芯片容量
內存芯片的容量就是所有L-Bank中的存儲單元的容量總合。計算有多少個存儲單元和計算表格中的單元數量的方法一樣:
存儲單元數量=行數×列數(得到一個L-Bank的存儲單元數量)×L-Bank的數量
SDRAM總存儲容量 = L-Bank的數量×行數×列數×存儲單元的容量
在內存產品Datasheet中,都會用M×W,或者M×word×n-bit的方式來表示芯片的容量。
M是該芯片中存儲單元的總數,單位是兆(英文簡寫M,1048576),W=word×n-bit代表每個存儲單元的容量,也就是SDRAM芯片的位寬(Width),單位是bit。
例如:EM63A165 SDRAM
容量:4×16×4=256Mbit=32MB
在相同的總容量下,芯片位寬可以采用多種不同的設計。
4M word x 16-bit x 4-bank=8M word x 8-bit x 4-bank=16M word x 4-bit x 4-bank
由此可見,在芯片容量相同的情況下,位寬越小,內存容量越大。
4. SDRAM引腳
?
內存芯片要想工作,必須要與內存控制器有所聯系,
同時對于一個電氣元件,電源供應也是必不可少的,VSS和VDD
而且數據的傳輸要有一個時鐘CLK作為觸發參考。
1. 首先,我們知道內存控制器要先確定一個P-Bank的芯片集合,然后才對這集合中的芯片進行尋址操作。因此要有一個片選CS的信號,它一次選擇一個P-Bank的芯片集(根據位寬的不同,數量也不同)。被選中的芯片將同時接收或讀取數據,所以要有一個片選信號。
2. 接下來是對所有被選中的芯片進行統一的L-Bank的尋址,目前SDRAM中L-Bank的數量最高為4個,所以需要兩個L-Bank地址信號BA0和BA1。
3. 最后就是對被選中的芯片進行統一的行/列(存儲單元)尋址。地址線數量要根據芯片的組織結構分別設計了。但在相同容量下,行數不變,只有列數會根據位寬的而變化,位寬越大,列數越少,因為所需的存儲單元減少了。A0-A12
4.找到了存儲單元后,被選中的芯片就要進行統一的數據傳輸,那么肯定要有與位寬相同數量的數據I/O通道才行,所以肯定要有相應數量的數據線引腳。DQ0-DQ15
此外還有CAS(Column Address Strobe,列地址選通脈沖)、RAS(Row Address Strobe,行地址選通脈沖)、DQML\DQMU數據掩碼、WE讀寫信號將在后文中進行說明
?
5. SDRAM基本操作
下圖為SDRAM的功能框圖,SDRAM內部有一個控制信號發生器(CONTROL SIGNAL GENERTOR),一個模式寄存器(MODE REGISTER)等。
SDRAM接收外部輸入的控制命令,進行尋址、讀寫、刷新、預充電等操作。
初始化
如圖,上電后有200us的輸入穩定期,在這個時間內不可以對SDRAM的接口做任何操作;200us結束以后給所有L-Bank預充電Precharge(后面詳細講),設置模式寄存器(Mode Register),接著需要至少兩個刷新才能進行其他操作。
行有效
初始化完成后,要想對一個L-Bank中的陣列進行尋址,首先就要確定行(Row),使之處于活動狀態(Active),然后再確定列。雖然之前要進行片選和L-Bank的定址,但它們與行有效可以同時進行。
同時RAS(Row Address Strobe,行地址選通脈沖)也處于有效狀態。此時An地址線則發送具體的行地址。
?
列讀寫
行地址確定之后,就要對列地址進行尋址了。
在SDRAM中,行地址與列地址線是共用的。地址線仍然是行地址所用的A0-A12(在上面所講的內存芯片中)。
讀/寫的命令是怎么發出的呢?
其實沒有一個信號是發送讀或寫的明確命令的,而是通過芯片的可寫狀態的控制來達到讀/寫的目的。顯然WE#信號就是一個關鍵。WE#無效時,當然就是讀取命令。
?SDRAM基本操作命令,如上圖, 通過各種控制/地址信號的組合來完成(H代表高電平,L代表低電平,X表示高低電平均沒有影響)。
列尋址信號與讀寫命令是同時發出的。雖然地址線與行尋址共用,但CAS(Column Address Strobe,列地址選通脈沖)信號則可以區分開行與列尋址的不同,配合A0-A9,A11(本例)來確定具體的列地址。
在發送列讀寫命令時必須要與行有效命令有一個間隔,這個間隔被定義為tRCD,即RAS to CAS Delay(RAS至CAS延遲),大家也可以理解為行選通周期,這應該是根據芯片存儲陣列電子元件響應時間(從一種狀態到另一種狀態變化的過程)所制定的延遲。
?
數據輸出(讀)
在選定列地址后,就已經確定了具體的存儲單元,剩下的事情就是數據通過數據I/O通道(DQ)輸出到內存總線上了。
但是在CAS發出之后,仍要經過一定的時間才能有數據輸出,從CAS與讀取命令發出到第一筆數據輸出的這段時間,被定義為CL(CAS Latency,CAS潛伏期)。由于CL只在讀取時出現,所以CL又被稱為讀取潛伏期(RL,Read Latency)。CL的單位與tRCD一樣,為時鐘周期數,具體耗時由時鐘頻率決定。
數據輸入(寫)
數據寫入的操作也是在tRCD之后進行,但此時沒有了CL(記住,CL只出現在讀取操作中),行尋址與列尋址的時序圖和上文一樣,只是在列尋址時,WE#為有效狀態。
由于數據信號由控制端發出,輸入時芯片無需做任何調校,只需直接傳到數據輸入寄存器中,然后再由寫入驅動器進行對存儲電容的充電操作,因此數據可以與CAS同時發送,也就是說寫入延遲為0。不過,數據并不是即時地寫入存儲電容,因為選通三極管(就如讀取時一樣)與電容的充電必須要有一段時間,所以數據的真正寫入需要一定的周期。為了保證數據的可靠寫入,都會留出足夠的寫入/校正時間(tWR,Write Recovery Time),這個操作也被稱作寫回(Write Back)。tWR至少占用一個時鐘周期或再多一點(時鐘頻率越高,tWR占用周期越多)
預充電(Precharge)
在進行完讀寫操作后,如果要對同一L-Bank的另一行進行尋址,就要將原來有效(工作)的行關閉,重新發送行/列地址。
L-Bank關閉現有工作行,準備打開新行的操作就是預充電(Precharge)。
預充電可以通過命令控制,也可以通過輔助設定讓芯片在每次讀寫操作之后自動進行預充電。
實際上,預充電是一種對工作行中所有存儲體進行數據重寫,并對行地址進行復位,同時釋放S-AMP(重新加入比較電壓,一般是電容電壓的1/2,以幫助判斷讀取數據的邏輯電平,因為S-AMP是通過一個參考電壓與存儲體位線電壓的比較來判斷邏輯值的),以準備新行的工作。
具體而言,就是將S-AMP中的數據回寫,即使是沒有工作過的存儲體也會因行選通而使存儲電容受到干擾,所以也需要S-AMP進行讀后重寫。
此時,電容的電量(或者說其產生的電壓)將是判斷邏輯狀態的依據(讀取時也需要),為此要設定一個臨界值,一般為電容電量的1/2,超過它的為邏輯1,進行重寫,否則為邏輯0,不進行重寫(等于放電)。為此,現在基本都將電容的另一端接入一個指定的電壓(即1/2電容電壓),而不是接地,以幫助重寫時的比較與判斷。
刷新
我們之所以叫DRAM,就是因為它是動態的,就是每隔一段時間進行一次刷新,確保那些沒有被讀寫過的數據不會以為時間長導致電容漏電,從而導致數據丟失。
刷新操作與預充電中重寫的操作一樣,都是用S-AMP先讀再寫。但為什么有預充電操作還要進行刷新呢?因為預充電是對一個或所有L-Bank中的工作行操作,并且是不定期的,而刷新則是有固定的周期,依次對所有行進行操作,以保留那些久久沒經歷重寫的存儲體中的數據。但與所有L-Bank預充電不同的是,這里的行是指所有L-Bank中地址相同的行,而預充電中各L-Bank中的工作行地址并不是一定是相同的。
那么要隔多長時間重復一次刷新呢?目前公認的標準是,存儲體中電容的數據有效保存期上限是64ms(毫秒,1/1000秒)。這樣刷新速度就是:行數量/64ms。我們在看內存規格時,經常會看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的標識,這里的4096與8192就代表這個芯片中每個L-Bank的行數。刷新命令一次對一行有效,發送間隔也是隨總行數而變化,4096行時為15.625μs(微秒,1/1000毫秒),8192行時就為7.8125μs。
刷新操作分為兩種:自動刷新(Auto Refresh,簡稱AR)與自刷新(Self Refresh,簡稱SR)。不論是何種刷新方式,都不需要外部提供行地址信息,因為這是一個內部的自動操作。
對于AR, SDRAM內部有一個行地址生成器(也稱刷新計數器)用來自動的依次生成行地址。由于刷新是針對一行中的所有存儲體進行,所以無需列尋址,或者說CAS在RAS之前有效。所以,AR又稱CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新過程中,所有L-Bank都停止工作,而每次刷新所占用的時間為9個時鐘周期(PC133標準),之后就可進入正常的工作狀態,也就是說在這9 個時鐘期間內,所有工作指令只能等待而無法執行。64ms之后則再次對同一行進行刷新,如此周而復始進行循環刷新。顯然,刷新操作肯定會對SDRAM的性能造成影響,但這是沒辦法的事情,也是DRAM相對于SRAM(靜態內存,無需刷新仍能保留數據)取得成本優勢的同時所付出的代價。
SR則主要用于休眠模式低功耗狀態下的數據保存,這方面最著名的應用就是STR(Suspend to RAM,休眠掛起于內存)。在發出AR命令時,將CKE置于無效狀態,就進入了SR模式,此時不再依靠系統時鐘工作,而是根據內部的時鐘進行刷新操作。在SR期間除了CKE之外的所有外部信號都是無效的(無需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并進入正常操作狀態。
操作模式?
突發(Burst):是指在同一行中相鄰的存儲單元連續進行數據傳輸的方式,連續傳輸所涉及到存儲單元(列)的數量就是突發長度(Burst Lengths,簡稱BL)。
讀/寫操作,都是一次對一個存儲單元進行尋址,如果要連續讀/寫就還要對當前存儲單元的下一個單元進行尋址,也就是要不斷的發送列地址與讀/寫命令(行地址不變,所以不用再對行尋址)。
雖然由于讀/寫延遲相同可以讓數據的傳輸在I/O端是連續的,但它占用了大量的內存控制資源,在數據進行連續傳輸時無法輸入新的命令,效率很低(早期的FPE/EDO內存就是以這種方式進行連續的數據傳輸)。
為此,人們開發了突發傳輸技術,只要指定起始列地址與突發長度,內存就會依次地自動對后面相應數量的存儲單元進行讀/寫操作而不再需要控制器連續地提供列地址。這樣,除了第一筆數據的傳輸需要若干個周期(主要是之前的延遲,一般的是tRCD+CL)外,其后每個數據只需一個周期的即可獲得。
非突發連續讀取模式:不采用突發傳輸而是依次單獨尋址,此時可等效于BL=1。雖然可以讓數據是連續的傳輸,但每次都要發送列地址與命令信息,控制資源占用極大
突發連續讀取模式:只要指定起始列地址與突發長度,尋址與數據的讀取自動進行,而只要控制好兩段突發讀取命令的間隔周期(與BL相同)即可做到連續的突發傳輸。至于BL的數值,也是不能隨便設或在數據進行傳輸前臨時決定。在上文講到的初始化過程中的MRS階段就要對BL進行設置。目前可用的選項是1、2、4、8、全頁(Full Page),全頁就是將這一行上的數據一連串的全部讀出或寫入,常見的設定是4和8。
在MRS階段除了要設定BL數值之外,還要具體確定讀/寫操作的模式以及突發傳輸的模式。
突發讀/突發寫,表示讀與寫操作都是突發傳輸的,每次讀/寫操作持續BL所設定的長度,這也是常規的設定。
突發讀/單一寫,表示讀操作是突發傳輸,寫操作則只是一個個單獨進行。
突發傳輸模式代表著突發周期內所涉及到的存儲單元的傳輸順序。順序傳輸是指從起始單元開始順序讀取。假如BL=4,起始單元編號是n,順序就是n、n+1、n+2、n+3。交錯傳輸就是打亂正常的順序進行數據傳輸(比如第一個進行傳輸的單元是n,而第二個進行傳輸的單元是n+2而不是n+1),至于交錯的規則在SDRAM規范中有詳細的定義表,但在這此出于必要性與篇幅的考慮就不列出了。
數據掩碼
在講述讀/寫操作時,我們談到了突發長度。如果BL=4,那么也就是說一次就傳送4x64bit的數據。
但如果其中的第二筆數據是不需要的,怎么辦?
為了屏蔽不需要的數據,人們采用了數據掩碼(Data I/O Mask,簡稱DQM)技術。通過DQM,內存可以控制I/O端口取消哪些輸出或輸入的數據。這里需要強調的是,在讀取時,被屏蔽的數據仍然會從存儲體傳出,只是在“掩碼邏輯單元”處被屏蔽。
SDRAM官方規定,在讀取時DQM發出兩個時鐘周期后生效,而在寫入時,DQM與寫入命令一樣是立即成效。
以上便是SDRAM的原理,很多細節還需要自己查看Datasheet,我將在之后的文章中詳解如何編寫SDRAM驅動程序。
?
總結
以上是生活随笔為你收集整理的详解内存SDRAM原理(P-Bank、L-Bank、刷新、预充电等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用这个方法解决Mac OS安装软件“软件
- 下一篇: 作曲大师_作曲的力量