在FPGA視頻圖像處理系統(tǒng)中,經(jīng)常需要使用到SDRAM作為視頻圖像緩存。SDRAM控制器可以分為上電初始化,自動刷新,讀操作和寫操作這四個部分,他們之間的轉(zhuǎn)換可以通過狀態(tài)機來控制。下面分別實現(xiàn)這幾個部分。
1.SDRAM上電初始化
SDRAM上電初始化時序如下圖所示。
由時序圖可知初始化大概的過程為:上電后等待電源VDD和時鐘信號穩(wěn)定100μs(期間命令為空命令),同時在100μs內(nèi)設(shè)置CKE(時鐘使能)信號為高。隨后對所有Bank發(fā)送預(yù)充電(PRECH ARGE)命令,發(fā)送兩次自動刷新(REFRESH)命令,最后發(fā)送裝載模式寄存器(LOAD MODE REGISTER)命令,并將設(shè)置寄存器的值傳入地址總線A0~A11。
上述過程的實現(xiàn)可以通過線性序列機來實現(xiàn)。即需要對初始化過程時間進行計數(shù),當(dāng)時間到達時就執(zhí)行某個命令。下面是部分代碼。
1.計時器
2.命令執(zhí)行時間設(shè)置
3.對應(yīng)時間執(zhí)行對應(yīng)命令
2.SDRAM自動刷新
同樣給出自動刷新的時序圖。
過程比較簡單:首先對所有Bank預(yù)充電,然后發(fā)送兩次自動刷新命令。
同樣可以使用線性序列機的方法來實現(xiàn),這里就不重復(fù)了。但需要添加一個刷新狀態(tài)標(biāo)志。ref_opt_done=1表示刷新完成,ref_opt=1表示正在刷新。
3.SDRAM寫操作
從時序圖上看首先發(fā)出激活命令,并給出行地址Bank地址;隨后發(fā)出寫命令,并指定寫入Bank,起始列地址和寫入數(shù)據(jù);最后進行預(yù)充電,關(guān)閉所有Bank。這里每次突發(fā)寫入4個數(shù)據(jù),即突發(fā)長度為4,突發(fā)長度可以在之前初始化的模式寄存器中設(shè)置。
同樣使用序列機的實現(xiàn)方法,在寫操作中也需要添加寫操作完成狀態(tài)標(biāo)志,和過程狀態(tài)標(biāo)志。此外只有當(dāng)寫入突發(fā)長度數(shù)據(jù)的時候我們才使能數(shù)據(jù)線輸入有效,其他時刻讓數(shù)據(jù)線保持高阻態(tài),所以要添加一個寫數(shù)據(jù)狀態(tài)標(biāo)志W(wǎng)r_data_valid=1時表示正在寫數(shù)據(jù)。
4.SDRAM讀操作
與寫操作類似,但是我們輸入讀命令的時候,數(shù)據(jù)并不是立刻輸出,而是要經(jīng)過一個CAS_Latency后輸出。這個延時也可以通過模式寄存器的配置來調(diào)整。我們同樣需要給出讀操作完成、讀操作過程,讀出突發(fā)數(shù)據(jù)的有效區(qū)間。
5.SDRAM控制器設(shè)計
首先SDRAM上電后進入空閑狀態(tài),初始化完成后進入刷新狀態(tài),然后根據(jù)輸入命令進行轉(zhuǎn)換,實際上狀態(tài)機的控制對于刷新操作,讀/寫操作是有一個優(yōu)先級的:刷新操作>寫操作>讀操作。即假設(shè)寫命令和刷新命令同時到來時先執(zhí)行刷新操作。下圖為狀態(tài)機的狀態(tài)轉(zhuǎn)移圖。具體實現(xiàn)可參考完整代碼。
由于SDRAM需要固定時間間隔刷新一次,我們還得考慮一個刷新定時器,固定時間產(chǎn)生一個刷新請求。
最后我們還需要考慮如果在讀操作的時候,產(chǎn)生了刷新請求或?qū)懻埱笤趺崔k呢?寫操作的時候,產(chǎn)生了刷新請求或讀請求怎么辦?或者在刷新操作時產(chǎn)生了讀/寫請求怎么辦?
對于刷新請求的突然到來我們采取記住刷新標(biāo)志,等待當(dāng)前任務(wù)完成后進行刷新操作。
在刷新操作時讀/寫請求突然到來,我們也采取記住讀/寫標(biāo)志,等待當(dāng)前任務(wù)完成后進行讀/寫操作。
但是對于在讀/寫操作時外部讀/寫請求的到來,我們選擇了忽略這次請求。部分代碼如下。
由于視頻信號數(shù)據(jù)讀入讀出都是連續(xù)不斷的,因此在某些時刻會導(dǎo)致讀寫的遺漏,但一般會在SDRAM讀出寫入前加上一個FIFO進行緩存控制數(shù)據(jù)的讀寫,當(dāng)寫FIFO中數(shù)據(jù)大于一次突發(fā)長度時,使能寫信號;當(dāng)讀FIFO中數(shù)據(jù)小于突發(fā)長度時,使能讀信號,就可以解決這個問題。
更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<