本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請注明出處!
SDRAM即同步動態(tài)隨機存儲單元,主要用來存儲較大容量的數(shù)據(jù)。我們都知道,數(shù)據(jù)在處理的過程中一般都需要進行存儲,開發(fā)板上常見的存儲方式有FPGA內(nèi)部芯片RAM資源、外部Flash存儲器和外部SDRAM存儲器。除了Flash,其他兩種存儲器都是掉電即丟失數(shù)據(jù),由于Flash掉電能夠保持內(nèi)部數(shù)據(jù),因此Flash主要用來固化程序或者固化參數(shù)。FPGA片內(nèi)的RAM資源稀少而且珍貴,在大容量存儲場合如圖像數(shù)據(jù)緩存時,只能選擇外部存儲如SDRAM、DDR3等存儲器。在MP801開發(fā)板上就含有三塊SDRAM芯片,可以滿足較大數(shù)據(jù)的高速讀取。作為新手進階過程中所面對的一個較復雜的接口,很多人對SDRAM的工作方式及接口時序不是很清楚。經(jīng)過查閱數(shù)據(jù)手冊與搜集相關(guān)的技術(shù)文檔,我整理了一篇有關(guān)SDRAM接口讀寫時序的文章,希望能夠幫助不了解的同學對SDRAM數(shù)據(jù)讀寫有更進一步的認識。
一、SDRAM初始化
在SDRAM內(nèi)部有一個邏輯控制單元,并且有一個模式寄存器為其提供控制參數(shù)。每次開機時SDRAM都要先對這個控制邏輯核心進行初始化,關(guān)鍵階段就在于模式寄存器(MR, Mode Register)的設(shè)置,簡稱MRS(MR Set)。
SDRAM必須以預定義的方式啟動和初始化。在電源同時作用于Vdd和Vddq后開始初始化SDRAM,此時的時鐘穩(wěn)定并且將DQM和CKE信號拉高。在向SDRAM發(fā)命令之前需要有100us的延時,此時SDRAM不執(zhí)行任何操作。在100us延時滿足后,需要對Bank進行預充電,在此期間所有的Bank處于空閑狀態(tài)。預充電之后會有至少兩個自刷新,完成自刷新便可以對SDRAM進行模式寄存器配置。
圖1 SDRAM初始化時序
SDRAM模式寄存器所控制的操作參數(shù):地址線提供不同的0/1信號來獲得不同的參數(shù)。在設(shè)置到MR之后,就開始了進入正常的工作狀態(tài)。
二、行激活
初始化完成后,在向SDRAM發(fā)送讀或?qū)懨钪氨仨毚蜷_該Bank中的一行,通過ACTIVE命令來確定要激活的Bank和行。要想對一個L-Bank中的陣列進行尋址,首先要確定行(Row),然后確定列。片選信號與L-Bank選擇信號與行有效同時進行。
圖2 行有效時序
從上圖中可以看出,在片選信號、Bank地址選定的同時,RAS(Row Address Strobe,行地址選通脈沖)也處于有效狀態(tài),此時An地址線發(fā)送具體的行地址。行地址位寬為12,共可以指示2^12=4096個具體的行地址。當行地址被激活后,相應的Bank也被激活,因此行激活又叫L-Bank激活。
三、列讀寫
行地址確定以后,就要對列地址進行尋址了。地址線仍使用A0-A11,即行地址與列地址共用地址線。當列地址選通后,就需要對SDRAM進行讀寫,而給SDRAM讀命令還是寫這就由WE#信號來決定。當WE#信號拉低時,SDRAM接收到的是寫命令;當WE#拉高,SDRAM接收讀命令。列尋址信號與讀寫命令是同時發(fā)出的。雖然地址線與行尋址共用,但CAS(Column Address Strobe,列地址選通脈沖)信號則可以區(qū)分開行與列尋址的不同,配合A0-A9,A11來確定具體的定址。
在發(fā)送列讀寫命令時必須要與行有效命令有一個時間間隔,這個時間間隔被定義為tRCD,即RAS to CAS Delay(RAS至CAS延遲)。比如tRCD=3,就代表延遲周期為3個時鐘周期,即在行有效命令發(fā)出后,經(jīng)過3個時鐘周期的延時,才能發(fā)送列讀寫命令,SDRAM進入數(shù)據(jù)讀寫操作。
圖3 tRCD=3的列讀寫時序圖
四、讀操作
讀命令從輸入信號BA0、BA1中選取要進行讀數(shù)據(jù)操作的BANK,并在已激活的行中進行突發(fā)讀操作。輸入的A0-A7用來進行列尋址。在選定列地址后,就已經(jīng)確定了具體的存儲單元,剩下的事情就是數(shù)據(jù)通過數(shù)據(jù)I/O通道(DQ)輸出到內(nèi)存總線上了。但是在CAS (列地址選通脈沖)發(fā)出之后,仍要經(jīng)過一定的時間才能有數(shù)據(jù)輸出,從CAS與讀取命令發(fā)出到第一個數(shù)據(jù)輸出的這段時間,被定義為CL(CAS Latency,CAS潛伏期)。由于CL只在讀取時出現(xiàn),所以CL又被稱為讀取潛伏期(RL,ReadLatency)。CL的單位與tRCD一樣,為時鐘周期數(shù),具體耗時由時鐘頻率決定。CAS并不是在經(jīng)過CL 周期之后才送達存儲單元。實際上CAS與RAS一樣是瞬間到達的,但CAS的響應時間要更快一些。下圖展示了CAS=3時的讀時序:
圖4 CAS Latency=3的示意圖
由于存儲體中晶體管存在反應時間,從而造成數(shù)據(jù)不可能與CAS在同一上升沿觸發(fā),因此要延后至少一個時鐘周期??紤]到芯片體積較小的因素,存儲單元中的電容容量很小,所以信號要經(jīng)過放大來保證其有效的識別性,這個放大/驅(qū)動工作由S-AMP負責,一個存儲體對應一個S-AMP通道。但它要有一個準備時間才能保證信號的發(fā)送強度(事前還要進行電壓比較以進行邏輯電平的判斷),因此從數(shù)據(jù)I/O總線上有數(shù)據(jù)輸出之前的一個時鐘上升沿開始,數(shù)據(jù)即已傳向S-AMP,也就是說此時數(shù)據(jù)已經(jīng)被觸發(fā),經(jīng)過一定的驅(qū)動時間最終傳向數(shù)據(jù)I/O 總線進行輸出,這段時間我們稱之為tAC(Access-Time-from-CLK,時鐘觸發(fā)后的訪問時間),單位是ns。在突發(fā)讀操作完成后,如果選擇了自動預充電模式,那么該行就會直接進入充電。如果沒有選擇此模式,那么該行將保持打開狀態(tài),供后續(xù)訪問。自動預充電模式的選擇與A10的值有關(guān),A10為高時為自動預充電命令模式。
五、寫操作
數(shù)據(jù)寫入的操作也是在tRCD之后進行,但此時沒有CL(CL只出現(xiàn)在讀取操作中),行尋址與列尋址的時序一樣致,只是在列尋址時,WE#為有效狀態(tài)。由于數(shù)據(jù)信號由控制端發(fā)出,輸入時芯片無需做任何調(diào)校,只需直接傳到數(shù)據(jù)輸入寄存器中,然后再由寫入驅(qū)動器進行對存儲電容的充電操作,因此數(shù)據(jù)可以與CAS同時發(fā)送,也就是說寫入延遲為0。不過,數(shù)據(jù)并不是即時地寫入存儲電容,因為選通三極管(就如讀取時一樣)與電容的充電必須要有一段時間,所以數(shù)據(jù)的真正寫入需要一定的周期。
六、突發(fā)讀寫
突發(fā)(Burst)是指在同一行中相鄰的存儲單元連續(xù)進行數(shù)據(jù)傳輸?shù)姆绞剑B續(xù)傳輸所涉及到存儲單元(列)的數(shù)量就是突發(fā)長度(Burst Lengths,簡稱BL)。前文講到的讀/寫操作,都是一次對一個存儲單元進行尋址,如果要想要連續(xù)的向SDRAM中讀數(shù)據(jù)或者寫數(shù)據(jù),就需要對當前存儲單元的下一個單元進行尋址,也即是需要不停給SDRAM列激活信號以及讀/寫命令(行地址不變,所以不用再對行尋址)。雖然由于讀/寫延遲相同可以讓數(shù)據(jù)的傳輸在I/O端是連續(xù)的,但它占用了大量的內(nèi)存控制資源,在數(shù)據(jù)進行連續(xù)傳輸時無法輸入新的命令,效率很低。為此,人們開發(fā)了突發(fā)傳輸技術(shù),只要指定起始列地址與突發(fā)長度,SDRAM就會不再需要控制器連續(xù)地提供列地址,依次地自動對后面相應數(shù)量的存儲單元進行讀/寫操作。這樣,在突發(fā)模式讀寫中,除了第一個數(shù)據(jù)的傳輸需要若干個周期(主要是之前的延遲,一般的是tRCD+CL),其后每個數(shù)據(jù)只需一個周期的即可獲得。至于突發(fā)長度BL的數(shù)值,也是不能隨便設(shè)或在數(shù)據(jù)進行傳輸前臨時決定,而是在上文講到的SDRAM初始化過程中模式寄存器配置階段就要對突發(fā)長度進行設(shè)置。目前可用的選項是1、2、4、8、全頁(FullPage),常見的突發(fā)長度設(shè)定是BL=4、BL=8或者全頁突發(fā)模式。
圖5 突發(fā)讀時序圖
七、預充電
在進行完讀或?qū)懖僮骱螅酉聛砣绻獙ν粋€L-Bank的另一行進行尋址,就要將原來有效的行關(guān)閉,重新發(fā)送行/列地址,這是由于SDRAM的尋址具有獨占性造成的。L-Bank關(guān)閉現(xiàn)有工作行,準備打開新行的操作就是預充電(Precharge)。實際上,預充電就是一種對工作行中所有存儲體進行數(shù)據(jù)重寫,并對行地址進行復位的操作。
地址線A10控制著是否進行在讀或?qū)懖僮?/span>之后當前L-Bank自動進行預充電。在單獨的預充電命令中,A10控制著是對指定的L-Bank還是所有的L-Bank(當有多個L-Bank處于有效/活動狀態(tài)時)進行預充電,前者需要提供L-Bank的地址,后者只需將A10信號置于高電平。在發(fā)出預充電命令之后,要經(jīng)過一段時間才能允許發(fā)送RAS行有效命令打開新的工作行,這個間隔被稱為tRP(Precharge command Period,預充電有效周期),單位是時鐘周期數(shù),具體值視時鐘頻率而定。在實際的設(shè)計中,我們通常設(shè)計讓芯片每次讀寫操作后,自動進行預充電。這樣設(shè)計時就不需要再單獨考慮預充電的影響,只需要等待幾個時間周期即可。
圖6 讀數(shù)據(jù)預充電時序
上圖是突發(fā)長度設(shè)置為4、列選通潛伏期設(shè)置為2時,設(shè)置單獨預充電命令下的時序圖。可以看出,當行激活后,需要兩個時鐘周期的等待時間(tRCD)接收讀命令,SDRAM在接收讀命令時A10拉低,即此時不允許預充電,在SDRAM接收到預充電命令的時候才會進入預充電狀態(tài)。當接收到讀命令后,經(jīng)過兩個周期的列地址選通(CAS)潛伏期從DQ數(shù)據(jù)線連續(xù)讀出4個數(shù)據(jù)。在預充電命令下,地址線A10拉高,SDRAM中所有L-Bank進入預充電狀態(tài),從接收到行激活命令到接收預充電命令之間的時間間隔就是列選通脈沖拉高的周期數(shù),從接收一個行激活命令到接收下一個行激活命令之間的間隔叫做tRC。