SDRAM(3):刷新和仲裁


  初始化完成后,我們就可以對 SDRAM 進行其他的操作了,首先需要設計的是刷新和仲裁模塊。

一、SDRAM工作原理和仲裁實現

  SDRAM 內部有自己的工作狀態機,如下所示。其中粗線表示自動跳轉,細線表示要滿足某些條件后才跳轉。

 

  這個狀態機非常復雜,但我們如果只是簡單應用 SDRAM 則不需要實現里面所有操作。上電 POWER ON后,我們進行了初始化,實際上就是進行了預充電 Precharge,狀態機到了 IDLE,又給了兩次 Auto Refresh,此時狀態機饒一圈又到 IDLE,然后給了一次 LMR 記載模式寄存器,之后狀態機自動回到 IDLE。也就是說,經過上電和出似乎還后我們停在了 IDLE這,IDLE右邊的 Self Refsh 和 Power Down 不用理會。后面 SDRAM 正常工作需要考慮的操作是:1、自動刷新;2:寫操作;3:讀操作。這三個操作靠仲裁來實現,此外需要注意優先級:自動刷新 > 寫操作 > 讀操作。由此我們設計代碼時可以另寫一個適合我們的仲裁狀態機:

 

  當刷新的時間到了之后,刷新模塊向仲裁發起刷新請求,然后仲裁根據 SDRAM 當前所處狀態判斷是否允許 SDRAM 進行刷新,如果可以則向刷新模塊給出刷新使能信號 aref_en;當刷新模塊對 SDRAM 進行刷新完畢后,再向仲裁給出刷新結束標志 aref_end。 仲裁狀態機直接在 SDRAM_top 頂層文件書寫即可,注意一下優先級的設置,另外寫操作和讀操作還沒有設計,可以先空着。
 

二、SDRAM刷新

1、刷新原理

  關於 SDRAM 刷新,數據手冊是這樣說的:

  解讀一下:

  ① SDRAM 必須在 64ms 內需要刷新 4096 次(不同芯片次數不同),SDRAM 需要不斷的刷新,來保證其內部的電量來達到保存數據不丟失的作用,SDRAM 內部的電容能保持電量的最長時間是 64ms,即SDRAM保存數據不丟失的時間是 64ms。

  ② SDRAM刷新是所有 Bank 同時一行一行的刷新,SDRAM 內部有行計數器,在刷新完第0行時,會自動計數到第1行。假如0時刻刷新完第0行,那到第二次刷新第0行時要求在64ms里,而我們的行地址有12根地址線A11-A0:12‘b1111_1111_1111 = 4095,共4096行,即在64ms里面需要把4096行刷新。

  ③ 兩次刷新之間的間隔是 64000us/4096 = 15.625us,本次設計取 15us。

 

2、刷新時序

  從 SDRAM 數據手冊上可知,實現 AUTO-REFRESH 就一個步驟:給出一個命令:Auto Refresh,然后等待時間 tRC,之后 SDRAM 刷新結束。

  這張圖讓很多人引起誤解,第一點:圖中很多指令其實是不用管的。開頭的 PRECHARGE 命令在初始化、寫、讀的模塊本身里面已經產生,這里不用再給。第二點:圖中看似標出了兩個 Auto Refresh 命令,但這兩個命令中間是有省略符“~~”的,它的意思是中間很多個的 Auto Refresh 命令,即產生多次刷新,而我們設計一次的刷新只需要給一個 Auto Refresh 命令即可。第三點:后面的 ACTIVE 命令是為了接后面的其他操作的,並不是刷新操作本身需要的。

  由此我們可以得出刷新模塊的設計時序:

 

 

三、仿真
  仿真的 testbench 和上一講一樣,不需要更改,打開 Modelsim,先跑 216us,再跑 15us 看看,在 Modelsim 下方打印出如下信息:
  信息顯示出了自動刷新的操作,再觀察 SDRAM_aref 模塊的波形,概況圖如下所示:
  放大自動刷新部分的波形,得到下圖:

  可以看到波形和我們的設計是完全一致的,刷新模塊設計成功!

 

 

 

參考資料:[1]威三學院FPGA教程

        [2]開源騷客FPGA教程

 


免責聲明!

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



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