FPGA實戰操作(1) -- SDRAM(操作說明)


SDRAM是做嵌入式系統中,常用是的緩存數據的器件。基本概念如下(注意區分幾個主要常見存儲器之間的差異):

SDRAM(Synchronous Dynamic Random Access Memory),同步動態隨機存儲器。同步
是指 Memory工作需要同步時鍾,內部的命令的發送與數據的傳輸都以它為基准;動態是指存儲陣
列需要不斷的刷新來保證存儲的數據不丟失,因為SDRAM中存儲數據是通過電容來工作的,大家知道電容在自然放置狀態是會有放電的,如果電放完了,也就意味着SDRAM中的數據丟失了,所以SDRAM需要在電容的電量放完之前進行刷新;隨機是指數據不是線性依次存儲,而是自由指定地址進行數據的讀寫。

1. 注意事項

以下是我在學習過程中總結的一些容易理解錯誤的細節,如果對其中有些概念不太明確,建議先學習基本概念。

1.1 突發長度(Burst Length)

突發傳輸是指:在行地址指定后,只要指定起始列地址與突發長度,內存就會依次地自動對后面相應數量的存儲單元進行讀/寫操作而不再需要控制器連續地提供列地址。

  • 對SDRAM器件的讀和寫是面向突發的,而突發長度(BL)則是可編程的。
  • 突發長度決定了給定讀寫命令可以訪問的最大的列位置的個數。
  • 不管是順序(Sequential)還是交叉(Interleaved)突發類型,其突發長度均可為1,2,4,8或連續。對於順序突發類型,還適用於連續的頁面突發。
  • 連續頁面突發與BURST TERMINATE命令一起使用以產生任意突發長度。
  • 保留狀態不應使用,因為這會導致未知操作或與未來的版本不匹配。
    當讀或寫命令提交時,一個等於突發長度的列的塊被有效選擇。所有對該突發的訪問發生在本塊之內,意味着當遇到邊界時,突發會在該塊之內循環(wraps within the block)。當BL=2時,該塊唯一地被A[8:1]所選擇,當BL=4時,A[8:2],BL=8時,A[8:3]。其余的地址位被用於選擇塊內的起始地址。

1.2 自動刷新AS(Auto Refresh)和自刷新SR(Self Refresh)

刷新操作分為兩種:自動刷新(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有效才能退出自刷新模式並進入正常操作狀態。

2. 操作說明

我們以SDRAM芯片IS42S16320D為例,盡可能詳細的說明一下對其實現操作的方法。相關的Verilog代碼在后面給出。

2.1 時序

時序圖如下圖所示,在操作過程中,每個命令的執行或者數據的讀寫,都要滿足相應的時序要求,一定要仔細

為滿足命令鎖存所需的建立時間tCMS和保持時間tCMH,需要對SD_clk采用與clk反向或者分頻機制。
系統時鍾clk為100MHz

2.2 刷新時間

SDRAM內部電容保存數據的最長時間是64ms,而我們一個BANK有8K行,64ms/8k~=7.8us,也就是說為了保證SDRAM內部的數據不被丟失,兩次刷新之間的最大時間間隔為7.8us,所以為了能讓SDRAM有更多的時間進行讀或者寫,並且留夠余量,我們就設定SDRAM刷新的周期為7.7us。

從時序上看,在讀寫過程中如果需要刷新,則先進入PRECHARGE然后進入IDLE,再進行刷新。

因此我們要保證的是 刷新時間+需要等待的時間<=7.8us.
如果是讀,則需要等待的時鍾周期為 激活時間(tRCD)+ CAS Latency (tCL)+ 讀一頁的時間 +預充電的時間(tRP)
如果是寫,則需要等待的時鍾周期為 激活時間(tRCD)+ 寫一頁的時間 + 預充電的時間(tRP)

在實現上,可以采用定時和手動控制刷新兩種方式結合。7.7us的定時計數器不斷地進行,如果沒計時到7.7us,有收到刷新請求信號,那么開始刷新,並且計數器重新計數。這樣就可以實現,每讀/寫一次(讀寫完整時間應該滿足上述要求),手動刷新。如果長期等待,則靠計數器定時刷新。

2.3 頁操作(full page)

一般而言,要實現快速大數據的讀寫,可以采用頁操作,即突發長度設計為full page。
SDRAM在頁操作模式下必須使用突發停止命令停止其操作。這回要發揮頁模式的靈活性和高效性,那么就要做成一個由外部輸入數據控制其一次性操作的字節數,也就是說,外部在讀寫數據前事先控制一個寄存器,往寄存器寫入需要操作的字節數,而進入讀寫操作后,SDRAM控制器根據外部給出的字節數在適當的時候發出突發停止命令,這樣做到了SDRAM的讀寫操作的字節可以在1-256范圍內靈活調整,增強了通用性。

2.4 狀態機

IS42S16320D手冊里面給出的狀態圖,仔細理解每個狀態的流程及跳變條件。

3. 詳細操作

IS42S16320D的操作主要包括上電初始化、空閑、讀、寫、刷新等狀態。

3.1 初始化

芯片在上電之后有一些固定的操作,手冊里面已經明確的說明,如下圖。

主要包括以下幾個步驟的操作,圖表里面代表操作引腳的狀態。


  • 上電延遲

上電后,芯片有個100us的延遲(其他RAM一說200us),期間命令指令設置為NOP或者COMMAND INHIBIT。CKE的狀態呢(不管還是一直為高),貌似一直為高才行,因為命令依賴於clk的上升沿,而要使clk有效,必須置高CKE?

  • 預充電

電延遲以后,對所有bank進行預充電。Bank關閉現有工作行,准備打開新行的操作就是預充電(Precharge)。

  • 自動刷新

充電完成后,間隔tRP Command Period (PRE to ACT) 最小15ns,進行第一次自動刷新,再過tRC Command Period (REF to REF / ACT to ACT) 最小60ns,進行第二次自動刷新。

  • 模式寄存器配置

第二次自動刷新后,間隔tRC(60ns)再進行模式寄存器設置。注意,具體的模式依賴於A9-A0管腳的高低電平。具體參加下圖。

  • 初始化完成

模式寄存器設置完成后,間隔tMRD Mode Register Program Time 14ns后,就可以給ACTIVE命令,即使行地址處於工作狀態。


如下圖所示,為功能仿真完成上電初始化過程。

3.2 行激活

IDLE狀態進入讀寫前,一定要行激活ROW ACTIVE。行激活命令完成之后,需要經過tRCD Active Command To Read / Write Command Delay Time 15 ns才能進行讀或寫。同一bank,不同row,激活需要間隔至少6個周期;不同bank,不同row,激活需要間隔至少2個周期,可以提高速度。

3.3 寫數據

寫入的第一個數據與WRITE命令對齊,寫完burs length的長度之后,輸入自動變為高阻,不再接收數據。如果全頁寫入的話,如果不給burst terminate,會從頭開始覆蓋着寫入。

如果采用全頁寫入的方式,當需要PRECHARGE的時候,需要預留tDPL的時間(14 ns,與最后一個數據的上升沿對齊),寫入過程即被中斷,然后在第一定時間(tRP)之后開始刷新。一般來說,write被中斷時,可以拉高DQM以阻斷數據的輸入。采用PRECHARGE中斷寫操作的缺點是需要考慮合適的時間點去配置cmd和address。優點是它可以任何時候去中斷寫操作,不論是固定長度的寫操作還是全頁寫操作。

注意:在讀或寫的命令中,A10控制是否自動預充電。

3.4 讀數據

在連續讀的時候,如果新的命令加入(寫、讀、預充電),發出時刻x必須滿足最后一個期望讀出的數據到來前的CAS Latency-1個周期。

在讀轉寫的過程中,寫命令發出時刻應在最后一個讀出數據所在時刻。但是,在實際系統中,為了避免I/O切換輸入輸出狀態時,出現沖突,所以寫指令會延后一個周期。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來避免I/O沖突,在WRITE命令來之前三個周期就要把DMQ拉高。注意DMQ並不會直接抑制輸出,只是抑制內部的buffer,所以當DMQ拉高時,實際上抑制之前buffer的數據還是照樣輸出。在WRITE命令來之前,必須把DMQ再拉低,否則輸入無效。(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. 疑問

  • 周期性刷新的執行過程采用的是:每次在同一bank和同一row中讀寫完成后先預充電,再刷新2次。可不可以只刷新,而不用預充電???
  • 狀態機上,CBR明明自動進入PRECHARGE,這怎么解釋。

下一篇博文主要介紹Verilog實現對SDRAM控制的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM