摘 要:介紹了SDRAM的特點(diǎn)和工作原理,提出了一種基于FPGA的SDRAM控制器設(shè)計(jì)方法,采用Verilog語言完成的控制器的設(shè)計(jì),可以很方便地對SDRAM進(jìn)行操作??刂破髟诖笕萘繑?shù)據(jù)記錄儀擴(kuò)展緩存得到了很好的應(yīng)用。
關(guān)鍵字:FPGA;SDRAM;Verilog;
1 引 言
在進(jìn)行高速數(shù)據(jù)記錄儀的開發(fā)中,由于硬盤固有的尋道延時(shí),不能實(shí)現(xiàn)外部數(shù)據(jù)實(shí)時(shí)寫入。采用固態(tài)硬盤成本又比較高,所以在設(shè)計(jì)中考慮外加大容量數(shù)據(jù)緩存。在各種隨機(jī)存儲器件中,SRAM的價(jià)格低,設(shè)計(jì)簡單,但容量一般都不大;DDR速度快、容量大,但硬件和軟件設(shè)計(jì)都比較復(fù)雜。SDRAM具價(jià)格低、體積小、速度快、容量大的優(yōu)點(diǎn),是滿足高速數(shù)據(jù)記錄設(shè)計(jì)帶寬的理想器件。但是,與SRAM相比較,SDRAM的控制邏輯復(fù)雜,接口方式與普通的存儲器差異很大。為了解決這個(gè)矛盾,需要設(shè)計(jì)專用的SDRAM控制器,本文中提出了SDRAM控制器的FPGA設(shè)計(jì),F(xiàn)PGA內(nèi)部采用狀態(tài)機(jī)的方式。該設(shè)計(jì)采用了Altera公司的CycloneII系列EP2C35F484C8N作為主控芯片。系統(tǒng)工作時(shí)鐘為75M。
2 SDRAM工作原理簡介
本設(shè)計(jì)采用SDRAM芯片選用Winbond公司的W982516,4M×4BANKS×16BIT,兩片并成32位數(shù)據(jù)總線,突發(fā)讀寫速度可達(dá)到300Mbytes/s。 W982516采用了54引腳的TSOP封裝,工作電壓為3.3V,并且采用同步接口方式(所有的信號都是時(shí)鐘信號的上升沿觸發(fā)),與系統(tǒng)時(shí)鐘同步運(yùn)行。W982516行地址數(shù)目是13,列地址數(shù)目是9。與各種SDRAM一樣,這種SDRAM具有以下幾個(gè)特點(diǎn):(1)采取行列地址復(fù)用原則,SDRAM的地址線在不同的命令下提供不同的地址,行列地址復(fù)用13根地址線。(2)需要定時(shí)刷新。(3)在進(jìn)行讀寫時(shí),需先激活行。換頁讀寫時(shí)要預(yù)充關(guān)閉的行,然后再激活新的行進(jìn)行讀寫。(4)SDRAM正常工作之前配置模式寄存器。SDRAM具有較多的控制命令,具體命令見表1。
[align=center]

表1 SDRAM命令[/align]
解析命令對應(yīng)的Verilog代碼如下:
always @(cmd)
begin
case(cmd)
modeset:begin nCS<=1‘b0; nRAS<=1‘b0; nCAS<=1‘b0; nWE<=1‘b0;end
refr: begin nCS<=1‘b0; nRAS<=1‘b0; nCAS<=1‘b0; nWE<=1‘b1;end
prech: begin nCS<=1‘b0; nRAS<=1‘b0; nCAS<=1‘b1; nWE<=1‘b0;end
actv: begin nCS<=1‘b0; nRAS<=1‘b0; nCAS<=1‘b1; nWE<=1‘b1;end
wrt : begin nCS<=1‘b0; nRAS<=1‘b1; nCAS<=1‘b0; nWE<=1‘b0;end
read: begin nCS<=1‘b0; nRAS<=1‘b1; nCAS<=1‘b0; nWE<=1‘b1;end
nop : begin nCS<=1‘b1; nRAS<=1‘b1; nCAS<=1‘b1; nWE<=1‘b1;end
endcase
end
3 SDRAM控制器的設(shè)計(jì)
3.1 系統(tǒng)設(shè)計(jì)框圖
[align=center]

圖1 系統(tǒng)設(shè)計(jì)框圖[/align]
如圖1,兩片W982516并成32位數(shù)據(jù)總線的SDRAM。外部數(shù)據(jù)總線為32位,F(xiàn)IFO1為外部數(shù)據(jù)的一級緩沖,當(dāng)FIFO1中的數(shù)據(jù)超過512時(shí)(SDRAM中一頁的數(shù)據(jù)量),SDRAM控制器將數(shù)據(jù)從FIFO1中讀出寫入W982516暫存,當(dāng)FIFO2中的數(shù)據(jù)剩余空間大于512時(shí),SDRMA控制器從W982516讀入一頁數(shù)據(jù)寫入FIFO2,硬盤控制器再將FIFO2中的數(shù)據(jù)寫入硬盤。
3.2 SDRAM控制器設(shè)計(jì)
3.2.1 復(fù)位初始化
[align=center]

圖2 SDRAM控制器設(shè)計(jì)框圖[/align]
如圖2,虛框內(nèi)為初始化進(jìn)程,SDRAM在上電后200us,由一個(gè)初始化操作來配置SDRAM的工作模式。在200us之內(nèi)只能給SDRAM發(fā)NOP命令。初始化過程由啟動以下指令流完成:首先由一個(gè)預(yù)充所有BANK指令完成對所有BANK的預(yù)充,然后是八個(gè)周期的自動刷新指令,最后在模式配置指令下完成SDRAM內(nèi)部模式設(shè)置寄存器的配置。模式寄存器指定了突發(fā)長度、突發(fā)類型、CAS延時(shí)等詳細(xì)的信息。為了方便靈活的應(yīng)用,本設(shè)計(jì)中將SDRAM模式寄存器設(shè)置為0x027(突發(fā)長度為整頁,CAS Latency為2)。只有成功的完成初始化過程,SDRAM才可以正常工作。
3.3.2 刷新計(jì)數(shù)模塊
SDRAM要求在64ms之內(nèi)對4096行進(jìn)行刷新,也就是每15.6us刷新一行,由于系統(tǒng)時(shí)鐘周期為13ns,所以刷新計(jì)數(shù)模塊計(jì)數(shù)達(dá)到1170,就需要對SDRAM發(fā)出刷新命令。如圖3,刷新計(jì)數(shù)模塊計(jì)數(shù)到大于等于1170時(shí),比較器輸出上升沿到D觸發(fā)器,D觸發(fā)器輸出高電平發(fā)出刷新請求,SDRAM控制器收到刷新請求后執(zhí)行刷新命令。SDRAM控制器完成刷新命令后發(fā)出刷新應(yīng)答信號將D觸發(fā)器的輸出端清零,同時(shí)將刷新計(jì)數(shù)器清零并重新計(jì)數(shù)。
[align=center]

圖3 刷新模塊[/align]
3.3.3 工作過程
FPGA完成對SDRAM芯片的初始化后,進(jìn)入空閑狀態(tài),然后根據(jù)外部信號做出相應(yīng)的動作,如自動刷新、讀和寫數(shù)據(jù)。如果收到自動刷新請求,則控制器向SDRAM發(fā)出自動刷新命令,自動刷新的優(yōu)先級最高;如果FIFO1中的數(shù)據(jù)超過512個(gè)(如圖1),則首先激活要寫的行,然后再將數(shù)據(jù)寫入SDRAM,最后經(jīng)過預(yù)充電關(guān)閉這一行回到空閑狀態(tài),用一個(gè)寄存器記錄SDRAM里有效數(shù)據(jù)的行數(shù),此時(shí)有效數(shù)據(jù)的行數(shù)加1,行地址加1,寫操作的優(yōu)先級第二;如果FIFO2中的剩余空間超過512個(gè)并且有效數(shù)據(jù)的行數(shù)大于0時(shí)則可執(zhí)行讀操作,同寫操作一樣也需要首先激活要讀的行,然后再將數(shù)據(jù)從SDRAM里讀出寫入到FIFO2,并經(jīng)過預(yù)充電關(guān)閉這一行回到空閑狀態(tài),同時(shí)有效數(shù)據(jù)的行數(shù)減1, 行地址加1,讀操作的優(yōu)先級最低。這樣就設(shè)計(jì)成一個(gè)64Mbytes的大容量循環(huán)緩沖。狀態(tài)機(jī)在空閑時(shí)的狀態(tài)轉(zhuǎn)移代碼如下:
work_idle:
begin
if(refresh)//收到刷新請求,優(yōu)先級最高
work_state <= work_refresh;
else if(ff_halffull)//FIFO1緩沖半滿,先寫SDRAM
work_state <= work_write;
else if((wr_counter>0)&ff_halfempt) //FIFO2緩沖半空,讀SDRAM
work_state <= work_read;
else
work_state <= work_idle;
end
4 總結(jié)
本設(shè)計(jì)已經(jīng)成功運(yùn)用于某型雷達(dá),可記錄大于40Mbytes/s的實(shí)時(shí)雷達(dá)信號。SDRAM控制器工作穩(wěn)定,從而實(shí)現(xiàn)了低成本、大容量、高速度的設(shè)計(jì)目標(biāo)。