天天看點

SDRAM的深入了解

我了解事物喜歡從底層根本去了解,而不是你說什麼我照做就行了,我會形成一些探尋究竟的念頭,也會産生很多疑問。

讨論之前當然要先看過某廠的datasheet,我看的是Micron。

按上面說,terminate和precharge都能掐斷burst讀或寫。我也是第一次用Sdram,根據我做的項目資料流特點,我一上來就隻選用了full-page模式。因為full-page讀寫不帶auto-precharge,而且要使用者自己來終止,比較了一下,對于full-page而言,用terminate顯得直接友善(時序清晰明了),而precharge和時間有關(不單單是時鐘周期的個數關系),datasheet的時序圖中有一張是full-page write,用的也是terminate,是以就選用了terminate。

結果實驗下來,寫入的資料一個也沒讀出來,全是FF。心理沒譜了。揣摸了幾天,猜想問題在precharge上,嘗試在terminate後面加上precharge,實驗就成功了!原來盡管terminate和precharge都能終止頁爆發,但terminate隻是單純的終止,不能完全代替precharge,用了terminate後還要跟上precharge才行。資料上時序圖恰好在頁模式時隻畫了terminate,沒跟上precharge,在文字講解頁模式寫的時候光說都能終止,也沒強調還要precharge。

導緻誤會的根本原因是這份datasheet隻是應用方面的說教,而不是sdram原理的較長的描述。但SDRAM原理的詳細講解到現在也沒找着,看到的資料都是外文翻譯過來後互相抄的!千篇一律!比如precharge,從字面看是“預充電”,可資料上的解釋都是“Deactivate row in bank or banks”及其中文翻譯。後來在論壇上也看到新手們在問:precharge和refresh到底都作了什麼,有什麼差別?

我根據存動态記憶體存儲單元的基本原理

某些電路相當于“口線供能電容”,此電容容量遠比資料存儲電容大,用于給口線的讀寫驅動提供能量,器件資料位寬是幾位就隻需要幾乘以4個(4來源于有4個banks)。下面就來自圓其說:

初始化按照要求就先precharge了,以後每次讀寫之前都要active。active做兩件事,既選通了相關行,又将驅動的能源準備好。當具體讀寫時,就選通列,給資料電容充電或放電。1個爆發讀寫完成後,就撥回precharge,給“供能電容”補足電能。因為“供能電容”在active時要被消耗能量并且也存在自漏電問題,是以有了資料上的(active to precharge command)tRAS<120微秒的要求。而撥回precharge時,“供能電容”是一直接着電源的,是以資料上就沒有(precharge to active command)的要求了。因為“供能電容”比較大,從硬體設計角度出發充電電流不能做太大,是以tWR和tRP就相對要長。真正的順序是precharge-〉active-〉讀寫-〉終止,因為tRP較長,是以初始化時先precharge,并且每次讀寫完後馬上precharge,以便下次讀寫時隻需active以提高響應速度,反正放在那precharge又不影響什麼。這就是precharge(預充電)的真正含義所在!至于何必這麼麻煩要“供能電容”倒一手,可能是因為資料單元太脆弱,經不起電源直接沖擊或幹擾,呵呵。而且根據動态記憶體原理,資料線複用,反正必須先active選通行,順便再附加個供能功能;而爆發需要終止,特别是頁模式更不會自動終止,那麼就将“終止”和“預充電”合并到“precharge”,設計人員真會動腦筋。而資料隻管說終止功能,沒提預充電的作用,反正時序是通的。

想出所謂“供能電容”的還有個原因是:有兩個和時鐘無關的長時間參數,重新整理周期64ms,tRAS 120微秒,不都是電容漏電的展現嗎。是以記憶體可以降頻使用,但不能太低,以至于64ms内你隻能完成4096次重新整理,别的什麼都沒時間幹;或者tRAS期間你連1次讀寫或寫都完不成。

至于refresh,就是1次先讀後寫的過程,用于保持資料電容的電位。如果在自己的系統中,特别是資料采集系統,1組資料流在64ms内完成了先寫入sdram暫存後讀入主機,并且sdram中的資料就不再需要了,整個過程不需要插入任何重新整理指令。延伸開來,可以做出很适合你的最簡單的sdram控制器。做個基本的SDRAM控制器很簡單,關鍵是要根據你的系統特點合理安排好讀、寫、重新整理等操作。

以上是我這幾天的心得,希望沒有誤導大家

繼續推測:在“auto refresh”指令執行的末端隐含了“precharge”,是以資料上要求“auto refresh”前要保證已經“precharge”,而“auto refresh”卻可以放在一起連續發出,“auto refresh”之後卻直接可以“active”而不再需要“precharge”。還可能在“auto refresh”指令執行的前端隐含了“active”,行位址由重新整理寄存器自動計數并加1。“auto refresh”就是對某行所有列同時 “active”“read”“write”“precharge”,正好7個周期。器件共有4096行,是以要求在64ms内重新整理4096次,4個banks是并行同時操作的,是以資料顯示耗電高峰發生在自動重新整理期間。

實際上read已經隐含了write,就是一次完整的讀或自動重新整理操作的第5個周期,時序正好吻合。不同的是自動重新整理的第5個周期不需對外在DQ上輸出。

充電放在前面叫charge,放在後面是為下一次操作提前做好準備就叫precharge,以前面分析prechage能提高斷續操作的響應速度,是以最終設計就采用了“precharge”

如果對我說的都很清楚,那麼操作記憶體應該是遊刃有餘了

打電話問了Micron的技術人員,模式寄存器的内容在掉電前始終有效,中途更改無需再等待120us,但建議稍等一下,具體多少沒說。這些内容如果是試驗出來的也不敢肯定就一定正确,必須打電話問。

active 和 precharge 是互為反向的信号;其實可能就是同一信号,管子一個是N溝道另一個是P溝道而已。

Q1負責讀放大,Q2負責寫,不需要專用控制信号,自回報。這樣每個單元隻要4個管子!

選通行位址就實作了讀放大和自重新整理,當列位址也選通就實作了對資料線的輸入輸出。

AutoRefresh時專用計數器自加1并選通某行位址,所有列位址不選通。

如果上圖正确,那麼讀寫某位址的資料時,同1頁的其他資料單元都得到了重新整理。

驗證此推測的一個辦法是:對某一行第1列寫入某資料,等64ms或更長時間(期間不用任何重新整理指令,隻是反複去讀/寫同一行的第128列),再來讀第1列,資料應該還在。

以上推斷都建立在第1幅圖的基礎上,今看到兩頁IC設計的資料,發覺這幅圖已是 陳舊的“單管動态存儲電路”,但現在國内大部分教案和資料用的都是它!!!東南大學的電子教案用它講解DRAM位址複用的内容甚至是錯誤的!!!誤人子弟

稍後我把現在SDRAM的單元及推導的陣列畫給大家。這個單元資料上給的是0.35微米的IC設計版圖,那就是真正的電路了。

我前面的推導不是真實的電路形式,但我自認為還是蠻合邏輯的但所說的試驗可能會失敗,因為真的讀放大電路不在存儲單元中。

問題:

按照datasheet定義的指令真值表:

--------------------------/CS ---/RAS---/CAS---/WE

PRECHARGE--------L ------- L  -------H -------L

REFRESH-------------L --------L -------- L -------H

那麼好象是PRECHARGE是對每個行"寫"入資料?

REFRESH則通過内部計數器進行逐行重新整理?

turkyrun: ras cas we 應該是複用的,不然加載模式時全低又怎麼解釋呢,8種狀态全用完了

sunnybird:因為datasheet是介紹器件的,而不是理論教材。

另:我的項目搞定了,說明對SDRAM的了解是對的,我降頻在48MHz使用。

以下三張圖是資料提供的,第4張圖是我自己推導的:

SDRAM 的IC設計版圖:

此主題相關圖檔如下:

注意:現在的SDRAM設計,存儲電容另一端的參考電平是二分之一Vcc

wordline了解為字線,digiline(bitline)了解為位線

  以現在的0.35um工藝,存儲電容大約有300fF(1pF=1000fF)。現在的單顆晶片的容量越來越大,分到每個存儲電容的晶片面積越來越小,電容容量也越來越小。這麼小的電容存儲的電量遠不足以去開關mos管(因不了解晶片制造技術,是以我有上面第12樓那不切實際的推導),采用的辦法是用兩個電容,一個正相存儲,一個反相存儲,這也是參考電壓選vcc/2的原因;要讀出資料時,用的是運放差分放大,一個電容搭在正相端,另一個搭在反相端,這樣就把微弱的電量讀出來了;而且由于電容電量實在太小,在向運放正反相端充放電時就幾乎把電耗盡,也就是把自身的資料破壞了。

  那麼precharge的任務之一就是将位線及運放正反向端搭在參考電位(Vcc/2)上,active時脫離此參考電位.