洪 偉,安 濤
(船舶重工集團(tuán)公司723所,揚州225001)
信號模擬設(shè)備在雷達(dá)或其他偵察設(shè)備的調(diào)試、測試和檢修過程中發(fā)揮了重要的作用。隨著我軍信息化程度的不斷提高,偵察設(shè)備的種類也越來越多,為了適應(yīng)這種變化,多功能成為信號模擬設(shè)備的一個重要發(fā)展方向。
隨著現(xiàn)場可編程門陣列(FPGA)技術(shù)的發(fā)展及其在信號模擬設(shè)備中的廣泛應(yīng)用,各種信號模擬功能越來越集中于FPGA中實現(xiàn),因此FPGA重配置成為信號模擬設(shè)備多功能化的一個重要手段。本文正是為了滿足這種應(yīng)用需求,設(shè)計并實現(xiàn)了FPGA重配置。
FPGA是目前電子設(shè)備中應(yīng)用非常廣泛的電子器件,其集成度很高,器件密度從數(shù)萬系統(tǒng)門到數(shù)千萬系統(tǒng)門不等,可以完成極其復(fù)雜的時序與組合邏輯電路,適用于高速、高密度的高端數(shù)字邏輯電路設(shè)計。除了一些專用器件采用Flash工藝或反熔絲工藝以外,目前使用的FPGA器件一般是基于靜態(tài)隨機(jī)存儲器(SRAM)工藝的,這種FPGA每次上電后都需要進(jìn)行配置,配置過程就是對FPGA內(nèi)容進(jìn)行編程的過程[1]。
根據(jù)FPGA在配置電路中的角色,配置方式分為聯(lián)合測試行動組(JTAG)方式、主動方式和被動方式3種。JTAG方式一般用于設(shè)計調(diào)試階段,設(shè)計完成后一般使用主動方式或者被動方式進(jìn)行配置。
在主動方式下,配置數(shù)據(jù)存放在外部配置芯片中,上電之后FPGA主動輸出控制信號和同步信號,配置芯片在FPGA的控制下將數(shù)據(jù)發(fā)送到FPGA,完成配置過程。配置數(shù)據(jù)一般使用FPGA廠商提供的軟件工具直接寫入配置芯片。
在被動方式下,配置過程由系統(tǒng)中的其他設(shè)備發(fā)起并控制,配置設(shè)備一般是微處理器、微控制器或者復(fù)雜可編程邏輯器件(CPLD)等。配置數(shù)據(jù)一般存放在連接到配置設(shè)備的存儲器中,需要自行設(shè)計程序?qū)⑵鋵懭氪鎯ζ鞑⑦M(jìn)行管理。
FPGA重配置是利用FPGA可編程的特性,在設(shè)備正常工作期間,通過調(diào)用不同的配置文件對FPGA重新配置以實現(xiàn)特定功能的過程。采用這種方式能夠在不增加或者只增加很少設(shè)備和成本的情況下在單一設(shè)備上實現(xiàn)更多的功能。FPGA的3種配置方式理論上均可用于實現(xiàn)重配置,但是由于被動方式方便靈活,所以在設(shè)計中較常采用。
本設(shè)計中使用的FPGA為Altera公司Stratix II系列中的EP2S90,配置設(shè)備微控制器(MCU)為TI公司的TMS320F2812。Stratix II系列FPGA的被動配置方式根據(jù)接口信號及時序的不同細(xì)分為多種具體模式,包括被動串行(PS)、快速被動并行(FPP)、被動并行同步(PPS)、被動并行異步(PPA)以及被動串行異步(PSA)等。PS方式由于使用的引腳少,便于在各種配置設(shè)備上實現(xiàn),所以本設(shè)計采用這種方式[2]。
使用PS方式首先要正確設(shè)置FPGA芯片上的配置方式選擇引腳 MSEL[3.0],根據(jù)器件手冊要求,這4個引腳狀態(tài)分別為0,0,1,0。
PS方式使用DCLK(配置時鐘)、DATA0(配置數(shù)據(jù))、nCONFIG(配置命令)、nSTATUS(狀態(tài)信號)和CONF_DONE(配置完成指示)5個引腳來完成配置過程。本設(shè)計電路連接如圖1所示,F(xiàn)PGA的5根配置信號線全部連接到MCU的通用輸入輸出(IO)上,MCU通過其IO引腳實現(xiàn)FPGA配置時序。配置數(shù)據(jù)存儲在Flash芯片中,F(xiàn)lash芯片通過串行外圍設(shè)備接口(SPI)接口與MCU連接。
圖1 電路連接框圖
因為重配置是在設(shè)備正常工作的狀態(tài)下進(jìn)行的,因此在電路設(shè)計時必須考慮FPGA的配置過程對設(shè)備中其他電路的影響。FPGA在配置過程中,其IO引腳為高阻,但是因為FPGA的控制信號都是通過電平轉(zhuǎn)換芯片與其他電路相連,所以在FPGA輸出為高阻的狀態(tài)下,電平轉(zhuǎn)換芯片輸入相當(dāng)于懸空,導(dǎo)致其輸出為高電平。對于在FPGA配置期間必須保持低電平的信號需要在電平轉(zhuǎn)換芯片的輸入端增加下拉電阻。
FPGA的配置數(shù)據(jù)如何寫入Flash芯片、在Flash芯片中如何存儲是FPGA重配置設(shè)計中一個重要的部分,它不僅與FPGA和Flash芯片型號相關(guān),還會直接影響軟件設(shè)計的復(fù)雜度。
本設(shè)計使用的Flash芯片為M25P128,其總存儲量為128Mbit,分為64個Sector,每個Sector分為1 024個Page,每個Page包含256個字節(jié)。本設(shè)計將Flash芯片等分為8個子存儲區(qū),每個子存儲區(qū)由8個Sector組成,大小為16Mbit,分別用來存儲不同的FPGA配置數(shù)據(jù)或者其他數(shù)據(jù)。子存儲區(qū)從0到7進(jìn)行編號,這樣只需知道子存儲區(qū)編號,即可計算出每個子存儲區(qū)的起始段地址(等于子存儲區(qū)編號乘8)和起始頁地址(等于子存儲區(qū)編號乘8 192)。
FPGA EP2S90的原始配置數(shù)據(jù)大小約為25.7Mbit,直接使用的話將無法放進(jìn)1個子存儲區(qū)中,因此配置數(shù)據(jù)必須先進(jìn)行壓縮處理,壓縮處理在Altera公司的設(shè)計軟件Quartus II中完成。配置數(shù)據(jù)壓縮之后體積可以減少35%~55%,考慮到FPGA在正常使用中并不會用完所有資源,所以壓縮后的配置數(shù)據(jù)完全可以存儲到一個16Mbit的子存儲區(qū)中。
壓縮之后的配置數(shù)據(jù)大小是字節(jié)的整數(shù)倍但并不固定,根據(jù)FPGA設(shè)計的不同,其大小也不同,為了盡量降低MCU程序的復(fù)雜度和代碼尺寸,本設(shè)計對壓縮后的配置數(shù)據(jù)按照統(tǒng)一的格式進(jìn)行處理。在配置數(shù)據(jù)的前面插入256字節(jié)的數(shù)據(jù)用來存儲描述信息,其前4個字節(jié)用于描述配置文件的大小(單位為字節(jié)),其他字節(jié)根據(jù)需要可以存儲如文件版本、編譯時間等信息,未使用的全部填充0xFF,在配置數(shù)據(jù)的后面添加若干個0xFF,將整個配置數(shù)據(jù)大小湊成256字節(jié)的整數(shù)倍。
因為經(jīng)過處理后的文件大小為256字節(jié)(Page)的整數(shù)倍,所以MCU在數(shù)據(jù)存儲操作中只需要用到并 實 現(xiàn) “sector erase”和 “page program”2 條Flash操作指令,在FPGA配置操作中只需要用到并實現(xiàn)“page read”1條Flash操作指令,降低了程序設(shè)計的復(fù)雜度。
軟件設(shè)計主要是MCU指令處理子程序的設(shè)計,包括數(shù)據(jù)存儲和FPGA配置程序2個部分。
數(shù)據(jù)存儲程序由段擦除指令處理子程序和頁編程指令處理子程序共同構(gòu)成,其執(zhí)行流程如圖2所示。
圖2 數(shù)據(jù)存儲程序流程圖
MCU正常加電初始化后處于等待指令狀態(tài),接收到段擦除指令后,根據(jù)指令中的子存儲區(qū)編號zone計算得到本存儲區(qū)的起始段地址s,并通過串行外設(shè)接口(SPI)向Flash芯片發(fā)出擦除段s的指令,段s擦除完畢后繼續(xù)擦除下一個段,直到本存儲區(qū)8個段都擦除完畢。
在程序返回主程序之前根據(jù)子存儲區(qū)編號zone計算得到本存儲區(qū)的起始頁地址p供頁編程指令處理子程序執(zhí)行時使用。段擦除指令執(zhí)行完畢后告知主控系統(tǒng)并返回主程序,等待執(zhí)行下一條指令。
因為整個配置文件的大小已經(jīng)被預(yù)處理為Page大小的整數(shù)倍,所以頁編程指令處理子程序每次都將收到一個完整Page大小的數(shù)據(jù),MCU只需調(diào)用一次Flash的頁編程指令將數(shù)據(jù)寫入當(dāng)前頁p,然后將p指向下一個Page的起始地址即可。每次執(zhí)行完畢后,告知主控系統(tǒng)并返回主程序,等待執(zhí)行下一條指令。
FPGA配置程序執(zhí)行流程如圖3所示。
圖3 FPGA配置程序流程圖
MCU首先將nCONFIG引腳置0,保持5μs后再置1,由此啟動FPGA配置,等待200μs后查看nSTATUS引腳狀態(tài),如果不等于1,則FPGA沒能進(jìn)入配置狀態(tài),本次配置失敗,MCU告知主控系統(tǒng)本次配置失敗,然后程序返回,等待主控系統(tǒng)下一條指令。如果nSTATUS引腳為1,則表示FPGA已經(jīng)進(jìn)入配置狀態(tài),可以接收外部配置數(shù)據(jù)。
MCU根據(jù)接收指令中的子存儲區(qū)編號計算得到該子存儲區(qū)起始頁地址,先讀取第1個Page的數(shù)據(jù)以獲得該配置文件大小,接著讀取下一個Page的數(shù)據(jù)并寫入MCU緩存區(qū),記錄當(dāng)前有效數(shù)據(jù)個數(shù)N為256個字節(jié),然后通過改變DATA0和DCLK引腳狀態(tài)將1個字節(jié)的數(shù)據(jù)串行發(fā)送給FPGA,并將總配置文件剩余字節(jié)數(shù)Size減1,當(dāng)前緩存區(qū)有效字節(jié)數(shù)N減1。
每發(fā)送1個字節(jié)給FPGA后查看一下nSTATUS引腳狀態(tài),判斷配置過程是否出錯,判斷一下剩余字節(jié)數(shù)是否為0,判斷一下當(dāng)前緩存區(qū)有效數(shù)據(jù)個數(shù)是否為0。如果nSTATUS引腳為0,則配置過程出錯,MCU告知主控系統(tǒng)本次配置失敗,然后程序返回,等待主控系統(tǒng)下一條指令。如果剩余字節(jié)數(shù)為0,則配置數(shù)據(jù)發(fā)送完畢;如果不為0,則需要繼續(xù)寫入數(shù)據(jù)。
如果緩存區(qū)有效數(shù)據(jù)不為0,則繼續(xù)從緩存區(qū)讀取一個字節(jié)數(shù)據(jù)寫入FPGA,如果緩存區(qū)有效數(shù)據(jù)為0,則需要先讀取下一個Page的數(shù)據(jù)寫入緩存區(qū),再從緩存區(qū)讀取一個字節(jié)數(shù)據(jù)寫入FPGA。
所有數(shù)據(jù)都寫入FPGA后,MCU查看CONF_DONE引腳狀態(tài),如果該引腳為1,則表示本次配置成功;否則,本次配置不成功。配置結(jié)束后MCU將結(jié)果告知主控系統(tǒng)并返回主程序,等待主控系統(tǒng)下一條指令。
本文基于EP2S90和TMS320F2812設(shè)計實現(xiàn)了FPGA重配置功能,并已成功應(yīng)用于某型信號模擬設(shè)備中,使得該設(shè)備以較小體積和成本實現(xiàn)了多種功能的集成,競爭力顯著增強,經(jīng)濟(jì)效益明顯。本設(shè)計通用性強,實用性高,未來可以推廣到其他設(shè)備和應(yīng)用中。
[1]王誠,蔡海寧.Altera FPGA/CPLD 設(shè)計(基礎(chǔ)篇)[M].北京:人民郵電出版社,2011.
[2]蘇奎峰,呂強,常天慶.TMS320X281xDSP原理及C程序開發(fā) [M].北京:北京航空航天大學(xué)出版社,2008.