文獻(xiàn)標(biāo)識(shí)碼: B
文章編號(hào): 0258-7998(2014)03-0006-03
隨著集成電路技術(shù)的進(jìn)一步發(fā)展,,FPGA因具備功能靈活,、開(kāi)發(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ù)更新的常用做法是:通過(guò)專用的下載電纜把配置數(shù)據(jù)從PC下載到FPGA配置芯片中[1]。這種方法在早期的開(kāi)發(fā)調(diào)試中顯得非常便利,,然而在系統(tǒng)組裝并形成產(chǎn)品后,,由于下載電纜接口通常不會(huì)作為系統(tǒng)的一個(gè)外部接口,此時(shí)若想更新FPGA配置數(shù)據(jù)將會(huì)很麻煩,,需要把系統(tǒng)重新拆開(kāi)才能進(jìn)行[2]。因此,,在越來(lái)越多的系統(tǒng)中希望通過(guò)以配置數(shù)據(jù)的遠(yuǎn)程更新來(lái)提高系統(tǒng)的可擴(kuò)展性和升級(jí)的靈活性,。
本文針對(duì)Altera公司Cyclone IV系列的一款低功耗、高性能的FPGA芯片EP4CE15F23C8,,結(jié)合Altera公司提供的SoPC開(kāi)發(fā)工具,,嵌入Nios II軟核處理器技術(shù),移植μClinux系統(tǒng),,通過(guò)UART(Universal Asynchronous Receiver/Transmitter)串口獲取升級(jí)數(shù)據(jù)(包括FPGA配置文件和μClinux系統(tǒng)鏡像),,并在μClinux系統(tǒng)中添加MTD驅(qū)動(dòng)以完成升級(jí)數(shù)據(jù)寫(xiě)入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],。通過(guò)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)核開(kā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)通過(guò)網(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ù)位地址開(kāi)始執(zhí)行程序,。在本系統(tǒng)中設(shè)計(jì)NiosII 處理器上電后從外部Flash開(kāi)始啟動(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è)問(wèn)題:(1)遠(yuǎn)程更新數(shù)據(jù)的獲取,;(2)將配置文件寫(xiě)入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的開(kāi)發(fā)環(huán)境,通過(guò)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í)文件處理后,,通過(guò)LAN或Internet發(fā)送給PowerPC交換板,,最后由交換板通過(guò)UART串口發(fā)送給FPGA目標(biāo)板。
(3)升級(jí)文件的寫(xiě)入:目標(biāo)板接收升級(jí)文件,,完成數(shù)據(jù)校驗(yàn)后將升級(jí)文件寫(xiě)入相應(yīng)的配置芯片,,并在寫(xiě)入完成后重啟系統(tǒng)。
2 串口文件傳輸?shù)膶?shí)現(xiàn)
2.1 串口文件傳輸協(xié)議
如前所述,,F(xiàn)PGA升級(jí)數(shù)據(jù)在交換板與目標(biāo)板之間通過(guò)UART串口傳輸,,為了順利完成升級(jí)數(shù)據(jù)的傳輸,定義了一種串口文件傳輸協(xié)議,。該協(xié)議采用基于幀傳輸?shù)姆绞剑瑢⑸?jí)數(shù)據(jù)進(jìn)行分幀發(fā)送,,并在傳輸過(guò)程中對(duì)單幀進(jìn)行和校驗(yàn)而對(duì)整個(gè)升級(jí)數(shù)據(jù)進(jìn)行CRC校驗(yàn),。相關(guān)的幀包括:控制幀、信息幀和數(shù)據(jù)幀[6]。
2.1.1 控制幀
控制幀由交換板在開(kāi)始傳輸前發(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ù)的傳輸過(guò)程中,,首先由交換板向目標(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)求信息幀后,,開(kāi)始向目標(biāo)板發(fā)送數(shù)據(jù)幀。在傳輸中如有錯(cuò)幀或漏幀,,目標(biāo)板均可重發(fā)請(qǐng)求信息幀,,這樣不斷重復(fù)即可完成整個(gè)升級(jí)數(shù)據(jù)的傳輸。
2.2 串口傳輸過(guò)程中的數(shù)據(jù)丟失現(xiàn)象
在完成了上述串口傳輸協(xié)議相關(guān)代碼的編寫(xiě)后,,在實(shí)際測(cè)試中卻發(fā)現(xiàn),,傳輸過(guò)程中會(huì)頻繁發(fā)生數(shù)據(jù)丟失的現(xiàn)象。在分析各種可能原因后,,確定為目標(biāo)板的UART串口FIFO深度過(guò)低所導(dǎo)致,。FIFO緩沖區(qū)的深度直接影響通過(guò)UART傳輸數(shù)據(jù)所需的CPU開(kāi)銷,,是影響UART性能的關(guān)鍵因素。FIFO的深度越低,,在傳輸過(guò)程中就需要越多的CPU中斷,,尤其在短時(shí)大數(shù)據(jù)量的傳輸過(guò)程中就可能出現(xiàn)CPU無(wú)法響應(yīng)中斷而發(fā)生數(shù)據(jù)丟失的現(xiàn)象。
然而Altera的SoPC Builder工具默認(rèn)所添加的UART設(shè)備沒(méi)有配帶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)后,串口傳輸過(guò)程中的數(shù)據(jù)丟失的問(wèn)題得以解決,。
3 μClinux下Flash的寫(xiě)入操作
在接收完升級(jí)數(shù)據(jù)后,,需要完成升級(jí)數(shù)據(jù)寫(xiě)入相應(yīng)配置芯片的操作。由于配置芯片是基于Flash的設(shè)備,,在μClinux下可以通過(guò)調(diào)用內(nèi)存技術(shù)設(shè)備MTD(Memory Technology Device)驅(qū)動(dòng)完成相應(yīng)的寫(xiě)入操作,。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)程序,。通過(guò)該接口,,可像讀寫(xiě)普通文件一樣對(duì)Flash設(shè)備進(jìn)行讀寫(xiě)操作。
Altera Wiki社區(qū)發(fā)布的μClinux基礎(chǔ)開(kāi)發(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,,通過(guò)系統(tǒng)調(diào)用dd命令,“dd if=/tmp/zImage.bin of=/dev/mtdblock0”,,即可完成Flash的寫(xiě)入操作,。
在完成升級(jí)數(shù)據(jù)寫(xiě)入Flash的操作后,還需要對(duì)寫(xiě)入的數(shù)據(jù)進(jìn)行CRC校驗(yàn),,校驗(yàn)完成后即可重啟系統(tǒng),,從而完成了整個(gè)FPGA升級(jí)的任務(wù)。
本文介紹了一種基于μClinux的FPGA遠(yuǎn)程更新系統(tǒng)的實(shí)現(xiàn)方法,,使用該方法不用打開(kāi)機(jī)箱即可隨時(shí)更新FPCA配置程序,,方便了產(chǎn)品在客戶端維護(hù)升級(jí),具有靈活方便,、配置時(shí)間短,、易于操作的特點(diǎn),。通過(guò)長(zhǎng)期的實(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] 王媛媛,,劉樹(shù)林.基于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.