本篇博文共有兩種刷新方式
SDRAM數據手冊給出每隔64ms就要將所有行刷新一遍,
因此每隔64_000_000 ns/2^12=15625ns 就要刷新一次。(因為一個L-Bank的行是12位,所以一共有2^12行)。
假設我的時鍾頻率是100Mhz(一個周期是10ns),則只需要每隔1562個時鍾周期刷新一次即可。
注意:這里最多隔 1562 個時鍾周期就要保證至少刷新一次,言外之意,我可以隔小於1562的時鍾周期就刷新一次,這樣也是可以的,
因此,在設計刷新操作的時候可以利用這個特點。
1、例如在full-page模式下利用這個特點進行刷新設計,
SDRAM 初始化完成后,每隔一定的刷新時間就執行刷新操作,但是當刷新時間到了還不夠,還必須處於IDLE狀態時,才能執行刷新操作。
那么這個刷新時間要怎么計算呢?
刷新有可能出現的情況為
刷新時間到了,剛好處於 IDLE 狀態,那么就立即執行刷新操作。
刷新可能出現最壞的結果為,刷新時間到了,但是此刻我沒有處於 IDLE 狀態,而是剛好處於讀或寫,這時我就需要等待直到IDLE狀態時才執行刷新操作。
因此我們要保證的是 刷新時間+需要等待的時間<=1562.
這兩個時間如何確定呢?
因為是全頁模式的讀寫,則突發長度為2^8,需要256個時鍾周期,
如果是讀,則需要等待的時鍾周期為 激活時間(tRCD)+ CAS Latency (tCL)+ 256 +預充電的時間(tRP)
如果是寫,則需要等待的時鍾周期為 激活時間(tRCD)+ 256 +預充電的時間(tRP)
tRCD、tCL、tRP都可以從 datasheet 中獲得,因此需要等待的時間就能算出來。
1562 - 需要等待的時間 = 刷新時間。
2、第二種刷新方式:刷新計數器計數到刷新時間1562時,設立一個刷新標志位 refresh_flag =1,當狀態機在 IDLE 狀態時且 refresh_flag =1則響應刷新操作。刷新計數器設立刷新標志位后立即又從零開始計數,不再等待。
第二種刷新方式更靈活一些。