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