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

 仿真結果表明,該控制器可以使得系統對SDRAM的控制非常簡(jiǎn)單、方便。
結束語(yǔ) ---在實(shí)際應用中,使用ALTERA公司的Cyclone FPGA器件進(jìn)行設計,設計輸入采用Verilog來(lái)完成,實(shí)現了上述的SDRAM控制器接口電路。此外,由于采用了參數化設計思想,對特定容量的SDRAM的特定工作模式而言,只要根據其器件參數進(jìn)行設定,該控制器就可以適用特定SDRAM的特定工作模式,具有一定的通用性。 |
評論