文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.181693
中文引用格式: 林天靜,阮翔,劉春. 基于Flash控制器的FPGA在線加載功能設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2019,45(1):88-91.
英文引用格式: Lin Tianjing,Ruan Xiang,Liu Chun. Design of FPGA online loading based on Flash controller[J]. Application of Electronic Technique,2019,45(1):88-91.
0 引言
近些年來,由于其靈活可配置性及成本的降低,現(xiàn)場可編程門陣列(Field Programmable Gate Array,FPGA)在嵌入式系統(tǒng)中應(yīng)用越來越廣泛,不論產(chǎn)品的初期研發(fā)或是后期維護(hù)都不可避免地需要頻繁更新FPGA程序。傳統(tǒng)的JTAG方式更新FPGA程序的方式是通過開發(fā)軟件將需固化的文件寫入Nor Flash器件。當(dāng)系統(tǒng)很復(fù)雜且需要更新的FPGA數(shù)量較多時(shí),JTAG方式更新FPGA程序則費(fèi)時(shí)費(fèi)力且還需拆結(jié)構(gòu)。若在FPGA內(nèi)部通過邏輯代碼搭建一Flash控制器實(shí)現(xiàn)對Flash器件的讀寫操作,即可并行實(shí)現(xiàn)系統(tǒng)內(nèi)每片F(xiàn)PGA對配置文件的在線更新,大大縮短程序固化時(shí)間。本文依托于Xilinx公司的FPGA和Spasion公司的Nor Flash,詳細(xì)介紹了Flash控制器設(shè)計(jì)和在線加載功能的實(shí)現(xiàn)方法。
1 FPGA配置方式
以Xilinx Virtex6 系列FPGA為例,對配置文件的加載方式有串行Flash、并行Flash、JTAG方式等,其中最常用的是并行Flash方式(Byte Peripheral Interface Parallel Flash Mode,BPI),其配置模式如圖1所示。
一種實(shí)際的FPGA與Nor Flash硬線連接方式如圖2所示。
無論是通過JTAG方式還是通過軟件操作實(shí)現(xiàn)程序更新,都是通過控制這些讀寫使能信號及地址線實(shí)現(xiàn)配置文件的寫入,F(xiàn)PGA掉電重啟之后再從Flash取出配置數(shù)據(jù)從而實(shí)現(xiàn)加載。本文提出的FPGA在線更新程序的方式則是通過FPGA控制邏輯驅(qū)動Flash的數(shù)據(jù)和地址,從而為多塊FPGA并行更新程序的實(shí)現(xiàn)提供了前提。
2 Flash控制器設(shè)計(jì)
Flash器件的基本操作包括讀、寫、擦除等,這些操作都是通過向相應(yīng)的命令寄存器寫入特定的指令來實(shí)現(xiàn)的,這些指令的寫入通過操作與FPGA相連的片選信號(ce_n)、寫使能信號(we_n)、讀使能信號(oe_n)、地址總線(addr[23:0])和數(shù)據(jù)總線(dq[15:0])實(shí)現(xiàn)。
以目前市場上常用的Spasion公司的S29GL-P系列Nor Flash為例,通過FPGA實(shí)現(xiàn)的控制器外部接口如圖3所示。
其中,start信號用于啟動控制器模塊對Flash器件實(shí)現(xiàn)讀寫操作,在啟動之前,須先告知Flash配置文件大小和配置文件在Flash存儲空間的首地址;data_req、data_in和rd_data_count信號用于與一前端FIFO實(shí)現(xiàn)數(shù)據(jù)交互,配置文件先緩存到FIFO中,然后由控制器負(fù)責(zé)取出并寫入Flash器件;config_status信號用于指示程序更新是否完成。
該Flash控制器按時(shí)間上的先后順序分別實(shí)現(xiàn)了對Flash器件的讀ID、擦除和寫緩沖操作,下面將分別進(jìn)行簡要敘述。
每次對Flash進(jìn)行基本的讀寫操作之前,會對Flash芯片進(jìn)行讀ID操作以檢驗(yàn)器件的好壞,讀ID涉及的主要操作為向特定寄存器寫入相應(yīng)的解鎖指令,然后再進(jìn)行多操作讀出相應(yīng)的寄存器值,其時(shí)序圖及讀結(jié)果如圖4所示。
確認(rèn)了芯片ID無誤,即可進(jìn)行正確訪問,首先對Flash芯片進(jìn)行擦除操作。Flash芯片擦除可分為兩種:整片擦除和扇區(qū)擦除。由于實(shí)際使用時(shí)并未用到整塊Flash存儲空間,而是根據(jù)配置文件的大小選擇合適的扇區(qū)大小存儲配置文件,所以設(shè)計(jì)中采用的是扇區(qū)擦除方式,時(shí)序如圖5所示。
當(dāng)成功寫入擦除操作指令之后,芯片會進(jìn)入一個(gè)較長的周期等待擦除操作的完成,該期間無法對芯片進(jìn)行復(fù)位之外的其他操作。
完成了擦除操作之后,即可向Flash寫入配置數(shù)據(jù),其對應(yīng)的寫緩沖時(shí)序如圖6所示。
擦除和讀寫的過程中,地址將進(jìn)行自動累加且起始地址可變。Flash的寫操作可為單字寫和緩沖寫兩種,由于緩沖寫最大一次可向Flash寫入32個(gè)字,為了最大化寫入速度,選擇緩沖寫方式;Flash的讀操作分為單字讀和按頁讀兩種,由于Flash讀數(shù)據(jù)速率較高且系統(tǒng)對讀速率沒有太高要求,本文選擇單字讀方式。
3 工程應(yīng)用及性能測試
以一實(shí)際項(xiàng)目工程為例,系統(tǒng)中具有10塊FPGA進(jìn)行程序更新,其在線加載功能系統(tǒng)架構(gòu)如圖7所示。
系統(tǒng)主控CPU運(yùn)行在Linux系統(tǒng)下,CPU通過以太網(wǎng)與遠(yuǎn)程計(jì)算機(jī)進(jìn)行通信調(diào)試,同時(shí)通過PCIE或SRIO高速總線向每塊FPGA下發(fā)配置數(shù)據(jù),最后再由Flash控制器完成數(shù)據(jù)的寫入。如前文所述,一次寫緩沖操作的數(shù)據(jù)量為32個(gè)字,而配置文件的大小有可能不是32個(gè)字的整數(shù)倍,所以還需要應(yīng)用軟件對配置文件進(jìn)行補(bǔ)齊操作。單個(gè)FPGA在線加載流程簡要敘述如圖8所示。
更新單塊FPGA程序時(shí),以一實(shí)際測試的3.47 MB大小的配置文件為例,經(jīng)FPGA在線更新程序固化的時(shí)間和使用ISE14.7軟件JTAG方式固化的時(shí)間如表1所示。
Flash芯片手冊中給出的典型擦除和寫緩沖時(shí)間分別0.5 s和480 μs,則可計(jì)算出理論上3.47 MB大小的文件固化所需的典型時(shí)間約為41 s。由于器件等因素影響,實(shí)測時(shí)用時(shí)往往大于該時(shí)間,但總體來說,使用在線更新方式的耗時(shí)要比用JTAG方式耗時(shí)更少。
而當(dāng)更新系統(tǒng)中的10塊FPGA時(shí),由于每塊FPGA均可同時(shí)進(jìn)行在線更新操作,程序固化所消耗的時(shí)間與單塊FPGA程序更新時(shí)間開銷大致相當(dāng),可見并行在線更新方式相較于傳統(tǒng)JTAG方式無疑可以大大縮短時(shí)間。
4 配置文件不斷電加載和備份方法
每次更新完配置之后,通常做法是對FPGA進(jìn)行斷電重啟實(shí)現(xiàn)重新加載,但工程應(yīng)用時(shí)斷電可能會影響系統(tǒng)其他模塊的正常工作。為使FPGA在不斷電的情況下自動加載更新完的配置程序,可通過配置FPGA芯片的PROGRAM_B信號來實(shí)現(xiàn),BPI模式下的時(shí)序如圖9所示。
考慮到若在配置過程中FPGA發(fā)生斷電等異常,則Flash中的配置文件損壞,F(xiàn)PGA將無法實(shí)現(xiàn)加載,需要重新使用JTAG方式燒寫配置文件。為防止該種情況發(fā)生,可分配Flash的一塊區(qū)域用于備份配置文件,發(fā)生FPGA無法正常加載的異常時(shí),可讀取該備份配置文件實(shí)現(xiàn)FPGA再次正常加載,但前提是該部分Flash存儲空間預(yù)先固化了帶有FPGA在線更新功能的程序。
5 結(jié)論
本文利用FPGA邏輯設(shè)計(jì)了一款Flash控制器,實(shí)現(xiàn)了FPGA在線更新功能,由于FPGA直接操作Flash,因此相比傳統(tǒng)FPGA程序更新方法具有更新速度快、硬件電路精簡、易于系統(tǒng)集成等優(yōu)點(diǎn),同時(shí)能夠?qū)崿F(xiàn)復(fù)雜系統(tǒng)多塊FPGA并行更新程序,大大節(jié)省了程序固化時(shí)間,便于項(xiàng)目前期開發(fā)及后期排故調(diào)試。
參考文獻(xiàn)
[1] Xilinx UG360,Virtex-6 FPGA configuration user guide[EB/OL].[2015-11-18].http://www.xilinx.com.
[2] Spansion.S29GL-P MirrorBit Flash family datasheet[EB/OL].[2009-11-20].http://www.spansion.com.
[3] 于樂,王嘉良.易于移植的FPGA在線更新控制器設(shè)計(jì)[J].航空電子技術(shù),2015(4):47-50.
[4] 楊鵬.基于Linux系統(tǒng)的FPGA芯片在線加載的設(shè)計(jì)和實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2015(6):161-164.
作者信息:
林天靜,阮 翔,劉 春
(中國電子科技集團(tuán)第52研究所,浙江 杭州310000)