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