黃 勇,盧安軍,王信杰,譚大祝
(湖北民族學(xué)院 信息工程學(xué)院,湖北 恩施 445000)
隨著大規(guī)模集成電路的發(fā)展,F(xiàn)PGA芯片的性能得到了極大的提高,使得以FPGA來(lái)構(gòu)建一個(gè)片上系統(tǒng)成為一種比較好的選擇.在完成這樣一個(gè)系統(tǒng)開(kāi)發(fā)中,常常需要用到存儲(chǔ)容量大、速度快的存儲(chǔ)器,由于SDRAM的價(jià)格低、速度快、存儲(chǔ)容量大,從而成為比較理想的器件.但SDRAM存儲(chǔ)器存在控制邏輯復(fù)雜、接口方式與普通的存儲(chǔ)器有較大差異的問(wèn)題[1-2],因此需要設(shè)計(jì)專(zhuān)門(mén)的SDRAM控制器.本文提出了一種基于Xilinx公司Spartan-3系列的FPGA芯片K4S643232H的SDRAM控制器設(shè)計(jì)方案.
本文采用三星的K4S643232H[3]型號(hào)SDRAM進(jìn)行測(cè)試和仿真、調(diào)試.K4S643232H是容量為2Mbyte的動(dòng)態(tài)同步RAM,由位寬為32的4×512 Kbyte字節(jié)組成.其中列地址7位,塊地址2位,行地址11位,控制命令采用標(biāo)準(zhǔn)的SDRAM控制命令.
SDRAM的控制命令主要包括:模式寄存器設(shè)置命令、激活命令、預(yù)充命令、讀命令、寫(xiě)命令、帶預(yù)充的讀命令、帶預(yù)充的寫(xiě)命令、自動(dòng)刷新命令、自我刷新命令、突發(fā)停命令、空操作命令.SDRAM器件的管腳分為控制信號(hào)、地址和數(shù)據(jù)三類(lèi).控制信號(hào)傳遞讀寫(xiě)控制信息,地址和數(shù)據(jù)線分別傳輸讀寫(xiě)地址和數(shù)據(jù)信號(hào).所有的信號(hào)同步于SDRAM的控制時(shí)鐘,從而實(shí)現(xiàn)了數(shù)據(jù)的同步傳遞.
因?yàn)镾DRAM的結(jié)構(gòu)原因,每間隔一定的時(shí)間就必須對(duì)整個(gè)存儲(chǔ)空間進(jìn)行一次刷新,以保持存儲(chǔ)的數(shù)據(jù).此外,SDRAM尋址采用行激活的方式,首先在控制命令的指導(dǎo)下激活相應(yīng)的行,然后傳遞列地址,在操作完成以后還要關(guān)閉相應(yīng)的行.
根據(jù)輸入命令,SDRAM狀態(tài)在內(nèi)部狀態(tài)間轉(zhuǎn)移.內(nèi)部狀態(tài)包括模式寄存器設(shè)置狀態(tài)、激活狀態(tài)、預(yù)充狀態(tài)、寫(xiě)狀態(tài)、讀狀態(tài)、預(yù)充讀狀態(tài)、預(yù)充寫(xiě)狀態(tài)、自動(dòng)刷新?tīng)顟B(tài)及自我刷新?tīng)顟B(tài).
為了提高控制的效率,本控制器采用簡(jiǎn)潔的接口時(shí)序、狀態(tài)機(jī).控制讀寫(xiě)外部接口僅僅包括write_req、write_en、read_req、read_en以及地址信號(hào)、數(shù)據(jù)信號(hào)、控制信號(hào)[4].當(dāng)外部需要寫(xiě)入數(shù)據(jù)時(shí),即將write_req拉高,SDRAM控制器調(diào)整狀態(tài)機(jī)進(jìn)入寫(xiě)狀態(tài),并將write_en拉高,外部檢測(cè)到write_en為高即傳遞需要寫(xiě)的地址和數(shù)據(jù).同理,完成讀操作.為了防止讀寫(xiě)操作的沖突,可以對(duì)讀寫(xiě)操作設(shè)置優(yōu)先級(jí).如果寫(xiě)優(yōu)先,當(dāng)write_req、read_req同時(shí)為高電平,首先進(jìn)行寫(xiě)操作,只有當(dāng)write_req為低、read_req為低時(shí)才進(jìn)行讀操作.
因?yàn)镾DARM控制器不能自由的換行換塊,在換行讀寫(xiě)、換塊讀寫(xiě)之前必須對(duì)新的行或者塊進(jìn)行激活.如果讓外部模塊調(diào)整不同行、塊地址之間的間隔,會(huì)使控制顯得復(fù)雜繁瑣,為此在SDRAM控制器中加入了特有的地址檢測(cè)模塊.
當(dāng)?shù)刂窓z測(cè)模塊檢測(cè)到讀寫(xiě)地址換行或者換塊時(shí),會(huì)通知狀態(tài)機(jī)停止當(dāng)前的讀寫(xiě)操作,關(guān)閉當(dāng)前的行或者塊,然后激活新的行或者塊.然后進(jìn)入讀寫(xiě)操作.
對(duì)于外部模塊,SDRAM控制器的上述操作是屏蔽的,外部模塊只需要關(guān)心write_en,read_en即可.整體的接口圖如圖1所示.
參照通用的SDRAM控制器,將SDRAM分為時(shí)序狀態(tài)機(jī)、數(shù)據(jù)通道、地址通道、控制命令、接口電路等幾個(gè)部分.以狀態(tài)機(jī)為核心,其他模塊依照不同的狀態(tài)產(chǎn)生相應(yīng)的操作,構(gòu)建SDRAM的模塊,各個(gè)模塊之間的接口如圖2所示.
圖1 整體接口圖 圖2 SDRAM的模塊結(jié)構(gòu)圖Fig.1 The overall interface diagram Fig.2 SDRAM module structure diagram
SDRAM控制器由七個(gè)模塊構(gòu)成[5-6],分別包括100 us的延時(shí)模塊delay_100 us、刷新模塊ref_req、地址控制模addr_channel、命令控制模塊command_output、讀寫(xiě)數(shù)據(jù)控制模塊data_channel、狀態(tài)機(jī)模塊state_machine、接口模塊.如圖3所示.
100 us的延時(shí)模塊delay_100 us完成正常工作之前的100 us的延時(shí)操作,初始狀態(tài)的dly_100 us信號(hào)線為低電平,100 us后置高電平完成100 us的延時(shí).接口模塊如圖3(a)所示.
刷新模塊ref_req為狀態(tài)機(jī)提供必要的刷新信號(hào),每個(gè)65ms/4096的時(shí)間單位,rsf_req信號(hào)線置高電平,狀態(tài)機(jī)檢測(cè)到這個(gè)高電平后進(jìn)入刷新操作狀態(tài),完成刷新操作.刷新模塊如圖3(b)所示.
地址控制模塊addr_channel是SDRAM控制器與SDRAM進(jìn)行地址傳遞的通道,讀狀態(tài)輸出讀地址,寫(xiě)狀態(tài)輸出寫(xiě)地址,地址控制模塊如圖3(c)所示.
命令控制模塊command_output是SDRAM控制器的命令輸出接口,按照不同的狀態(tài),該模塊輸出相應(yīng)的控制命令,控制SDRAM完成不同的操作,命令控制模塊如圖3(d)所示.
讀寫(xiě)數(shù)據(jù)控制模塊data_channel是SDRAM控制器與SDRAM進(jìn)行數(shù)據(jù)交換的通道,ram_data為輸入輸出端口,寫(xiě)狀態(tài)時(shí)向SDRAM輸出數(shù)據(jù),讀狀態(tài)時(shí)從SDRAM中讀取數(shù)據(jù),讀寫(xiě)數(shù)據(jù)控制模塊如圖3(e)所示.
狀態(tài)機(jī)模塊state_machine控制SDRAM工作的狀態(tài),是SDRAM控制器的核心,其他各個(gè)模塊按照狀態(tài)機(jī)模塊state_machine提供的狀態(tài)工作,狀態(tài)模塊如圖3(f)所示.
接口模塊是SDRAM控制與外部進(jìn)行通訊的接口,該模塊將外部的請(qǐng)求和使能信號(hào)轉(zhuǎn)化為SDRAM可執(zhí)行的操作信號(hào),從而實(shí)現(xiàn)SDRAM控制器與外部的信息交流,接口模塊如圖3(g)所示.
(a)100 us的延時(shí)模塊;(b)刷新模塊;(c)地址控制模塊;(d)命令控制模塊;(e)讀寫(xiě)數(shù)據(jù)控制模塊;(f)狀態(tài)機(jī)模塊;(g)接口模塊 圖3 SDRAM控制器各模塊結(jié)構(gòu)圖Fig.3 SDRAM controller every module structure diagram
控制器的狀態(tài)機(jī)包括:初始化狀態(tài)機(jī)、工作狀態(tài)機(jī)[7].初始化狀態(tài)機(jī)由i_start、i_pall、i_aref0、i_aref1、i_aref2、i_mrs組成,分別完成延時(shí)、預(yù)充電、刷新、模式寄存器編輯操作.工作狀態(tài)機(jī)由c_aref、c_end、c_pall、c_idle、c_ract、c_read、c_wact、c_write組成,分別完成自我刷新、預(yù)充電、激活、讀、寫(xiě)操作,其中c_end、c_idle是用來(lái)調(diào)整時(shí)序的中間狀態(tài).
SDRAM在啟動(dòng)之前存在100 us的等待時(shí)間,以保持電壓的穩(wěn)定.當(dāng)電壓穩(wěn)定以后進(jìn)入初始化狀態(tài)機(jī),初始化包括預(yù)充電和若干次的刷新、模式寄存器的設(shè)置.整個(gè)工作流程如圖4所示.
SDRAM初始化完成以后即進(jìn)入空閑狀態(tài),等待外部的寫(xiě)請(qǐng)求或者讀請(qǐng)求、刷新請(qǐng)求.其中刷新請(qǐng)求的優(yōu)先級(jí)最高,寫(xiě)請(qǐng)求次之,讀請(qǐng)求最后.當(dāng)然,各種請(qǐng)求的優(yōu)先級(jí)可以按照要求靈活的改變.整個(gè)工作的時(shí)序狀態(tài)機(jī)如圖5所示.
圖4 工作流程圖 圖5 SDRAM控制器狀態(tài)機(jī) Fig.4 Work flowchart Fig.5 SDRAM controller state machine
每次完成讀寫(xiě)操作之后,SDRAM自動(dòng)進(jìn)入預(yù)充電狀態(tài),關(guān)閉當(dāng)前的行或者塊,再次進(jìn)入空閑狀態(tài),等待下一次請(qǐng)求的到來(lái).
3.2.1 數(shù)據(jù)通道模塊 當(dāng)狀態(tài)機(jī)進(jìn)入c_write狀態(tài)時(shí),輸入輸出的端口線導(dǎo)通,即:assign ram_data = ram_data_selct ? output_ram_data:52'bz;中的ram_data_selct拉高,為寫(xiě)數(shù)據(jù)做好準(zhǔn)備;當(dāng)狀態(tài)機(jī)進(jìn)入c_read狀態(tài)時(shí),輸入輸出雙端口線高阻,為接受讀數(shù)據(jù)做準(zhǔn)備,即:assign ram_data=ram_data_selct?output_ram_data:52'bz;中的ram_data_selct拉低,為讀數(shù)據(jù)做好準(zhǔn)備.
3.2.2 地址通道模塊 地址通道不僅傳輸讀寫(xiě)數(shù)據(jù)的地址,而且傳輸控制命令,模式寄存器的數(shù)據(jù).在i_mrs狀態(tài),數(shù)據(jù)通道傳遞模式寄存器的相關(guān)參數(shù),在c_ract狀態(tài)傳遞讀操作的行地址,在c_read狀態(tài)傳遞讀操作的列地址,在w_ract狀態(tài)傳遞寫(xiě)操作的行地址,在w_read狀態(tài)傳遞寫(xiě)操作的列地址.
3.2.3 命令模塊 在不同的狀態(tài),控制命令不同,也使命令模塊的輸出不同.在i_start、c_end、c_idle時(shí)輸出NOP命令,在i_aref0、i_aref1、i_aref2、c_pall狀態(tài)時(shí)輸出自刷新命令,在c_ract、c_read、c_wact、c_write狀態(tài)分別輸出激活、讀命令、激活、寫(xiě)命令.
采用三星SDRAM的verilog模型[8]進(jìn)行功能仿真、時(shí)序仿真,仿真模型的部分程序如下:
ifdef CS2_CKE2
ifdef DPD_PIN
module sdram(clk, cs0b, cs1b, cke0, cke1, ba, ad, rasb, casb, web, dqm, dqi, dpdb);
else
module sdram(clk, cs0b, cs1b, cke0, cke1, ba, ad, rasb, casb, web, dqm, dqi);
endif
采用sdram(clk, cs0b, cs1b, cke0, cke1, ba, ad, rasb, casb, web, dqm, dqi);因?yàn)樵陔娐钒迳弦呀?jīng)將dpdb全部拉低.
經(jīng)過(guò)modelsim功能仿真[9-10]后的結(jié)果完全正確,仿真波形圖如圖6所示.
(a)SDRAM控制器初始化;(b)SDRAM控制器換行;(c)寫(xiě)操作的數(shù)據(jù);(d)讀操作的數(shù)據(jù);(e)讀寫(xiě)之間的切換 圖6 仿真波形圖Fig.6 The Simulation waveform
SDRAM能順利的完成讀寫(xiě)、刷新和預(yù)充電,行與行、塊與塊之間的交換平穩(wěn)迅速,無(wú)論是連續(xù)讀寫(xiě)還是單個(gè)的操作都非常的順暢.如果讀寫(xiě)請(qǐng)求的時(shí)序安排合理,按照SDRAM讀寫(xiě)的效率計(jì)算公式:
其中有256個(gè)時(shí)鐘周期,則連續(xù)讀寫(xiě)時(shí)間為256;換行時(shí)間包括:c_end、c_pall、c_idle、c_wact/c_ract,總共需要10個(gè)時(shí)鐘周期;SDRAM每個(gè)64ms刷新一次,采用的時(shí)鐘為125 MHZ,SDRAM行地址為4096,則總的刷新時(shí)鐘數(shù)為:64 ms/(8 ns*4096)= 1930,所以刷新間隔為1930;刷新操作包括:c_end、c_pall、c_idle、c_ref、c_wact/c_ract,總共需要18個(gè)周期,即刷新操作時(shí)間為18.從仿真結(jié)果可知本SDRAM的最高效率可以達(dá)到90%以上.先將連續(xù)增加的數(shù)據(jù)寫(xiě)到SDRAM的儲(chǔ)存空間,然后從相應(yīng)的存儲(chǔ)空間讀取數(shù)據(jù),輸入數(shù)據(jù)與輸出數(shù)據(jù)應(yīng)當(dāng)相等,實(shí)際的仿真結(jié)果如所圖6(b)所示.
下面是三段modelsim時(shí)序仿真的結(jié)果:
第一段:讀寫(xiě)之間的切換
# >> write (D Bank) at 351430.0 ns
# >> precharge (A,B,C, and D bank) at 351486.0 ns
# >> active (A Bank) at 351518.0 ns
# >> write (A Bank) at 351542.0 ns
當(dāng)寫(xiě)地址要換塊時(shí),先停止當(dāng)前的寫(xiě)狀態(tài),然后進(jìn)入預(yù)充電狀態(tài)(precharge),關(guān)閉所有的塊(A,B,C, and D bank),最后再次激活新的塊(active (A Bank)),并再次進(jìn)入寫(xiě)狀態(tài),重新寫(xiě)下一個(gè)塊的數(shù)據(jù).
第二段:讀過(guò)程中換塊
# >> read (B Bank) at 311190.0 ns
# >> precharge (A,B,C, and D bank) at 311246.0 ns
# >> active (C Bank) at 311278.0 ns
# >> read (C Bank) at 311302.0 ns
當(dāng)讀地址要換塊時(shí),先停止當(dāng)前的讀狀態(tài),然后進(jìn)入預(yù)充電狀態(tài)(precharge),關(guān)閉所有的塊(A,B,C, and D bank),最后再次激活新的塊(active (A Bank)),并再次進(jìn)入讀狀態(tài),重新讀下一個(gè)塊的數(shù)據(jù).
第三段:寫(xiě)過(guò)程中自我刷新
# >> write (D Bank) at 349518.0 ns
# >> precharge (A,B,C, and D bank) at 349574.0 ns
# >> auto refresh at 349606.0 ns
# >> active (D Bank) at 349678.0 ns
# >> write (D Bank) at 349702.0 ns
當(dāng)SDRAM需要自我刷新時(shí),停止當(dāng)前的狀態(tài),然后進(jìn)入預(yù)充電狀態(tài)(precharge),關(guān)閉所有的塊(A,B,C, and D bank),最后進(jìn)入自我刷新?tīng)顟B(tài)(auto refresh),刷新完成以后再次回到以前的讀寫(xiě)狀態(tài).
可以發(fā)現(xiàn)SDRAM順利地完成了相應(yīng)的操作:如讀操作、寫(xiě)操作、自我刷新、換塊、讀寫(xiě)之間的切換、預(yù)充電、激活等.
本控制器采用簡(jiǎn)化的接口電路,讀寫(xiě)控制方便,為了配合本控制器的操作可以編寫(xiě)相應(yīng)的讀寫(xiě)地址模塊.從仿真結(jié)果可以看出,在讀寫(xiě)操作和換行換塊的過(guò)程中,有幾個(gè)時(shí)鐘周期的空白命令,
在充分考慮螞蟻群算法計(jì)算代價(jià)大、容易早熟收斂的缺點(diǎn),利用非線性單純形算法局部搜索能力強(qiáng)的的特點(diǎn),將兩者合理融合,設(shè)計(jì)單純形蟻群算法,通過(guò)標(biāo)準(zhǔn)函數(shù)測(cè)試表明該算法較一般蟻群算法較好.并且應(yīng)用該算法解決了大規(guī)模垃圾站運(yùn)輸問(wèn)題.
[1] Dorigo M,Di Caro G,Gambardella L M.Ant algorithms for discrete optimization[J].Artificial Life,1999,5(2):137-172.
[2] Dorigo M.Optimization,learning and natural algorithms[D].Department of Electronics,Politecnico diMilano,Italy,1992.
[3] 吳啟迪,汪鐳.智能蟻群算法及應(yīng)用[M].上海:上??萍冀逃霭嫔纾?006.
[4] 段海濱,王道波,朱家強(qiáng),等.蟻群算法理論及應(yīng)用研究進(jìn)展[J].控制與決策,2004,19(12):1321-1326,1340.
[5] 段海濱,王道波,于秀芬.蟻群算法的研究現(xiàn)在及其展望[J].中國(guó)工程科學(xué),2007,9(2):99-101.
[6] 向長(zhǎng)城,黃席樾,楊祖元,等.小生境粒子群優(yōu)化算法[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(15):41-43.
[7] 劉云忠,宣慧玉.螞蟻算法在車(chē)輛路徑問(wèn)題中的應(yīng)用研究[J].信息與控制,2004,33(2):249-252.
[8] 崔雪麗,馬良,范炳全.車(chē)輛路徑問(wèn)題(VRP)的螞蟻搜索算法[J].系統(tǒng)工程學(xué),2004,19(4):418-422.
[9] 中南大學(xué)數(shù)學(xué)建模網(wǎng)站資料下載[EB/OL].(2009-08)[2011-07-26].http://mcm.csu.edu.cn/resource/show resouce.aspx?resouceid=105.