SDRAM是做嵌入式系統(tǒng)中,常用是的緩存數(shù)據(jù)的器件?;靖拍钊缦拢ㄗ⒁鈪^(qū)分幾個(gè)主要常見(jiàn)存儲(chǔ)器之間的差異):
SDRAM(Synchronous Dynamic Random Access Memory),同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器。同步是指 Memory工作需要同步時(shí)鐘,內(nèi)部的命令的發(fā)送與數(shù)據(jù)的傳輸都以它為基準(zhǔn);動(dòng)態(tài)是指存儲(chǔ)陣列需要不斷的刷新來(lái)保證存儲(chǔ)的數(shù)據(jù)不丟失,因?yàn)镾DRAM中存儲(chǔ)數(shù)據(jù)是通過(guò)電容來(lái)工作的,大家知道電容在自然放置狀態(tài)是會(huì)有放電的,如果電放完了,也就意味著SDRAM中的數(shù)據(jù)丟失了,所以SDRAM需要在電容的電量放完之前進(jìn)行刷新;隨機(jī)是指數(shù)據(jù)不是線性依次存儲(chǔ),而是自由指定地址進(jìn)行數(shù)據(jù)的讀寫(xiě)。
1. 注意事項(xiàng)
以下是我在學(xué)習(xí)過(guò)程中總結(jié)的一些容易理解錯(cuò)誤的細(xì)節(jié),如果對(duì)其中有些概念不太明確,建議先學(xué)習(xí)基本概念。
1.1 突發(fā)長(zhǎng)度(Burst Length)
突發(fā)傳輸是指:在行地址指定后,只要指定起始列地址與突發(fā)長(zhǎng)度,內(nèi)存就會(huì)依次地自動(dòng)對(duì)后面相應(yīng)數(shù)量的存儲(chǔ)單元進(jìn)行讀/寫(xiě)操作而不再需要控制器連續(xù)地提供列地址。
對(duì)SDRAM器件的讀和寫(xiě)是面向突發(fā)的,而突發(fā)長(zhǎng)度(BL)則是可編程的。
突發(fā)長(zhǎng)度決定了給定讀寫(xiě)命令可以訪問(wèn)的最大的列位置的個(gè)數(shù)。
不管是順序(Sequential)還是交叉(Interleaved)突發(fā)類(lèi)型,其突發(fā)長(zhǎng)度均可為1,2,4,8或連續(xù)。對(duì)于順序突發(fā)類(lèi)型,還適用于連續(xù)的頁(yè)面突發(fā)。
連續(xù)頁(yè)面突發(fā)與BURST TERMINATE命令一起使用以產(chǎn)生任意突發(fā)長(zhǎng)度。
保留狀態(tài)不應(yīng)使用,因?yàn)檫@會(huì)導(dǎo)致未知操作或與未來(lái)的版本不匹配。
當(dāng)讀或?qū)懨钐峤粫r(shí),一個(gè)等于突發(fā)長(zhǎng)度的列的塊被有效選擇。所有對(duì)該突發(fā)的訪問(wèn)發(fā)生在本塊之內(nèi),意味著當(dāng)遇到邊界時(shí),突發(fā)會(huì)在該塊之內(nèi)循環(huán)(wraps within the block)。當(dāng)BL=2時(shí),該塊唯一地被A[8:1]所選擇,當(dāng)BL=4時(shí),A[8:2],BL=8時(shí),A[8:3]。其余的地址位被用于選擇塊內(nèi)的起始地址。
1.2 自動(dòng)刷新AS(Auto Refresh)和自刷新SR(Self Refresh)
刷新操作分為兩種:自動(dòng)刷新(Auto Refresh,簡(jiǎn)稱(chēng)AR)與自刷新(Self Refresh,簡(jiǎn)稱(chēng)SR)。不論是何種刷新方式,都不需要外部提供行地址信息,因?yàn)檫@是一個(gè)內(nèi)部的自動(dòng)操作。
對(duì)于AR, SDRAM內(nèi)部有一個(gè)行地址生成器(也稱(chēng)刷新計(jì)數(shù)器)用來(lái)自動(dòng)的依次生成行地址。由于刷新是針對(duì)一行中的所有存儲(chǔ)體進(jìn)行,所以無(wú)需列尋址,或者說(shuō)CAS在RAS之前有效。所以,AR又稱(chēng)CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新過(guò)程中,所有L-Bank都停止工作,而每次刷新所占用的時(shí)間為9個(gè)時(shí)鐘周期(PC133標(biāo)準(zhǔn)),之后就可進(jìn)入正常的工作狀態(tài),也就是說(shuō)在這9 個(gè)時(shí)鐘期間內(nèi),所有工作指令只能等待而無(wú)法執(zhí)行。64ms之后則再次對(duì)同一行進(jìn)行刷新,如此周而復(fù)始進(jìn)行循環(huán)刷新。顯然,刷新操作肯定會(huì)對(duì)SDRAM的性能造成影響,但這是沒(méi)辦法的事情,也是DRAM相對(duì)于SRAM(靜態(tài)內(nèi)存,無(wú)需刷新仍能保留數(shù)據(jù))取得成本優(yōu)勢(shì)的同時(shí)所付出的代價(jià)。
SR則主要用于休眠模式低功耗狀態(tài)下的數(shù)據(jù)保存,這方面最著名的應(yīng)用就是STR(Suspend to RAM,休眠掛起于內(nèi)存)。在發(fā)出AR命令時(shí),將CKE置于無(wú)效狀態(tài),就進(jìn)入了SR模式,此時(shí)不再依靠系統(tǒng)時(shí)鐘工作,而是根據(jù)內(nèi)部的時(shí)鐘進(jìn)行刷新操作。在SR期間除了CKE之外的所有外部信號(hào)都是無(wú)效的(無(wú)需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并進(jìn)入正常操作狀態(tài)。
2. 操作說(shuō)明
我們以SDRAM芯片IS42S16320D為例,盡可能詳細(xì)的說(shuō)明一下對(duì)其實(shí)現(xiàn)操作的方法。相關(guān)的Verilog代碼在后面給出。
2.1 時(shí)序
時(shí)序圖如下圖所示,在操作過(guò)程中,每個(gè)命令的執(zhí)行或者數(shù)據(jù)的讀寫(xiě),都要滿(mǎn)足相應(yīng)的時(shí)序要求,一定要仔細(xì)。
為滿(mǎn)足命令鎖存所需的建立時(shí)間tCMS和保持時(shí)間tCMH,需要對(duì)SD_clk采用與clk反向或者分頻機(jī)制。
系統(tǒng)時(shí)鐘clk為100MHz
2.2 刷新時(shí)間
SDRAM內(nèi)部電容保存數(shù)據(jù)的最長(zhǎng)時(shí)間是64ms,而我們一個(gè)BANK有8K行,64ms/8k~=7.8us,也就是說(shuō)為了保證SDRAM內(nèi)部的數(shù)據(jù)不被丟失,兩次刷新之間的最大時(shí)間間隔為7.8us,所以為了能讓SDRAM有更多的時(shí)間進(jìn)行讀或者寫(xiě),并且留夠余量,我們就設(shè)定SDRAM刷新的周期為7.7us。
從時(shí)序上看,在讀寫(xiě)過(guò)程中如果需要刷新,則先進(jìn)入PRECHARGE然后進(jìn)入IDLE,再進(jìn)行刷新。
因此我們要保證的是 刷新時(shí)間+需要等待的時(shí)間<=7.8us.
如果是讀,則需要等待的時(shí)鐘周期為 激活時(shí)間(tRCD)+ CAS Latency (tCL)+ 讀一頁(yè)的時(shí)間 +預(yù)充電的時(shí)間(tRP)
如果是寫(xiě),則需要等待的時(shí)鐘周期為 激活時(shí)間(tRCD)+ 寫(xiě)一頁(yè)的時(shí)間 + 預(yù)充電的時(shí)間(tRP)
在實(shí)現(xiàn)上,可以采用定時(shí)和手動(dòng)控制刷新兩種方式結(jié)合。7.7us的定時(shí)計(jì)數(shù)器不斷地進(jìn)行,如果沒(méi)計(jì)時(shí)到7.7us,有收到刷新請(qǐng)求信號(hào),那么開(kāi)始刷新,并且計(jì)數(shù)器重新計(jì)數(shù)。這樣就可以實(shí)現(xiàn),每讀/寫(xiě)一次(讀寫(xiě)完整時(shí)間應(yīng)該滿(mǎn)足上述要求),手動(dòng)刷新。如果長(zhǎng)期等待,則靠計(jì)數(shù)器定時(shí)刷新。
2.3 頁(yè)操作(full page)
一般而言,要實(shí)現(xiàn)快速大數(shù)據(jù)的讀寫(xiě),可以采用頁(yè)操作,即突發(fā)長(zhǎng)度設(shè)計(jì)為full page。
SDRAM在頁(yè)操作模式下必須使用突發(fā)停止命令停止其操作。這回要發(fā)揮頁(yè)模式的靈活性和高效性,那么就要做成一個(gè)由外部輸入數(shù)據(jù)控制其一次性操作的字節(jié)數(shù),也就是說(shuō),外部在讀寫(xiě)數(shù)據(jù)前事先控制一個(gè)寄存器,往寄存器寫(xiě)入需要操作的字節(jié)數(shù),而進(jìn)入讀寫(xiě)操作后,SDRAM控制器根據(jù)外部給出的字節(jié)數(shù)在適當(dāng)?shù)臅r(shí)候發(fā)出突發(fā)停止命令,這樣做到了SDRAM的讀寫(xiě)操作的字節(jié)可以在1-256范圍內(nèi)靈活調(diào)整,增強(qiáng)了通用性。
2.4 狀態(tài)機(jī)
IS42S16320D手冊(cè)里面給出的狀態(tài)圖,仔細(xì)理解每個(gè)狀態(tài)的流程及跳變條件。
3. 詳細(xì)操作
IS42S16320D的操作主要包括上電初始化、空閑、讀、寫(xiě)、刷新等狀態(tài)。
3.1 初始化
芯片在上電之后有一些固定的操作,手冊(cè)里面已經(jīng)明確的說(shuō)明,如下圖。
主要包括以下幾個(gè)步驟的操作,圖表里面代表操作引腳的狀態(tài)。
上電延遲
上電后,芯片有個(gè)100us的延遲(其他RAM一說(shuō)200us),期間命令指令設(shè)置為NOP或者COMMAND INHIBIT。CKE的狀態(tài)呢(不管還是一直為高),貌似一直為高才行,因?yàn)槊钜蕾?lài)于clk的上升沿,而要使clk有效,必須置高CKE?
預(yù)充電
電延遲以后,對(duì)所有bank進(jìn)行預(yù)充電。Bank關(guān)閉現(xiàn)有工作行,準(zhǔn)備打開(kāi)新行的操作就是預(yù)充電(Precharge)。
自動(dòng)刷新
充電完成后,間隔tRP Command Period (PRE to ACT) 最小15ns,進(jìn)行第一次自動(dòng)刷新,再過(guò)tRC Command Period (REF to REF / ACT to ACT) 最小60ns,進(jìn)行第二次自動(dòng)刷新。
模式寄存器配置
第二次自動(dòng)刷新后,間隔tRC(60ns)再進(jìn)行模式寄存器設(shè)置。注意,具體的模式依賴(lài)于A9-A0管腳的高低電平。具體參加下圖。
初始化完成
模式寄存器設(shè)置完成后,間隔tMRD Mode Register Program Time 14ns后,就可以給ACTIVE命令,即使行地址處于工作狀態(tài)。
如下圖所示,為功能仿真完成上電初始化過(guò)程。
3.2 行激活
IDLE狀態(tài)進(jìn)入讀寫(xiě)前,一定要行激活ROW ACTIVE。行激活命令完成之后,需要經(jīng)過(guò)tRCD Active Command To Read / Write Command Delay Time 15 ns才能進(jìn)行讀或?qū)憽M籦ank,不同row,激活需要間隔至少6個(gè)周期;不同bank,不同row,激活需要間隔至少2個(gè)周期,可以提高速度。
3.3 寫(xiě)數(shù)據(jù)
寫(xiě)入的第一個(gè)數(shù)據(jù)與WRITE命令對(duì)齊,寫(xiě)完burs length的長(zhǎng)度之后,輸入自動(dòng)變?yōu)楦咦?,不再接收?shù)據(jù)。如果全頁(yè)寫(xiě)入的話(huà),如果不給burst terminate,會(huì)從頭開(kāi)始覆蓋著寫(xiě)入。
如果采用全頁(yè)寫(xiě)入的方式,當(dāng)需要PRECHARGE的時(shí)候,需要預(yù)留tDPL的時(shí)間(14 ns,與最后一個(gè)數(shù)據(jù)的上升沿對(duì)齊),寫(xiě)入過(guò)程即被中斷,然后在第一定時(shí)間(tRP)之后開(kāi)始刷新。一般來(lái)說(shuō),write被中斷時(shí),可以拉高DQM以阻斷數(shù)據(jù)的輸入。采用PRECHARGE中斷寫(xiě)操作的缺點(diǎn)是需要考慮合適的時(shí)間點(diǎn)去配置cmd和address。優(yōu)點(diǎn)是它可以任何時(shí)候去中斷寫(xiě)操作,不論是固定長(zhǎng)度的寫(xiě)操作還是全頁(yè)寫(xiě)操作。
注意:在讀或?qū)懙拿钪校珹10控制是否自動(dòng)預(yù)充電。
3.4 讀數(shù)據(jù)
在連續(xù)讀的時(shí)候,如果新的命令加入(寫(xiě)、讀、預(yù)充電),發(fā)出時(shí)刻x必須滿(mǎn)足最后一個(gè)期望讀出的數(shù)據(jù)到來(lái)前的CAS Latency-1個(gè)周期。
在讀轉(zhuǎn)寫(xiě)的過(guò)程中,寫(xiě)命令發(fā)出時(shí)刻應(yīng)在最后一個(gè)讀出數(shù)據(jù)所在時(shí)刻。但是,在實(shí)際系統(tǒng)中,為了避免I/O切換輸入輸出狀態(tài)時(shí),出現(xiàn)沖突,所以寫(xiě)指令會(huì)延后一個(gè)周期。In a given system design, there may be a possibility that the device driving the input data will go Low-Z before the SDRAM DQs go High-Z. In this case, at least a single-cycle delay should occur between the last read data and the WRITE command.
控制DMQ來(lái)避免I/O沖突,在WRITE命令來(lái)之前三個(gè)周期就要把DMQ拉高。注意DMQ并不會(huì)直接抑制輸出,只是抑制內(nèi)部的buffer,所以當(dāng)DMQ拉高時(shí),實(shí)際上抑制之前buffer的數(shù)據(jù)還是照樣輸出。在WRITE命令來(lái)之前,必須把DMQ再拉低,否則輸入無(wú)效。(For example, if DQM was LOW during T4 in Figure RW2, then the WRITEs at T5 and T7 would be valid, while the WRITE at T6 would be invalid.???)
4. 疑問(wèn)
周期性刷新的執(zhí)行過(guò)程采用的是:每次在同一bank和同一row中讀寫(xiě)完成后先預(yù)充電,再刷新2次??刹豢梢灾凰⑿拢挥妙A(yù)充電???
狀態(tài)機(jī)上,CBR明明自動(dòng)進(jìn)入PRECHARGE,這怎么解釋。
-
FPGA
+關(guān)注
關(guān)注
1625文章
21618瀏覽量
601134 -
SDRAM
+關(guān)注
關(guān)注
7文章
422瀏覽量
55129 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7425瀏覽量
163502 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3550瀏覽量
129087
原文標(biāo)題:FPGA實(shí)戰(zhàn)操作(1) -- SDRAM(操作說(shuō)明)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論