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