初始化完成后,我們就可以對 SDRAM 進行其他的操作了,首先需要設計的是刷新和仲裁模塊。
一、SDRAM工作原理和仲裁實現
SDRAM 內部有自己的工作狀態機,如下所示。其中粗線表示自動跳轉,細線表示要滿足某些條件后才跳轉。
這個狀態機非常復雜,但我們如果只是簡單應用 SDRAM 則不需要實現里面所有操作。上電 POWER ON后,我們進行了初始化,實際上就是進行了預充電 Precharge,狀態機到了 IDLE,又給了兩次 Auto Refresh,此時狀態機饒一圈又到 IDLE,然后給了一次 LMR 記載模式寄存器,之后狀態機自動回到 IDLE。也就是說,經過上電和出似乎還后我們停在了 IDLE這,IDLE右邊的 Self Refsh 和 Power Down 不用理會。后面 SDRAM 正常工作需要考慮的操作是:1、自動刷新;2:寫操作;3:讀操作。這三個操作靠仲裁來實現,此外需要注意優先級:自動刷新 > 寫操作 > 讀操作。由此我們設計代碼時可以另寫一個適合我們的仲裁狀態機:
二、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 命令是為了接后面的其他操作的,並不是刷新操作本身需要的。
由此我們可以得出刷新模塊的設計時序:



可以看到波形和我們的設計是完全一致的,刷新模塊設計成功!
參考資料:[1]威三學院FPGA教程
[2]開源騷客FPGA教程