文獻(xiàn)標(biāo)識(shí)碼: B
文章編號(hào): 0258-7998(2014)03-0006-03
隨著集成電路技術(shù)的進(jìn)一步發(fā)展,FPGA因具備功能靈活、開發(fā)成本低和上市速度快等特點(diǎn),而廣泛應(yīng)用于數(shù)字產(chǎn)品設(shè)計(jì)的各個(gè)領(lǐng)域。目前FPGA配置數(shù)據(jù)一般使用基于靜態(tài)隨機(jī)存儲(chǔ)器SRAM(Static Random Access Memory)的存儲(chǔ)方式,掉電后數(shù)據(jù)消失。因此在實(shí)用中需要為FPGA芯片外加專用配置芯片,在上電時(shí),由這個(gè)專用配置芯片把配置數(shù)據(jù)加載到FPGA中,之后FPGA就可以正常工作。配置芯片通常是基于Flash存儲(chǔ)器的器件。FPGA配置數(shù)據(jù)更新的常用做法是:通過專用的下載電纜把配置數(shù)據(jù)從PC下載到FPGA配置芯片中[1]。這種方法在早期的開發(fā)調(diào)試中顯得非常便利,然而在系統(tǒng)組裝并形成產(chǎn)品后,由于下載電纜接口通常不會(huì)作為系統(tǒng)的一個(gè)外部接口,此時(shí)若想更新FPGA配置數(shù)據(jù)將會(huì)很麻煩,需要把系統(tǒng)重新拆開才能進(jìn)行[2]。因此,在越來越多的系統(tǒng)中希望通過以配置數(shù)據(jù)的遠(yuǎn)程更新來提高系統(tǒng)的可擴(kuò)展性和升級(jí)的靈活性。
本文針對(duì)Altera公司Cyclone IV系列的一款低功耗、高性能的FPGA芯片EP4CE15F23C8,結(jié)合Altera公司提供的SoPC開發(fā)工具,嵌入Nios II軟核處理器技術(shù),移植μClinux系統(tǒng),通過UART(Universal Asynchronous Receiver/Transmitter)串口獲取升級(jí)數(shù)據(jù)(包括FPGA配置文件和μClinux系統(tǒng)鏡像),并在μClinux系統(tǒng)中添加MTD驅(qū)動(dòng)以完成升級(jí)數(shù)據(jù)寫入Flash存儲(chǔ)器的任務(wù)。該方法利用FPGA的軟硬件可編程的特點(diǎn),實(shí)現(xiàn)了系統(tǒng)軟硬件同時(shí)在線升級(jí),完成了FPGA的遠(yuǎn)程更新。
1 FPGA遠(yuǎn)程更新系統(tǒng)的結(jié)構(gòu)與更新流程
1.1 遠(yuǎn)程更新系統(tǒng)的系統(tǒng)結(jié)構(gòu)
FPGA遠(yuǎn)程更新系統(tǒng)的結(jié)構(gòu)如圖1所示,該系統(tǒng)主要包括本地系統(tǒng)和遠(yuǎn)程系統(tǒng)。本地系統(tǒng)包括目標(biāo)板和交換板。
目標(biāo)板的FPGA采用Altera公司Cyclone IV系列的EP4CE15F23C8芯片。該芯片采用65 nm工藝,內(nèi)部包含了15 408個(gè)邏輯單元LE(Logic Elements)、504 KB片內(nèi)隨機(jī)存儲(chǔ)器、56個(gè)嵌入式乘法器、20個(gè)全局時(shí)鐘網(wǎng)絡(luò),具有低功耗、高性能的特點(diǎn)[3]。通過Altera Quartus II軟件中的SoPC Builder工具,在FPGA芯片上構(gòu)建了Nios II軟核處理器、外設(shè)和外設(shè)接口,包括EPCS控制器、SDRAM控制器、三態(tài)橋、UART、通用I/O等[4]。EPCS是Altera提供的專用串行配置芯片,本系統(tǒng)使用EPCS4芯片,它支持多種可配置的時(shí)鐘源,最高支持100 MHz的外部時(shí)鐘源,并且具有4 MB的存儲(chǔ)空間,完全滿足此款FPGA配置數(shù)據(jù)的存儲(chǔ)需要。在本系統(tǒng)中,以Altera Wiki社區(qū)發(fā)布的nios2-linux-20090929.tar內(nèi)核開發(fā)包為基礎(chǔ),在Nios II上移植了μClinux系統(tǒng)[5]。FPGA上還外接了一個(gè)NOR型Flash芯片,用于存儲(chǔ)μClinux系統(tǒng)鏡像。
交換板采用PowerPC的微處理器,運(yùn)行嵌入式Linux系統(tǒng),交換板與FPGA目標(biāo)板間采用UART串口通信方式。
遠(yuǎn)程系統(tǒng)通過網(wǎng)絡(luò)接口與交換板相連,是整個(gè)升級(jí)系統(tǒng)的控制中心。
1.2 遠(yuǎn)程更新流程
FPGA上電啟動(dòng)時(shí),自動(dòng)產(chǎn)生時(shí)序從EPCS中讀取配置文件并進(jìn)行配置。配置完成后,NiosII處理器硬件就已經(jīng)在FPGA內(nèi)部生成,這時(shí)FPGA進(jìn)入主復(fù)位狀態(tài),在內(nèi)部的復(fù)位邏輯作用下,NiosII從其設(shè)定的復(fù)位地址開始執(zhí)行程序。在本系統(tǒng)中設(shè)計(jì)NiosII 處理器上電后從外部Flash開始啟動(dòng)、解壓并加載μClinux的文件系統(tǒng),運(yùn)行相應(yīng)的應(yīng)用程序。因此,F(xiàn)PGA的遠(yuǎn)程更新主要涉及到兩個(gè)文件,分別為FPGA的配置文件和μClinux的系統(tǒng)鏡像。對(duì)于Nios II處理器,完成FPGA的遠(yuǎn)程更新主要需要解決兩個(gè)問題:(1)遠(yuǎn)程更新數(shù)據(jù)的獲??;(2)將配置文件寫入EPCS配置芯片。為了不影響原有系統(tǒng)的運(yùn)行,這兩個(gè)任務(wù)均需在μClinux系統(tǒng)下完成。為此設(shè)計(jì)如下的更新流程。
(1)升級(jí)文件的處理:FPGA的配置文件需在Quartus II軟件的配置文件輸出選項(xiàng)中添加*.rbf (Raw Binary File,原始二進(jìn)制文件)格式輸出,并作MSB到LSB的字節(jié)變換得到*.img文件。在Linux下構(gòu)建μClinux的開發(fā)環(huán)境,通過make交叉編譯生成elf格式的內(nèi)核鏡像文件zImage,并在Nios II Command Shell中運(yùn)行“nios2-elf-objcopy-O binaryzImagezImage.bin”,得到二進(jìn)制格式的μClinux系統(tǒng)鏡像。
(2)升級(jí)文件的傳輸:遠(yuǎn)程控制系統(tǒng)完成升級(jí)文件處理后,通過LAN或Internet發(fā)送給PowerPC交換板,最后由交換板通過UART串口發(fā)送給FPGA目標(biāo)板。
(3)升級(jí)文件的寫入:目標(biāo)板接收升級(jí)文件,完成數(shù)據(jù)校驗(yàn)后將升級(jí)文件寫入相應(yīng)的配置芯片,并在寫入完成后重啟系統(tǒng)。
2 串口文件傳輸?shù)膶?shí)現(xiàn)
2.1 串口文件傳輸協(xié)議
如前所述,F(xiàn)PGA升級(jí)數(shù)據(jù)在交換板與目標(biāo)板之間通過UART串口傳輸,為了順利完成升級(jí)數(shù)據(jù)的傳輸,定義了一種串口文件傳輸協(xié)議。該協(xié)議采用基于幀傳輸?shù)姆绞?,將升?jí)數(shù)據(jù)進(jìn)行分幀發(fā)送,并在傳輸過程中對(duì)單幀進(jìn)行和校驗(yàn)而對(duì)整個(gè)升級(jí)數(shù)據(jù)進(jìn)行CRC校驗(yàn)。相關(guān)的幀包括:控制幀、信息幀和數(shù)據(jù)幀[6]。
2.1.1 控制幀
控制幀由交換板在開始傳輸前發(fā)送給目標(biāo)板,幀內(nèi)容包括控制字(升級(jí)命令)、升級(jí)文件的參數(shù)等信息,其構(gòu)成如圖2所示。其中,文件參數(shù)由升級(jí)文件號(hào)、相應(yīng)的總分幀數(shù)、單幀大小、最后一幀大小及文件的CRC校驗(yàn)碼構(gòu)成。文件1對(duì)應(yīng)為FPGA的配置文件,文件2對(duì)應(yīng)為μClinux的系統(tǒng)鏡像。
2.1.2 信息幀
信息幀由目標(biāo)板反饋給交換板,用于請(qǐng)求分幀數(shù)據(jù)、返回FPGA升級(jí)狀態(tài)等,幀內(nèi)容如圖3所示。
2.1.3 數(shù)據(jù)幀
數(shù)據(jù)幀由交換板發(fā)送給目標(biāo)板,用于完成升級(jí)數(shù)據(jù)的傳輸,幀內(nèi)容包括分幀號(hào)、分幀數(shù)據(jù)等。
在升級(jí)數(shù)據(jù)的傳輸過程中,首先由交換板向目標(biāo)板發(fā)送控制幀,用于通知目標(biāo)板進(jìn)入升級(jí)程序,同時(shí)發(fā)送所需升級(jí)的數(shù)據(jù)類型、分幀幀數(shù)及升級(jí)數(shù)據(jù)的CRC校驗(yàn)碼。目標(biāo)板在接收到升級(jí)控制幀后,啟動(dòng)相應(yīng)的接收程序,并向交換板返回信息幀,用于請(qǐng)求分幀數(shù)據(jù)。目標(biāo)板在接收到幀號(hào)請(qǐng)求信息幀后,開始向目標(biāo)板發(fā)送數(shù)據(jù)幀。在傳輸中如有錯(cuò)幀或漏幀,目標(biāo)板均可重發(fā)請(qǐng)求信息幀,這樣不斷重復(fù)即可完成整個(gè)升級(jí)數(shù)據(jù)的傳輸。
2.2 串口傳輸過程中的數(shù)據(jù)丟失現(xiàn)象
在完成了上述串口傳輸協(xié)議相關(guān)代碼的編寫后,在實(shí)際測(cè)試中卻發(fā)現(xiàn),傳輸過程中會(huì)頻繁發(fā)生數(shù)據(jù)丟失的現(xiàn)象。在分析各種可能原因后,確定為目標(biāo)板的UART串口FIFO深度過低所導(dǎo)致。FIFO緩沖區(qū)的深度直接影響通過UART傳輸數(shù)據(jù)所需的CPU開銷,是影響UART性能的關(guān)鍵因素。FIFO的深度越低,在傳輸過程中就需要越多的CPU中斷,尤其在短時(shí)大數(shù)據(jù)量的傳輸過程中就可能出現(xiàn)CPU無法響應(yīng)中斷而發(fā)生數(shù)據(jù)丟失的現(xiàn)象。
然而Altera的SoPC Builder工具默認(rèn)所添加的UART設(shè)備沒有配帶FIFO,僅有1 B的深度,為此參考Altera Wiki社區(qū)所發(fā)布了帶FIFO的UART組件。這里為FPGA重新配置了FIFOed Uart設(shè)備[7],并將其接收FIFO的深度設(shè)為256 B。
在使用FIFOed Uart設(shè)備并配置相關(guān)的驅(qū)動(dòng)后,串口傳輸過程中的數(shù)據(jù)丟失的問題得以解決。
3 μClinux下Flash的寫入操作
在接收完升級(jí)數(shù)據(jù)后,需要完成升級(jí)數(shù)據(jù)寫入相應(yīng)配置芯片的操作。由于配置芯片是基于Flash的設(shè)備,在μClinux下可以通過調(diào)用內(nèi)存技術(shù)設(shè)備MTD(Memory Technology Device)驅(qū)動(dòng)完成相應(yīng)的寫入操作。MTD驅(qū)動(dòng)是Linux下標(biāo)準(zhǔn)的Flash驅(qū)動(dòng)器,它支持大多數(shù)Flash存儲(chǔ)設(shè)備,兼有功能強(qiáng)大的分區(qū)定義和映像工具。MTD在硬件與內(nèi)核之間提供一個(gè)抽象的接口,可理解為 Flash的設(shè)備驅(qū)動(dòng)程序。通過該接口,可像讀寫普通文件一樣對(duì)Flash設(shè)備進(jìn)行讀寫操作。
Altera Wiki社區(qū)發(fā)布的μClinux基礎(chǔ)開發(fā)包中MTD驅(qū)動(dòng)的分區(qū)配置文件為linux-2.6/arch/nios2/kernel/config.c,根據(jù)相應(yīng)的硬件芯片修改此文件并運(yùn)行“make menuconfig”修改內(nèi)核編譯設(shè)置后,完成MTD驅(qū)動(dòng)的添加[8]。添加驅(qū)動(dòng)成功后,會(huì)在μClinux的dev目錄下生成字符設(shè)備mtd0或塊設(shè)備mtdblock0,通過系統(tǒng)調(diào)用dd命令,“dd if=/tmp/zImage.bin of=/dev/mtdblock0”,即可完成Flash的寫入操作。
在完成升級(jí)數(shù)據(jù)寫入Flash的操作后,還需要對(duì)寫入的數(shù)據(jù)進(jìn)行CRC校驗(yàn),校驗(yàn)完成后即可重啟系統(tǒng),從而完成了整個(gè)FPGA升級(jí)的任務(wù)。
本文介紹了一種基于μClinux的FPGA遠(yuǎn)程更新系統(tǒng)的實(shí)現(xiàn)方法,使用該方法不用打開機(jī)箱即可隨時(shí)更新FPCA配置程序,方便了產(chǎn)品在客戶端維護(hù)升級(jí),具有靈活方便、配置時(shí)間短、易于操作的特點(diǎn)。通過長期的實(shí)際運(yùn)行驗(yàn)證了這種升級(jí)方式的正確性和穩(wěn)定性。另外,雖然本文是針對(duì)Altera公司Cyclone系列的FPGA器件而設(shè)計(jì),但也可適用于Altera其他系列的FPGA器件,故其有一定的通用性,并為其他廠商的FPGA器件的遠(yuǎn)程升級(jí)提供參考。
參考文獻(xiàn)
[1] 李蘭英.Nios II嵌入式軟核SOPC設(shè)計(jì)原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.
[2] 李鵬,蘭正龍.用CPLD和Flash實(shí)現(xiàn)FPGA配置[J].電子技術(shù)應(yīng)用,2006,32(6):101-3.
[3] Altera Conproation.Cyclone IV device data sheet[EB/OL]. (2013-05-01)[2013-10-20].http://www.altera.com.cn/literature/hb/cyclone-iv/cyiv53001.pdf,2012.
[4] Altera Conproation.Cyclone IV device handbook[EB/OL]. (2013-05-01)[2013-10-20].http://www.altera.com.cn/lit erature/hb/cyclone-iv/cyclone4handbook.pdf,2012.
[5] Altera Wiki.Install Nios II Linux[EB/OL].(2013-01-14)[2013-10-20].http://www.alterawiki.com/wiki/Install_Nios_II_Linux,2013.
[6] 王媛媛,劉樹林.基于FPGA的串行通信控制系統(tǒng)的設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2011,30(5):57-59.
[7] Altera Wiki.FIFOed Avalon Uart[EB/OL].(2013-06-11)[2013-10-20].http://www.alterawiki.com/wiki/FIFOed_Avalon_Uart,2012.
[8] Altera Wiki.Memory technology device[EB/OL].(2011-11-07)[2013-10-20].http://www.alterawiki.com/wiki/MTD,2013.