0 引言
SDRAM(同步動態(tài)存儲器)是一種應(yīng)用廣泛的存儲器,,具有容量大,、數(shù)據(jù)讀寫速度快、價格低廉等優(yōu)點(diǎn),,特別適合那些需要海量存儲器的應(yīng)用領(lǐng)域,,例如視頻方面。
這里有一個視頻項(xiàng)目要求將非標(biāo)準(zhǔn)的ITU-R BT.656視頻格式的數(shù)據(jù)轉(zhuǎn)換成VGA格式,,直接用于顯示器顯示,。如圖1,輸入的視頻格式是非標(biāo)準(zhǔn)的ITU-R BT.656格式,,圖像分辨率是1280×1024,,幀速是15幀/秒,,每一個像素點(diǎn)是24bit;輸出的視頻格式是VGA格式,,圖像分辨率是1280× 1024,,幀速是60幀/秒,每一個像素點(diǎn)還是24bit,。
本項(xiàng)目使用SDRAM來存儲視頻數(shù)據(jù),。在設(shè)計中,要求能夠?qū)⒁环暾膱D像(1280×1024×24bit)存儲在SDRAM中,。并且要求讀寫突發(fā)長度是1280,,即一行視頻數(shù)據(jù)(1280×24bit)。SDRAM突發(fā)長度最高只能達(dá)到256(即SDRAM芯片的一列的長度),,為此需要使用FPGA專門實(shí)現(xiàn)一個SDRAM控制器。在控制器的設(shè)計中通過采用切換bank操作,、自動預(yù)沖,、集中刷新等技術(shù)實(shí)現(xiàn)了這種超長突發(fā)長度的數(shù)據(jù)讀寫。同樣通過適當(dāng)?shù)匦薷拇丝刂破?,可以?shí)現(xiàn)任意突發(fā)長度的數(shù)據(jù)讀寫,。
1 SDRAM基本特性
本設(shè)計中采用的SDRAM芯片的型號是MT48LC2M3282-7。SDRAM的主要操作包括初始化,、讀寫和刷新操作,。SDRAM的初始化操作過程如下:上電后等待100 μs;然后依次完成預(yù)沖,,兩次刷新操作,;接下來就可以配置寄存器了。至此整個初始化工作結(jié)束,,SDRAM進(jìn)入正常工作狀態(tài),。SDRAM進(jìn)入正常工作狀態(tài)后,就可以根據(jù)命令來工作,。這些命令包括:預(yù)沖(Precharge)和自動預(yù)沖(AutoPrecharge),、激活(Active)、讀 (read),、寫(write),、自動刷新(Auto Refresh)和自刷新(Self Refresh)等。根據(jù)本設(shè)計的需要,,這里詳細(xì)介紹設(shè)計中相關(guān)的命令:自動預(yù)沖,、激活、讀寫,、自動刷新,。自動預(yù)沖命令是SDRAM芯片在一次突發(fā)讀/寫結(jié)束后自動發(fā)出預(yù)沖命令,,將讀寫的行關(guān)閉。它與預(yù)沖命令有著相同的功能,,但是發(fā)起命令的方式不一樣,。預(yù)沖命令是SDRAM控制器發(fā)起的命令,它需要占據(jù) SDRAM的總線,,在這段時間不能讀寫數(shù)據(jù),。而自動預(yù)沖命令是SDRAM自動的行為,不需要占據(jù)SDRAM的總線,。這個命令是在發(fā)起讀寫命令時設(shè)置的,。
激活命令是對SDRAM的某一行激活,這樣才能對這一行數(shù)據(jù)發(fā)起讀寫操作,。讀寫命令是對某一激活的行進(jìn)行突發(fā)讀寫操作,。具體的突發(fā)讀寫的數(shù)據(jù)長度在初始化時配置寄存器時設(shè)置了。
刷新命令是對SDRAM內(nèi)的數(shù)據(jù)完成再生的操作,,因?yàn)镾DRAM采用電容存儲數(shù)據(jù),,而電容存在漏電的現(xiàn)象,因此需要隔一段時間對電容作一次刷新(即重新充電),,一般來說要求64ms內(nèi)將SDRAM的所有行都刷一遍,。SDRAM有兩種刷新命令:自動刷新和自刷新。自刷新是在芯片處于低功耗狀態(tài)下時才使用的方式,,芯片內(nèi)部自動完成刷新操作,。自動刷新是控制器發(fā)起的刷新操作,它必須在SDRAM沒有激活行時才能進(jìn)行刷新操作,,而且需要占用一定的時間(大約 60~70ns),。控制器可以根據(jù)需要選擇在何時刷新,,即定時刷新,,或集中刷新。定時刷新是隔一段時間就刷新一次,;集中刷新是在某一段空閑時間內(nèi)連續(xù)刷新若干次,。這個只要保證在64 ms內(nèi)將所有的行都刷一遍即可,具體的刷新方式可以根據(jù)自己的應(yīng)用需要來設(shè)計,。
2 SDRAM控制器的設(shè)計
2.1 SDRAM控制器的設(shè)計思路
SDRAM芯片完成一次讀寫操作由三個命令組成:激活,、讀/寫、預(yù)沖,。讀寫數(shù)據(jù)的突發(fā)長度往往是有限制的,,在SDRAM芯片本身提供的突發(fā)長度最大只能達(dá)到一行的容量(256,即全頁突發(fā)模式),。這樣當(dāng)一次讀寫突發(fā)長度結(jié)束后,,如果需要發(fā)起下一次讀寫,,就需要發(fā)預(yù)沖命令結(jié)束這一行,然后發(fā)激活命令開啟下一行,。這樣才能開始寫下一次數(shù)據(jù),。因此,如果想要連續(xù)的數(shù)據(jù)讀寫,,就必須想辦法節(jié)省激活和預(yù)沖命令,。
激活命令通過切換Bank操作來完成。SDRAM有4個獨(dú)立的bank,,每一個bank可以同時允許有一行激活,,彼此并不會相互干擾。這樣的話,,在同一時刻最多可以有4個行處于激活狀態(tài),。這就為節(jié)約激活時間提供了解決方案:在突發(fā)讀寫一個bank下的某一行時,可以在突發(fā)長度結(jié)束之前提前激活另一個 bank下的某一行,。這樣當(dāng)這個突發(fā)長度結(jié)束時就可以直接讀寫另一bank中被激活的行,。預(yù)沖可以采用自動預(yù)沖方式來完成,不需要額外的預(yù)沖命令,。
通過上述兩種操作方式可以完全實(shí)現(xiàn)超長突發(fā)長度的數(shù)據(jù)讀寫,本設(shè)計將SDRAM設(shè)置成突發(fā)長度為8,,突發(fā)長度結(jié)束后采用自動預(yù)沖方式完成此行的預(yù)沖操作,,具體設(shè)想如下:
在寫SDRAM時,先激活Bank0的第一行,;發(fā)出帶自動預(yù)沖模式的寫操作,;數(shù)據(jù)開始寫入這一行內(nèi);一段時間后(在突發(fā)長度結(jié)束之前)將Bank1的第一行激活,;在Bank0的寫突發(fā)長度結(jié)束的同時,,發(fā)出寫B(tài)ank1的命令,這樣接下來的數(shù)據(jù)就寫入Bank1的第一行中,;而由于在寫SDRAM的Bank0 時設(shè)置成自動預(yù)沖模式,,所以SDRAM會在Bank0的寫操作結(jié)束后自動預(yù)沖,經(jīng)過tRP(預(yù)沖時間)后,,這一Bank自動回到idle狀態(tài),。同樣 Bank1處于寫突發(fā)長度時將Bank2的第一行激活,在Bank1的寫突發(fā)長度結(jié)束的同時發(fā)出寫B(tài)ank2的命令……如此四個bank輪流工作,,將數(shù)據(jù)均勻地分配到4個bank中,。
對于這種超長的數(shù)據(jù)突發(fā)讀寫,完成一次讀寫操作所花費(fèi)的時間比較多,,例如讀寫時鐘是108MHz時,,一次突發(fā)長度是1280的寫操作所花費(fèi)的時間是11. 6 μs,,即在這段時間內(nèi)SDRAM的數(shù)據(jù)總線是不能被中斷的。因此采用集中刷新是最好的解決辦法,。在突發(fā)讀寫結(jié)束后,,會有一段比較長的空閑期(具體時間長度根據(jù)視頻數(shù)據(jù)的視頻中行消隱數(shù)據(jù)個數(shù)和讀寫時鐘決定),在這段時問內(nèi)可以集中連續(xù)發(fā)出多個刷新命令,,只需要保證在64ms內(nèi)總的刷新次數(shù)達(dá)到了要求即可,。
2.2 SDRAM控制器的實(shí)現(xiàn)
本設(shè)計中將SDRAM控制器分成4個子模塊:sdr_master主控模塊、sdr_ctrl命令模塊,、sdr_sig譯碼模塊,、sdr_data數(shù)據(jù)通路模塊,見圖2,。sdr_master主控模塊根據(jù)外部的讀寫請求向sdr_ctrl命令模塊提供各種讀寫控制信號,;sdr_ctrl命令模塊內(nèi)部的控制狀態(tài)機(jī)會依此發(fā)出各種SDRAM讀寫控制命令;sdr_sig譯碼模塊會把sdr_ctrl輸出的控制命令譯碼成符合SDRAM接口的信號,。此SDRAM 控制器的設(shè)計,,最復(fù)雜的部分在于如何設(shè)計SDRAM的工作時序,即SDRAM何時激活,,何時讀/寫,,何時預(yù)沖,何時刷新,。這些控制除了滿足SDRAM的工作特性外,,還要滿足設(shè)計要求。因此,,鑒于SDRAM控制的復(fù)雜性,,一般都采用狀態(tài)機(jī)來控制。本設(shè)計中sdr_ctrl命令模塊包括兩個狀態(tài)機(jī):初始化狀態(tài)機(jī)完成SDRAM的初始化,;控制狀態(tài)機(jī)完成SDRAM的正常工作控制,。下面分別詳述這兩個狀態(tài)機(jī)的設(shè)計。
初始化狀態(tài)機(jī)的結(jié)構(gòu)見圖3,。系統(tǒng)在上電(復(fù)位)后,,處于i NOP狀態(tài);當(dāng)?shù)却?00 μs后,,狀態(tài)跳轉(zhuǎn)到i PRE,,發(fā)出預(yù)沖命令;接著跳轉(zhuǎn)到i tRP等待,;經(jīng)過tRP時間后,,狀態(tài)跳轉(zhuǎn)到i_AR1,發(fā)第一次刷新命令,然后在i_tRFC1等待tRFC時間后發(fā)第二次刷新命令,,再等待tRFC,;接下來轉(zhuǎn)到狀態(tài)i MRS,發(fā)裝載模式字命令,,然后等待tMRD時間后初始化完成,,進(jìn)入i_ready狀態(tài)。至此初始化完成,,SDRAM芯片就可以正常工作了,。
控制狀態(tài)機(jī)的狀態(tài)跳變見圖4。此狀態(tài)機(jī)是為了滿足超長數(shù)據(jù)的連讀或連寫而特殊設(shè)計的,。上電后處于c_idle狀態(tài),,當(dāng)初始化完成后,控制狀態(tài)機(jī)才能開始正常工作,。當(dāng)外部要求進(jìn)行讀寫操作時,,會正式地啟動狀態(tài)機(jī)。此時狀態(tài)機(jī)跳變到c_ACT狀態(tài),,使SDRAM控制器發(fā)出激活命令,;接下來兩個狀態(tài) c_tRCD1、c_tRCD2是激活等待時間tRCD,;然后狀態(tài)機(jī)根據(jù)外部是讀請求還是寫請求,,來決定下一個狀態(tài)是發(fā)讀命令還是寫命令。下面以寫數(shù)據(jù)為例進(jìn)行說明,,讀數(shù)據(jù)的工作過程是一樣的,。
當(dāng)要求寫SDRAM時,控制狀態(tài)機(jī)的狀態(tài)由c_tRCD2跳變到c_WR狀態(tài),,發(fā)出寫命令。SDRAM控制器會在發(fā)寫命令的同時將本次突發(fā)數(shù)據(jù)的第一個數(shù)據(jù)送到總線上,,接著是三個周期的狀態(tài):c_tDAL1,、c_DAL2、c_tDAL3,,之后回到c_idle狀態(tài),。這樣完成了寫數(shù)據(jù)的一次循環(huán),剛好需要 8個周期,。在回到c_idle狀態(tài)后即可啟動下一次寫數(shù)據(jù)傳輸,,這時狀態(tài)機(jī)跳到c_ACT狀態(tài),發(fā)出激活另一個bank的某一行的命令,,然后經(jīng)過兩個周期后,,此時上一次寫操作的數(shù)據(jù)突發(fā)長度剛好結(jié)束。下一個周期狀態(tài)變成c_WR,發(fā)下一次的寫命令,,同時將這一次突發(fā)長度的第一個數(shù)據(jù)放到SDRAM數(shù)據(jù)總線上……如此循環(huán),,可以完成長度是1280的連續(xù)數(shù)據(jù)的寫入。這個循環(huán)如何結(jié)束呢?當(dāng)發(fā)了最后一個突發(fā)寫命令后,,狀態(tài)機(jī)回到c_idle時,,即可停止循環(huán),不再進(jìn)入激活狀態(tài),??傊ㄟ^控制這個狀態(tài)機(jī)可以完成長度是8的倍數(shù)的連續(xù)數(shù)據(jù)讀寫??刂茽顟B(tài)機(jī)還有實(shí)現(xiàn)刷新操作的功能,,當(dāng)要求對SDRAM進(jìn)行刷新操作時,控制狀態(tài)機(jī)的狀態(tài)會跳變到c_AR,,SDRAM控制器會依此發(fā)出刷新命令,。然后狀態(tài)機(jī)跳變到c_tRFC狀態(tài)等待刷新操作的結(jié)束。當(dāng)刷新操作結(jié)束后,,狀態(tài)機(jī)將恢復(fù)到c_idle,。這樣就完成了一次刷新操作。如果需要多次刷新,,就可以連續(xù)進(jìn)行多次這樣的循環(huán),。
2.3 SDRAM控制器的綜合
本設(shè)計使用的SDRAM芯片是MT48LC2M3282,F(xiàn)PGA芯片是cyclone的EP1C6Q240C6,。綜合工具是QuartusII 6.0,。綜合的結(jié)果是邏輯單元使用了170個,占總資源的3%;工作頻率最高可以達(dá)到240.10 MHz,,滿足項(xiàng)目要求,。
3 代碼的仿真測試
本設(shè)計的仿真工具是Modelsim6.1f,部分仿真測試波形見圖5,。圖中描述了讀一行數(shù)據(jù)的時序圖,,在開始突發(fā)寫數(shù)據(jù)后,SDRAM的數(shù)據(jù)總線sdr_DQ上的數(shù)據(jù)沒有被中斷,。這個表示整個設(shè)計達(dá)到了能夠支持超長數(shù)據(jù)突發(fā)讀寫功能,,能滿足設(shè)計要求。
4 結(jié)束語
本文介紹了一種實(shí)現(xiàn)超長數(shù)據(jù)突發(fā)讀寫的設(shè)計,。此設(shè)計采用切換Bank操作節(jié)約了激活命令所花費(fèi)的時間,;采用自動預(yù)沖命令節(jié)約了預(yù)沖命令所花費(fèi)的時間;采用集中刷新完成了足夠的刷新操作,。通過對上面操作的組合設(shè)計,,能夠很好地完成超長數(shù)據(jù)的突發(fā)讀寫。在設(shè)計中,成功地實(shí)現(xiàn)了突發(fā)長度是1280的數(shù)據(jù)讀寫,,滿足了項(xiàng)目需求,。