在FPGA視頻圖像處理系統(tǒng)中,經(jīng)常需要使用到SDRAM作為視頻圖像緩存。SDRAM控制器可以分為上電初始化,自動(dòng)刷新,讀操作和寫(xiě)操作這四個(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寫(xiě)操作
從時(shí)序圖上看首先發(fā)出激活命令,并給出行地址Bank地址;隨后發(fā)出寫(xiě)命令,并指定寫(xiě)入Bank,起始列地址和寫(xiě)入數(shù)據(jù);最后進(jìn)行預(yù)充電,關(guān)閉所有Bank。這里每次突發(fā)寫(xiě)入4個(gè)數(shù)據(jù),即突發(fā)長(zhǎng)度為4,突發(fā)長(zhǎng)度可以在之前初始化的模式寄存器中設(shè)置。
同樣使用序列機(jī)的實(shí)現(xiàn)方法,在寫(xiě)操作中也需要添加寫(xiě)操作完成狀態(tài)標(biāo)志,和過(guò)程狀態(tài)標(biāo)志。此外只有當(dāng)寫(xiě)入突發(fā)長(zhǎng)度數(shù)據(jù)的時(shí)候我們才使能數(shù)據(jù)線輸入有效,其他時(shí)刻讓數(shù)據(jù)線保持高阻態(tài),所以要添加一個(gè)寫(xiě)數(shù)據(jù)狀態(tài)標(biāo)志W(wǎng)r_data_valid=1時(shí)表示正在寫(xiě)數(shù)據(jù)。
4.SDRAM讀操作
與寫(xiě)操作類似,但是我們輸入讀命令的時(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ì)于刷新操作,讀/寫(xiě)操作是有一個(gè)優(yōu)先級(jí)的:刷新操作》寫(xiě)操作》讀操作。即假設(shè)寫(xiě)命令和刷新命令同時(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)求怎么辦呢?寫(xiě)操作的時(shí)候,產(chǎn)生了刷新請(qǐng)求或讀請(qǐng)求怎么辦?或者在刷新操作時(shí)產(chǎn)生了讀/寫(xiě)請(qǐng)求怎么辦?
對(duì)于刷新請(qǐng)求的突然到來(lái)我們采取記住刷新標(biāo)志,等待當(dāng)前任務(wù)完成后進(jìn)行刷新操作。
在刷新操作時(shí)讀/寫(xiě)請(qǐng)求突然到來(lái),我們也采取記住讀/寫(xiě)標(biāo)志,等待當(dāng)前任務(wù)完成后進(jìn)行讀/寫(xiě)操作。
但是對(duì)于在讀/寫(xiě)操作時(shí)外部讀/寫(xiě)請(qǐng)求的到來(lái),我們選擇了忽略這次請(qǐng)求。部分代碼如下。
由于視頻信號(hào)數(shù)據(jù)讀入讀出都是連續(xù)不斷的,因此在某些時(shí)刻會(huì)導(dǎo)致讀寫(xiě)的遺漏,但一般會(huì)在SDRAM讀出寫(xiě)入前加上一個(gè)FIFO進(jìn)行緩存控制數(shù)據(jù)的讀寫(xiě),當(dāng)寫(xiě)FIFO中數(shù)據(jù)大于一次突發(fā)長(zhǎng)度時(shí),使能寫(xiě)信號(hào);當(dāng)讀FIFO中數(shù)據(jù)小于突發(fā)長(zhǎng)度時(shí),使能讀信號(hào),就可以解決這個(gè)問(wèn)題。
編輯:lyn
-
FPGA
+關(guān)注
關(guān)注
1625文章
21622瀏覽量
601241 -
計(jì)時(shí)器
+關(guān)注
關(guān)注
1文章
416瀏覽量
32605 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68236 -
SDRAM控制器
+關(guān)注
關(guān)注
0文章
28瀏覽量
8125
原文標(biāo)題:SDRAM控制器設(shè)計(jì)
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論