引言 在基于FPGA的圖象采集顯示系統中,常常需要用到大容量、高速度的存儲器。而在各種隨機存儲器件中,SDRAM的價格低、體積小、速度快、容量大,是比較理想的器件。但SDRAM的控制邏輯比較復雜,對時序要求也十分嚴格,使用很不方便,這就要求有一個專門的控制器,使系統用戶能很方便地操作SDRAM。為此,本文提出了一種基于FPGA的SDRAM控制器的設計方法,并用Verilog給于實現,仿真結果表明通過該方法設計實現的控制器可以在FPGA芯片內組成如圖1所示的SDRAM接口,從而使得系統用戶對SDRAM的操作非常方便。 SDRAM簡介 SDRAM器件的管腳分為控制信號、地址和數據三類。通常一個SDRAM中包含幾個BANK,每個BANK的存儲單元是按行和列尋址的。由于這種特殊的存儲結構,SDRAM有以下幾個工作特性。 ● SDRAM的初始化 SDRAM在上電100~200μs后,必須由一個初始化進程來配置SDRAM的模式寄存器,模式寄存器的值決定著SDRAM的工作模式。 ● 訪問存儲單元 為減少I/O引腳數量,SDRAM復用地址線,所以在讀寫SDRAM時,先由ACTIVE命令激活要讀寫的BANK,并鎖存行地址,然后在讀寫指令有效時鎖存列地址。一旦BANK被激活后只有執行一次預充命令后才能再次激活同一BANK。 ● 刷新和預充 SDRAM的存儲單元可以理解為一個電容,總是傾向于放電,因此必須有定時的刷新周期以避免數據丟失。刷新周期可由(最小刷新周期÷時鐘周期)計算獲得。對BANK預充電或者關閉已激活的BANK,可預充特定BANK也可同時作用于所有BANK,A10、BA0和BA1用于選擇BANK。 ● 操作控制 SDRAM的具體控制命令由一些專用控制引腳和地址線輔助完成。CS、RAS、CAS和WR在時鐘上升沿的狀態決定具體操作動作,地址線和BANK選擇控制線在部分操作動作中作為輔助參數輸入。由于特殊的存儲結構,SDRAM操作指令比較多,不像SRAM一樣只有簡單的讀寫。 SDRAM控制器的設計實現 ● 總體設計框圖和外部接口信號 SDRAM控制器與外部的接口示意圖由圖1給出,控制器右端接口信號均為直接與SDRAM對應管腳相連的信號,此處不做介紹。控制器左端的接口信號為與FPGA相連的系統控制接口信號,其中,CLK133為系統時鐘信號,RESET_N為復位信號,ADDR為系統給出的SDRAM地址信號,DAIN是系統用于寫入SDRAM的數據信號,FPGA_RD和FPGA_WR為系統讀、寫請求信號(1為有效,0為無效),SDRAM_FREE是SDRAM的空閑狀態標示信號(0為空閑,1為忙碌),FDATA_ENABLE是控制器給系統的數據收發指示信號(為0時,無法對SDRAM進行數據收發;為1時,若是系統讀操作,則系統此時可從DAOUT接收SDRAM的數據,若是寫操作,則系統此時可以通過DAIN發送數據給SDRAM)。 SDRAM控制器的結構組成如圖2所示,包括系統控制接口模塊、CMD命令解析模塊、命令響應模塊、數據通路模塊共四個模塊。系統控制接口模塊用于接收系統的控制信號,進而產生不同的CMD命令組合;CMD命令解析模塊用于接收CMD命令并解碼成操作指令;命令響應模塊用于接收操作指令并產生SDRAM的操作動作;數據通路模塊則用于控制數據的有效輸入輸出。 SDRAM控制器設計的狀態機實現原理如圖3所示,包含了9個狀態,其中從Precharge到Mode set為SDRAM上電后的初始化過程,其余狀態為SDRAM的正常讀寫及刷新操作過程。 ● 各模塊的設計 (1) 系統控制接口模塊 該模塊內含了初始化機制和系統指令分析機制。初始化機制不僅要完成對SDRAM的初始化配置,還要完成對控制器的初始化配置,使控制器與外部SDRAM的工作模式一致。其過程如下:由計數器控制在系統上電200μs左右后,先進行SDRAM的初始化配置工作,由一個Precharge all bank指令完成對所有BANK的預充,接著是多個Refresh指令,然后是模式配置指令LOAD_MODE,完成SDRAM的工作模式設置。之后進行控制器的初始化配置工作,先發出指令LOAD_REG1給控制器載入模式字,再發出LOAD_REG2指令載入控制器的刷新計數器值,完成控制器初始化配置。 上述初始化過程結束后,系統指令分析機制才可接收并分析系統的讀寫信號和地址信息,以及從下個模塊反饋回來的CMDACK信號,并產生對應的CMD命令和SADDR地址信息給CMD命令解析模塊。通過程序設置,實現了根據初始化配置的參數來確定在讀寫到特定時刻發出Precharge或者Refresh的CMD指令,從而簡化了系統的控制。而每當收到CMDACK為1時,表示CMD指令已經發出并有效,此時就要發出NOP命令(CMD=000)。要說明的是,SADDR是分時復用的,在初始化載入模式時,SADDR用以傳輸用戶自己定義的模式字內容;而在正常的讀寫期間,SADDR作為地址線傳輸SDRAM所需的行、列和塊地址。此外,系統指令分析機制會根據控制器對SDRAM的操作處于什么樣的狀態,而反饋SDRAM_FREE和FDATA_ENABLE信號給系統用戶。 (2) CMD命令解析模塊 該模塊對CMD指令進行判斷,其結果就是輸出相應的操作指令信號給命令響應模塊。例如,CMD為001時,則會輸出do_read信號為1,CMD為010時,則會輸出do_write信號為1,在同一時刻,只會輸出一種有效的的操作指令。 此外,該模塊內含用以預設某些模式參數的模式寄存器,主要包括三類:第一類是SDRAM模式控制寄存器,在LOAD_MODE指令時,將該寄存器的值送入SDRAM的模式寄存器中,以控制SDRAM的工作模式。第二類是SDRAM控制器的參數寄存器(LOAD_REG1),使得SDRAM控制器的工作方式與外部的SDRAM器件的工作方式匹配。第三類是SDRAM的刷新周期控制寄存器,該寄存器預設用戶定義的自動刷新計數值,用于SDRAM的刷新周期預設。上述三類寄存器的預設值都是系統控制接口模塊在初始化時通過SADDR傳送給來的。 (3) 命令響應模塊 該模塊的作用是根據從CMD命令解析模塊得到的操作指令,做出符合SDRAM讀寫規范的操作動作,來進行用戶期望的操作;給出數據選通信號OE,來控制數據通路模塊(寫操作時OE為1,讀操作時OE為0)。此外,該模塊把系統非復用的地址ADDR處理為SDRAM復用的地址,分時送給SA、BA。程序中地址復用方法為: assign raddr = ADDR[ROWSTART + ROWSIZE -1:ROWSTART] //raddr為行地址 assign caddr = ADDR[COLSTART + COLSIZE -1:COLSTART] //caddr為列地址 assign baddr= ADDR[BANKSTART +`BANKSIZE -1:BANKSTART]//baddr為BANK地址 (ROWSTART、COLSTART、BANKSTART分別為行、列、塊在ADDR中的起始位) 在程序中,WRITEA和READA的CMD指令實際隱含了ACTIVE命令,所以該模塊在收到do_write或do_read指令后,會先進行激活動作,經過初始化配置規定的CAS延遲時間之后再進行讀寫動作。例如初始化時,模式字規定CAS=2,BURST LENGTH=PAGE,則從命令接口模塊收到do_write=1后,會先做出激活動作并給出行地址(發出RAS_N=0,CAS_N=1,WE_N=1,SA=raddr),過2個時鐘延遲后,再做出寫動作并給出列地址(發出RAS_N=1,CAS_N=0,WE_N=0,SA=caddr)。 此外,收到各類操作指令后,該模塊會反饋給CMD命令解析模塊cmdack信號為1,并最終反饋到系統控制接口模塊的CMDACK信號為1,如果沒有收到任何操作指令,則cmdack=0,CMDACK信號為0。 (4) 數據通路模塊 該模塊受OE信號的控制,使數據的進出和相應的操作指令在時序上同步。OE為1時,數據可由DQ腳寫入SDRAM,OE為0時,數據可從SDRAM的DQ腳讀出。 控制器的使用及仿真時序 根據系統設計對SDRAM讀寫要求的不同,對控制器進行簡單的參數修改(主要是初始化時模式內容字的設置),即可使對SDRAM的控制符合自己的要求。該控制器使得系統對SDRAM的操作非常簡單。以寫操作為例,初始化結束后,只要SDRAM空閑,系統就會收到SDRAM_FREE有效信號,此時可以發出FPGA_WR指令,同時給出ADDR地址信息,在收到反饋的FDATA_ENABLE有效后,系統將數據通過DAIN寫到SDRAM中去,即完成寫操作,系統無須關心SDRAM的刷新和預充。仿真時序圖如圖4、圖5和圖6所示,在寫和讀時序中,CAS=2,BURST LENGTH=PAGE,DC表示無關(Don’t care)。 仿真結果表明,該控制器可以使得系統對SDRAM的控制非常簡單、方便。 結束語 在實際應用中,使用ALTERA公司的Cyclone FPGA器件進行設計,設計輸入采用Verilog來完成,實現了上述的SDRAM控制器接口電路。此外,由于采用了參數化設計思想,對特定容量的SDRAM的特定工作模式而言,只要根據其器件參數進行設定,該控制器就可以適用特定SDRAM的特定工作模式,具有一定的通用性。 |