DDR SDRAM在嵌入式系統(tǒng)中的應(yīng)用
引言
很多嵌入式系統(tǒng),特別是應(yīng)用于圖像處理與高速數(shù)據(jù)采集等場合的嵌入式系統(tǒng),都需要高速緩存大量的數(shù)據(jù)。ddr(double data rate,雙數(shù)據(jù)速率)sdram由于其速度快、容量大,而且價格便宜,因此能夠很好地滿足上述場合對大量數(shù)據(jù)緩存的需求。但ddr sdram的接口不能直接與現(xiàn)今的微處理器和dsp的存儲器接口相連,需要在其間插入控制器實現(xiàn)微處理器或dsp對存儲器的控制。
隨著密度與性能的不斷提升,現(xiàn)場可編程門陣列(fpga)已被廣泛應(yīng)用于各種嵌入式系統(tǒng)中。而且,現(xiàn)在很多的fpgas都提供了針對ddr sdram的接口特性:其輸入輸出引腳都與sstl-ⅱ電氣特性兼容,內(nèi)部提供了ddr觸發(fā)器、鎖相環(huán)等硬件資源。使用這些特性,可以更加容易地設(shè)計性能可靠的高速ddr sdram存儲器控制器。
1 ddr sdram 在嵌入式系統(tǒng)中的應(yīng)用
圖1是ddr sdram在高速信號源系統(tǒng)中的應(yīng)用實例。
在該系統(tǒng)中,由fpga的完成各模塊之間的接口控制。fpga接收從前端傳送過來的高速數(shù)字信號,并將其存儲在ddr sdram中;dsp通過fpga讀取ddr中的數(shù)據(jù),處理后再送回到ddr sdram,最后由fpga負責將數(shù)據(jù)分兩路輸出。
該系統(tǒng)對存儲器的要求是能夠高速地存儲大量的數(shù)據(jù),ddr sdram正好能滿足這一要求,此時,fpga是否能對ddr sdram進行有效控制就成為影響系統(tǒng)性能的關(guān)鍵。最后的試驗結(jié)果表明,fpga是能夠勝任這一任務(wù)的。
2 ddr sdram的工作方式
在ddr sdram能夠被存取數(shù)據(jù)之前,需要先對其初始化。該初始化流程是預(yù)先定義好的。不正確的操作將導(dǎo)致無法預(yù)料的結(jié)果。初始化的過程中將設(shè)置ddr sdram的普通模式寄存器和擴展模式寄存器,用來制定ddr sdram的工作方式,這些設(shè)置包括突發(fā)長度、突發(fā)類型、cas潛伏期和工作模式以及擴展模式寄存器中的對ddr sdram內(nèi)部dll的使能與輸出驅(qū)動能力的的設(shè)置。模式寄存器可以被再編程,這時需要ddr sdram的各個區(qū)(bank)處于空閑狀態(tài),從而改變存儲器的工作模式。如果操作正確,對模式寄存器的再編程不會改變存儲器內(nèi)存儲的數(shù)據(jù)。
初始化完全之后,ddr sdram便進入正常的工作狀態(tài),此時便可對存儲器進行讀寫和刷新。ddr sdram在一對差分時鐘(clk與clkn;clk的上升沿與clkn的下降沿的交點被認為是clk的上升沿)的控制下工作。命令(地址和控制信號)在每個時鐘(clk)的上升沿被觸發(fā)。隨著數(shù)據(jù)一起傳送的還包括一個雙向的數(shù)據(jù)選通信號,接收方通過該信號來接收數(shù)據(jù)。dqs作為選通信號在讀周期中由ddr sdram來產(chǎn)生,寫周期中由存儲器控制器來產(chǎn)生。該選通信號與數(shù)據(jù)相關(guān),其作為類似于一個獨立的時鐘,因此也需要滿足相應(yīng)的時序要求。讀周期中,dqs與數(shù)據(jù)是邊沿對齊的;寫周期中,dqs與數(shù)據(jù)是中心對齊的。存儲器輸入的數(shù)據(jù)在dqs的兩個沿都觸發(fā),輸出的數(shù)據(jù)也是以dqs的兩個沿作為參考,同時還要以時鐘clk的兩個沿作為參考。因此,由于接口在時鐘的兩個沿的觸發(fā)下工作。其數(shù)據(jù)寬度(n)是存儲器數(shù)據(jù)寬度(2n)的一半。圖2描述了ddr sdram的工作方式。
對ddr sdram的讀和寫操作是基于突發(fā)的:從一個選定的地址單元開始,連續(xù)存取設(shè)置好長度的地址單元。該長度就是所謂的突發(fā)長度。ddr sdram提供的可編程的讀或?qū)懙耐话l(fā)長度為2,4或8。數(shù)據(jù)的存取以一個激活命令(active command,ras_n low)開始,接著便是讀(cas_n low)或?qū)懀╟as_n low and we_n low)命令。與激活命令一起被觸發(fā)的地址位用來選擇將要存取的區(qū)(bank)和頁(或行);與讀或?qū)懨钜黄鹩|發(fā)的地址位用來選擇突發(fā)存取的起始列單元。使用控制器讀取ddr sdram的仿真波形示意圖如圖2所示。讀命令被觸發(fā)后,數(shù)據(jù)將在1.5-3個時鐘周圍之后出發(fā)在數(shù)據(jù)總線上。這個延遲就是所謂的cas潛伏期(cas latency),即從dram內(nèi)核讀出數(shù)據(jù)到數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上所需要的時間 。cas潛伏期的到小與sdram的速度和存儲器的時鐘頻率有關(guān)。
當要存取一個不同行的地址單元時,需要通過一個預(yù)充電(precharge)操作關(guān)閉當前行。自動刷新(auto-refresh)命令用來周期性地刷新ddr sdram,以保持其內(nèi)部的數(shù)據(jù)不丟失。
3 ddr sdram控制器的設(shè)計
ddr sdram控制器的功能就是初始化ddr sdram;將ddr sdram復(fù)雜的讀寫時序轉(zhuǎn)化為用戶方簡單的讀寫時序,以及將ddr sdram接口的雙時鐘沿數(shù)據(jù)轉(zhuǎn)換為用戶方的單時鐘沿數(shù)據(jù),使用戶像操作普通的ram一樣控制ddr sdram;同時,控制器還要產(chǎn)生周期性的刷新命令來維持ddr sdram內(nèi)的數(shù)據(jù)而不需要用戶的干預(yù)。
3.1 ddr sdram控制器的控制流程
ddr sdram提供了多種命令,整個控制狀態(tài)機非常復(fù)雜。但很多應(yīng)用場合中,并不需要用到所有的命令,因此為了簡化設(shè)計,但同時又兼顧盡可能多的應(yīng)用場合,在控制器的設(shè)計中制定了如下幾種功能:ddr sdram的初始化、可變長度的突發(fā)讀寫,自動刷新功能,預(yù)充電以及模式寄存器的重置(reload)。圖3是控制器整個狀態(tài)轉(zhuǎn)移圖。
系統(tǒng)上電后,ddr sdram處于空閑狀態(tài)(idle),在對存儲器進行讀寫操作之前,需要先對其進行初始化。初始化的過程中,將設(shè)置突發(fā)長度,突發(fā)類型,cas潛伏期等參數(shù)。ddr sdram的初始化有一個固定的步驟,錯誤的操作將導(dǎo)致ddr sdram進入不確定狀態(tài)。在控制器中使用了一個專門的初始化狀態(tài)機來對ddr sdram進行初始化。
初始化完之后便可對ddr sdram進行讀、寫或其他操作。在執(zhí)行讀(寫)命令之前,先要激活(active)將要讀(寫)的行,之后便可對該行進行突發(fā)讀(寫),在控制器的設(shè)計中,所有的讀寫命令都是不帶預(yù)充電的,因此,某一行被激活之后將一直處于激活狀態(tài),直到用戶發(fā)送突發(fā)終止命令,此時控制器將自動產(chǎn)生一個預(yù)充電命令來關(guān)閉當前行。這樣,某一行被激活之后用戶便可進行連續(xù)的突發(fā)讀(寫)操作,從而節(jié)省了每次突發(fā)讀寫所需要的激活時間,提高了系統(tǒng)的數(shù)據(jù)吞吐率。
控制器同時提供了一個自動刷新(auto refresh)計數(shù)器,每隔一定的時間間隔(即ddr sdra的刷新周期,根據(jù)所使用的存儲器而定,可在控制器中設(shè)定),便會產(chǎn)生一個刷新請求,如果此時ddr sdram處于空閑狀態(tài),控制器便會發(fā)生一個自動刷新命令來對ddr sdram進行刷新;如果此時ddr sdram正在進行讀(寫)操作,控制器將會等到當前的讀(寫)操作完全之后再發(fā)送新命令。在刷新過程中,用戶如果有讀(寫)請求,控制器將在當前的刷新周期完成之后再響應(yīng)用戶的請求。
正常的操作過程中,當ddr sdram處于空閑狀態(tài)時,用戶還可以根據(jù)實際的需要來重置存儲器的控制寄存器,重新設(shè)定存儲器的突發(fā)長度、突發(fā)類型、cas潛伏期等參數(shù)。
3.2 控制器數(shù)據(jù)通道的結(jié)構(gòu)
圖4是ddr sdram控制器數(shù)據(jù)通道的結(jié)構(gòu)圖。圖4中完整的顯示了控制器讀和寫數(shù)據(jù)通道上dq與dqs的結(jié)構(gòu)關(guān)系。前面提到過,cyclone系列fpga沒有帶ddr觸發(fā)器的輸入輸出單元,但完全可以用靠近輸入輸出引腳處的邏輯資源來實現(xiàn)ddr觸發(fā)器,而且最后的結(jié)果表明,這種實現(xiàn)方式可以滿足時序要求。
從圖4中也可以看到,控制器內(nèi)部有兩個時鐘,clk和clk_90,兩者之間的相位差為90°。圖中將面向存儲器的時鐘命名為clk。它是clk_90時鐘的90°相位延遲后的信號。clk_90作為系統(tǒng)時鐘來驅(qū)動整個fpga,clk時鐘驅(qū)動存儲器接口路。
3.2.1 dqs相位延遲電路
在讀周期中,ddr sdram處輸出的dq和dqs信號是邊沿對齊的。為了使用dqs作為選通信號來捕獲dq,dqs信號需要在fpga內(nèi)部相對于dq信號作90°的相位延遲。但是這個延遲不能使用鎖相環(huán)(pll)來完成,因為dqs信號不具有時鐘的特性。因此,需要在dqs和數(shù)據(jù)時鐘之間加一個延遲鏈(delay clain),如圖4中所示。
前面提到過,cyclone系列fpga在其dqs輸入引腳上有一個專用的延遲單元,用來使dqs相對于dq信號產(chǎn)生一個90°相移。因此,可以使用該硬核資源來完成對dqs的相移,而不必通過內(nèi)部的邏輯來搭建這樣一個延遲電路,從而可以獲得更好的時序性能。
3.2.2 再同步
讀周期中,從ddr sdram來的數(shù)據(jù)信號首先通過延遲后的dqs鎖存到ddr觸發(fā)器中。為了在fpga內(nèi)部能夠使用該數(shù)據(jù),還要將其同步到fpga內(nèi)部的時鐘域上,這個過程稱為再同步(resynchronization)。如圖4所示,對于前一級dqs延遲后的信號鎖存的數(shù)據(jù)再通過clk_90同步之后才送到內(nèi)部數(shù)據(jù)總線上。
在寫周期中,dqs與dq必須是中心對齊的(center align)。我們用clk_90時鐘觸發(fā)的ddr觸發(fā)器產(chǎn)生dqs信號,因此,為了滿足時序要求,從內(nèi)部來的數(shù)據(jù)通過clk_90時鐘鎖存后再由clk觸發(fā)的ddr觸發(fā)器將其輸出,從而保證dqs與dq是中心對齊的。
4 控制器的實現(xiàn)
該控制器針對16位寬512mb的ddr sdram設(shè)計,在altera公司的quartus ⅱ4.2環(huán)境中采用cyclone系列的fp1c6q240c6來實現(xiàn),總共使用了729個邏輯單元,占fpga可編程邏輯資源的12%,此外還使用了1個鎖相環(huán)(pll)。最后,在modelsim 5.8中對整個工程進行布局-布線后仿真(post-place&route simulation),采用的模型為micron公司的512mb的ddr sdram mt46v32m16的仿真模型,時鐘為133mhz,圖2是控制器讀取ddr sdram的時序仿真波形。
5 結(jié)論
本文給出了一種通過fpga控制將ddr sdram應(yīng)用在嵌入式系統(tǒng)中的方法。設(shè)計中采用altera公司性價比較高的cyclone系列fpga,并充分利用片內(nèi)提供的鎖相環(huán)、ddr觸發(fā)器以及dqs延遲鏈等硬件資源,占用的邏輯資源少。該設(shè)計可以很容易地轉(zhuǎn)移到altera公司其他系列的fpga上,經(jīng)過適當?shù)男薷倪€可以用來控制64位寬的dimm型的ddr
sdram,因此可以很好地應(yīng)用在需求高速度、大容量存儲器的場合中。
評論