武漢輕工大學數學與計算機學院 丁國棟 劉昌華
SDRAM常作為數據緩存應用于高速數據傳輸系統中。目前,許多嵌入式設備的大容量、高速度存儲器都采用SDRAM來實現,大多都是用專用芯片完成其控制,提高了設計成本,而且使系統的電路變得復雜。FPGA因其靈活,實時的特性很好的解決了SDRAM的控制問題,它能很好滿足SDRAM的時序要求。由于SDRAM的工作頻率可以達到100Mhz以上,但圖像數據傳輸速度卻較低,這使SDRAM數據傳輸效率很低,一般會使用多個異步FIFO來實現匹配。這就又需要設計控制部分,每次都這樣顯然太繁瑣。
本文以典型視頻圖像預處理的應用為背景,設計一個FIFO控制器內核,即利用FPGA的片上資源,開辟多路FIFO作為緩存,然后設計一些控制接口當面對不同設計時,只需要靈活搭配就行了。實驗結果表明,該控制器能輪流地從多個緩存端口向SDRAM進行數據存取,充分利用了SDRAM的帶寬,同時可以靈活定制FIFO控制接口,方便不同的設計需要。
SDRAM所有電源引腳必須同時加電,并且所有輸入和電源引腳上電電壓不得超過標稱值0.3V。SDRAM加電完成后應立即對所有BANK進行預充電,然后等待200ms以避免輸出總線上的數據沖突。等待期間要求DQM和CKE保持高電平。等待200ms以后需要發出模式寄存器設置(MRS)命令以初始化模式寄存器,并附加八個自動刷新周期(CBR)以保證后續操作正常。
SDRAM的存儲單元必須要有定時的刷新周期以避免數據丟失。刷新控制器決定刷新的時間間隔,刷新計數器保證每個單元都能被刷新,SDRAM可以采用自動刷新或自刷新。預充作用是對BANK預充電或者關閉已激活的BANK。
SDRAM的基本讀、寫操作需要控制線和地址線相配合地發出一系列命令來完成,先發出BANK激活命令,并鎖存相應的BANK地址和行地址,等待數據出現在數據線上。在讀、寫操作的最后要向SDRAM發出預充電命令,以關閉已經激活的頁。
SDRAM控制器的總體框架如圖1所示,主要包括八塊片上異步FIFO模塊、FIFO控制器模塊、地址產生模塊、SDRAM狀態機模塊、時鐘模塊。其中八塊異步FIFO分為四塊讀,四塊寫;由于SDRAM讀寫數據共用一個數據線所以FIFO控制器模塊主要負責保證同一時間內最多只有一塊FIFO與SDRAM進行數據交換,并且所有異步FIFO都要按序進行,同時給SDRAM狀態機模塊發出指令,其次要保證寫入讀出數據能夠按照設定的length來進行分次準確地進出;地址產生模塊主要是當寫入讀出數據時產生對應的地址,另一個作用就是根據應用需要來靈活分配SDRAM內存的空間及實現數據的靈活讀出;SDRAM狀態機模塊負責接收指令再結合地址線產生SDRAM需要的時序控制信號,如刷新、預充電、讀寫使能、指令應答等;時鐘模塊負責產生異步FIFO,SDRAM和其它系統的時鐘;片上FIFO模塊負責對輸入輸出數據進行緩存,實現設計的跨時鐘域通信;地址產生模塊負責輸入輸出數據的地址的產生,同時根據實際需要來定制不同數量的FIFO,靈活分配SDRAM空間。

圖1 SDRAM控制器結構框架圖
在整個SDRAM控制器設計中最重要的就是片上FIFO的控制,SDRAM狀態機的正確實現,而地址分配則是實現實際應用的關鍵。
控制器狀態機的主要作用就是按照SDRAM物理時序要求,使用cmd信號同時結合地址信號產生正確的控制時序包括上電初始化、數據傳遞等。由于SDRAM的控制比較復雜,具有多種突發(burst)讀、寫方式和工作模式,考慮嵌入式預處理圖像數據特點,其控制僅實現基本的讀、寫、突發、刷新、充電等狀態。控制器狀態轉移圖如圖2所示,上電后對內存芯片進行初始化,初始化結束后,內存條進入Idel狀態,刷新計數器開始工作,每當刷新計數器值減為0,便向內存芯片組發出刷新命令。刷新請求是內存請求,讀和寫操作是外部請求。在Idel狀態中有請求仲裁邏輯,當內部和外部請求同時出現時,優先保證內部請求,狀態轉移至刷新操作。當刷新操作結束時,重新返回Idel狀態,開始響應外部讀寫等請求。響應讀、寫請求后,狀態從Idel轉移到讀、寫狀態。同時讀、寫地址和寫入的數據鎖存至控制器。控制器由讀寫地址解析出CS信號、頁地址、行地址、列地址,等待某個周期后數據寫入或讀出。,芯片初始化結果如圖3所示。

圖2 SDRAM控制器狀態

圖3 SDRAM芯片的初始化
狀態控制模塊主要完成預充電,刷新,工作模式設定,空操作,基本的讀寫等,由于SDRAM沒有單獨的預充電,刷新控制線且地址線也只有一根。所以這些狀態的產生要結合地址控制信號片選信號CS,行地址選通信號RAS_N,列地址選通信號CAS_N,寫使能信號WE_N。
地址信號中BA0和BA1為頁地址選擇信號,A0~A12為地址信號,通過分時復用決定地址是行地址還是列地址。在讀寫操作中,在地址線上依次給出頁地址、行地址、列地址,最終確定存儲單元地址。其中發出讀命令字后要經過CL個工作時鐘后,讀出數據才依次出現在數據總線上。在讀操作的最后,要向SDRAM發出預充電命令,以關閉已經激活的頁。等待tRP時間后,可以開始下一次操作。而發出寫命令字后寫命令可以立即寫入,需寫入的數據依次送到數據線上。在最后一個數據寫入后延遲tWR時間發出預充電命令,關閉已經激活的頁。等待tRP時間后,可以開始下一次操作。
Refresh狀態用于刷新,SDRAM要求有定時刷新。當刷新控制信號有效時,狀態轉向Refresh,同時設置刷新周期數為1。刷新狀態的控制還需要一個計數器,它是一個獨立的進程。刷新計數器的初值由內存芯片要求、內存條個數和控制器工作頻率共同決定。
SDRAM在讀寫操作后要求關閉激活的BANK,而在讀寫操作前要激活要使用的BANK。預充是對BANK預充電或者關閉已激活的BANK。SDRAM既可分別預充特定BANK也可同時作用于所有BANK,設計中對預充操作采用Precharge All對所有BANK進行預充。
給控制器設定不同的起始地址addr、最大地址max_addr及FIFO深度length可以實現不同的用途和功能。在圖像預處理中,如果要分離奇偶場數據,則寫數據時設定為一幀圖像的地址空間,讀數據時用兩個片上FIFO分別讀出一半地址空間數據則可。而在向SDRAM中寫數據時,則根據寫FIFO讀完成標志wr_done來判斷是否已寫入一個FIFO深度。如果wr_done有效,則將rWR1_ADDR加length,直到寫入數據達到設定的最大地址max_addr為止。同理,從SDRAM中讀出數據時,可根據讀FIFO寫完成標志rd_done來判斷是否讀出一個FIFO深度,如果rd_done有效,則rRD1_ADDR加length,直到讀出數據達到設定的最大地址max_addr。這樣就實現了數據在SDRAM里的有序準確進出。不用的FIFO,不對其設定起始地址和最大地址及深度。
片上FIFO實現了數據的異步通信,靈活地控制片上FIFO可以實現不同的功能。
異步FIFO是一個緩沖存儲器件,用于在兩個不同時鐘域之間進行數據交換。數據在一個時鐘域寫入FIFO,然后從另外的時鐘域讀出,并被使用。它解決了不同時鐘域數據的傳輸,給設計帶來了極大的便利,得到了廣泛的應用。本設計中采用的異步FIFO主要是由雙端口存儲器、空滿標志rdempty、wrfull、讀寫數據計數rdusedw、wrusedw、讀寫請求及時鐘、數據輸入和輸出接口組成。寫有效時在寫時鐘下向FIFO依次寫入數據,rdusedw開始加計數,當FIFO中數據存滿時wfull置高,這時寫入使能無效。讀有效時在讀時鐘下向SDRAM依次讀出數據,rdusedw開始減計數數據讀空時rdempty置高,這時讀使能無效。

圖4 寫入數據時狀態圖波形圖
由于異步FIFO工作在不同時鐘領域,其關鍵是如何正確設計空滿判斷邏輯,從而使FIFO不會溢出,不會產生數據丟失。筆者使用讀寫計數rdusedw、wrusedw來判斷何時讀寫。圖4,5為單路異步FIFO的讀寫數據仿真波形。

圖5 讀出數據狀態圖波形圖
由于同一時間只能有一路異步FIFO與SDRAM進行數據交換,在Verilog HDL設計中選擇使用if-else語句進行分路控制。當某路寫FIFO有效時,利用WR_MASK來控制數據進入SDRAM;當某路讀FIFO有效時,利用RD_MASK來控制數據進入FIFO。由于SDRAM只有一根數據線所以該端口必須是inout類型,它需要加個控制信號,作為輸入時要置高阻狀態,否則將導致數據出現紊亂。
寫FIFO的讀使能是由wrusedw信號控制wr_mask和計數使能的相與來實現的,當rd_mask有效時等待SC_CL個周期開始讀出數據。讀FIFO的寫使能則由rdusedw信號控制wr_mask,因為SDRAM的BANK激活命令后必須等待大于RCD時間后發出讀命令字,所以當wr_mask有效時,等待SC_CL+SC_RCD個周期,SDRAM的數據才能開始寫入FIFO中。多路異步FIFO控制流程圖如圖6所示。

圖6 多路異步FIFO控制狀態圖
設計的基本思路就是嵌入多路異步FIFO以方便在不同的應用中靈活的使用。當面臨不同的需求而不需要全部的FIFO時,對不使用的FIFO可以設計一個頂層文件將其直接例化掉,還可以不用做任何處理直接不用其接口就行了。需要使用的只需按正常的要求加載上讀寫時鐘clk,數據dq,分配好地址空間包括起始addr和終止地址max_addr即可,方便易行給后續設計帶來了極大的便利。下面以圖像預處理中分離奇偶場數據的應用為例,說明定制控制的基本流程。
(1)由于控制器有多路的FIFO,所以第一步就要根據設計明確要用幾路讀、寫異步FIFO,其中單路FIFO的使用判斷如圖7。
(2)本例確定要使用一路讀FIFO兩路寫FIFO來實現圖像數據的分離,然后給其加載時鐘,讀、寫使能等控制信號。
(3)接下來就是分配地址空間,它是實現奇偶場分離的關鍵。給將要寫入的數據數據分配一幀像素數據空間,然后給兩路讀分別分配一場數據空間,那么當兩路讀FIFO輸出的數據就是讀入SDRAM中的那幀圖像奇偶場的數據,分配地址空間的示意圖如圖8所示。

圖7 單路FIFO判斷圖

圖8 圖像處理應用頂層
本設計軟件平臺為QuartusII,Modelsim6.5,硬件平臺為友晶DE2_70開發板,PC機一臺。文中詳細分析了SDRAM芯片的特性、SDRAM控制器的時序要求、數據的輸入輸出,針對控制器使用的復雜不便性,集中設計了FIFO控制器部分,使得控制器的使用更加具有通用性。同時SDRAM的控制機制比較復雜,具有多種突發讀寫的工作模式,我們可以根據實際應用中的需求情況來編寫程序,實現基本的讀寫和刷新操作,而不需要顧全到每一種情況,從而降低系統的復雜性。在后續圖像預處理中需要用到SDRAM控制器時,按照第三部分應用控制中講述的方法調用該設計即可。從而實現了高速數據緩存,充分利用了SDRAM的有效帶寬,提高了存取速度,達到實時視頻預處理的要求,而且加快了整體設計的進度。
[1]胡昌順,高嵩,吳春瑜,張文婧.SOC設計中多bits數據跨時鐘域的解決方法[J].遼寧大學學報(自然科學版),2011(1).
[2]徐海銘,程月東.高速異步FIFO設計[J].電子與封裝,2009(6):14-16.
[3]楊海濤,蘇濤,巫幪.基于FPGA的SDRAM控制器的設計和實現[J].電子技術,2007,1:8-12.
[4]Liu Z W,Xie M.An effective AS-FIFO design formultiple asynchronous clock data transmission[C].Proceedings of International Conference on Communications,Circuits and Systems.Piscataway:IEEE Computer Society Press,2008:960-963.
[5]Apperson R W.Yu Z Y,Meeuwsen M J,et al.A scalable dual-clock FIFO for data transfers between arbitrary and haltable clock domains[J].IEEE Transactions on Very Large Scale Integration Systems,2007,15(10):1125-1134.
[6]KennimentDJ.Synchronization and arbitration in digital systems[M].San Francisco Wiley, 2008:14-38.
[7]Wooyoung Jang,David Z.Pan,An SDRAM-aware router for Networks-on-Chip,Proceedings of the 46th Annual Design Automation Conference,July 26-31,2009.
[8]趙丕鳳,徐元欣,趙亮,等.多路讀寫的SDRAM接口設計[J].電子技術應用,28(9):19-23.
[9]夏宇聞.Verilog高級數字系統設計[M].北京:北京航空航天大學出版社,2001.