羅明華
(中煤科工集團重慶研究院有限公司,重慶 400039)
多個NIOS程序在EPCS中的存儲及切換運行*
羅明華
(中煤科工集團重慶研究院有限公司,重慶 400039)
針對Altera FPGA,提出了一種在EPCS Flash中存入多個NIOS II嵌入式程序(不同的配置文件和NIOS II應(yīng)用文件)并實現(xiàn)程序間相互切換運行的方法。通過搭建平臺并以兩個嵌入式程序為例,分別分析了它們的配置及引導(dǎo)流程,闡述了程序存儲及切換運行的具體方法,實驗結(jié)果證明了該方法的可行性。該方法使得帶NIOS II軟核的FPGA嵌入式系統(tǒng)在調(diào)試以及應(yīng)用上更加方便靈活,尤其針對系統(tǒng)程序的遠程更新,在不破壞原有程序的基礎(chǔ)上即可完成,大大提升了系統(tǒng)的安全性。
FPGA;NIOS II;EPCS;程序存儲;重配置;程序引導(dǎo)
FPGA(Field Programmable Gate Array,現(xiàn)場可編程門陣列)使用了預(yù)建的邏輯塊和可重新編程布線資源使其具備自定義硬件功能,當(dāng)用戶在重新編譯不同的電路配置時,能夠當(dāng)即呈現(xiàn)全新的特性[1]。尤其是它的嵌入式系統(tǒng)SOPC(System On a Programmable Chip)能夠通過選擇合適的CPU、外設(shè)和存儲接口,以及定制硬件加速器等達到每一個新設(shè)計周期的獨特目標(biāo)[2]。
隨著FPGA嵌入式系統(tǒng)的大規(guī)模應(yīng)用,對程序的變更與維護在所難免,靠編程電纜進行現(xiàn)場的調(diào)試與更新十分不便。在具備通信接口的系統(tǒng)中進行程序的遠程更新是很好的辦法,基本流程是通過通信接口將程序以數(shù)據(jù)流的形式發(fā)送到FPGA中,F(xiàn)PGA使用IAP(In Application Programming,在應(yīng)用編程)的方法將程序燒寫到Flash中,再通過控制RSU(Remore System Update,遠程系統(tǒng)更新IP核)進行FPGA的重配置[3]。而由于EPCS自帶的引導(dǎo)程序只能識別緊隨其后的應(yīng)用程序,所以IAP燒寫程序的同時也將原有基地址上的程序覆蓋掉,而在覆蓋過程中出現(xiàn)任何異常都極易造成原有程序及系統(tǒng)的崩潰[4]。為此,本文擬將第二個嵌入式程序存入到EPCS中未重疊的任何塊上,并自行編寫引導(dǎo)程序,以初始化文件的方式存入到由SOPC建立的ROM中,將CPU的reset地址指向此ROM,通過RSU重配置后CPU即可自動運行引導(dǎo)程序,實現(xiàn)第二個嵌入式程序的引導(dǎo)與運行。
選用Altera公司EP3C16系列的FPGA以及EPCS64串行存儲芯片,搭建如圖1所示的SOPC系統(tǒng)。其中LED1和LED2為硬件直接控制的LED;CPU為32位RISC嵌入式軟核NIOS II處理器;BOOT ROM是SOPC中建立的On-Chip Memory,專門用于引導(dǎo)代碼的存儲;JTAG UART是FPGA與PC間的一個橋梁,用于通信與調(diào)試;KEY與LED為PIO,用于嵌入式系統(tǒng)對外部按鍵和LED3、LED4的輸入輸出控制;EPCS Controller用來控制FPGA和EPCS的數(shù)據(jù)傳輸;SDRAM Controller用于控制外部SDRAM芯片;RSU Controller是Altera提供的遠程更新模塊,起重配置的作用。本系統(tǒng)將在EPCS中存入兩個嵌入式程序,即程序1和程序2,兩個程序間實現(xiàn)互相切換運行,以下將分別以兩個程序為例進行討論。
圖1 系統(tǒng)框圖
2.1 程序1的設(shè)置與燒寫
系統(tǒng)中第一個程序,即上電啟動程序,包含配置數(shù)據(jù)1和應(yīng)用數(shù)據(jù)1。為了實現(xiàn)上電啟動,在SOPC中將CPU的reset地址設(shè)置為EPCS,將exception地址設(shè)置為SDRAM,完成代碼編寫后生成配置文件和NIOS II應(yīng)用文件。
第一個程序在燒寫時,應(yīng)用文件必須緊隨配置文件,使用NIOS II command shell合并文件并燒寫到EPCS,流程如圖2所示。
圖2 程序1燒寫流程圖
2.2 程序1的引導(dǎo)過程
上電后,F(xiàn)PGA首先進入配置過程,配置完成后NIOS II被邏輯中的復(fù)位電路復(fù)位,從reset地址開始執(zhí)行代碼[5]。其中EPCS控制器基地址處有一段ROM存儲區(qū),存放有NIOS II的引導(dǎo)程序,所以NIOS II開始執(zhí)行ROM中的引導(dǎo)程序[6]。引導(dǎo)程序通過讀取EPCS中配置數(shù)據(jù)的頭部信息獲得配置數(shù)據(jù)的總長度,然后跳過配置數(shù)據(jù)直接找到應(yīng)用數(shù)據(jù),這也是應(yīng)用文件必須緊隨配置文件燒寫的原因。隨后引導(dǎo)程序?qū)?yīng)用數(shù)據(jù)搬移到SDRAM中,搬移完成后指針跳轉(zhuǎn)到SDRAM中執(zhí)行剛才搬運過來的NIOS II嵌入式應(yīng)用程序。
3.1 系統(tǒng)的重配置及引導(dǎo)過程
從第一個程序跳轉(zhuǎn)到第二個程序,需要借助RSU Controller來進行重配置,其中RSU控制的配置邏輯如圖3所示。
圖3 RSU控制示意圖
通過設(shè)置RSU的寄存器,可以使FPGA跳轉(zhuǎn)到EPCS中任意塊位置處,并根據(jù)此位置的配置數(shù)據(jù)進行系統(tǒng)的重配置,因此配置數(shù)據(jù)2可以存儲在EPCS中的任意位置處。配置完成后,進入第二個程序應(yīng)用數(shù)據(jù)的引導(dǎo)過程,這個過程無法使用EPCS控制器ROM中自帶的引導(dǎo)程序,而需要自行編寫。引導(dǎo)程序需要完成的任務(wù)是將應(yīng)用數(shù)據(jù)2搬移到SDRAM并跳轉(zhuǎn)指針到SDRAM執(zhí)行相應(yīng)的程序[7]。
圖4 應(yīng)用數(shù)據(jù)存儲示意圖
自行編寫引導(dǎo)程序必須了解數(shù)據(jù)在EPCS中的存儲方式。圖4為本系統(tǒng)中應(yīng)用數(shù)據(jù)2在EPCS中的存儲示意圖,數(shù)據(jù)被分為多個段,每個數(shù)據(jù)段由一個段記錄和段數(shù)據(jù)構(gòu)成,其中數(shù)據(jù)段記錄由8個字節(jié)組成,前4字節(jié)表示本段數(shù)據(jù)的長度,后4字節(jié)表示本段數(shù)據(jù)所要搬運到的目的地址。緊隨段記錄之后的就是本段的有效數(shù)據(jù)。最后的段記錄為跳轉(zhuǎn)記錄,前4字節(jié)均為0x00,表示數(shù)據(jù)的結(jié)尾,后4字節(jié)表示指針?biāo)D(zhuǎn)到的目的地址[8]。按照應(yīng)用數(shù)據(jù)在EPCS的存儲方法,通過相應(yīng)的NIOS II接口函數(shù)即可將應(yīng)用數(shù)據(jù)從EPCS搬移到目的地址并運行。
引導(dǎo)程序?qū)儆趹?yīng)用程序編寫,是在程序2的配置基礎(chǔ)上進行的。要在配置完成后進入引導(dǎo)過程,reset地址需要指向引導(dǎo)程序存儲的位置,由于EPCS中已經(jīng)存儲了程序1的數(shù)據(jù),所以reset地址不能再選擇EPCS,需要選擇另外一個掉電不丟失的存儲單元,即BOOT ROM。它本身是由IP核On-Chip-Memory構(gòu)成的,讓它掉電不丟失的辦法是將編寫的引導(dǎo)程序生成為BOOT ROM的上電初始化.hex文件(其中.text需要映射到BOOT ROM上),然后將初始化文件加載到Quartus中與硬件配置一同編譯,最后生成的.sof配置文件中將自帶BOOT ROM的初始化信息。將帶有初始化信息的配置文件燒寫到EPCS中,當(dāng)FPGA通過RSU選擇它并進行配置跳轉(zhuǎn)時,BOOT ROM將被初始化而存儲引導(dǎo)程序,F(xiàn)PGA在配置完成后即開始運行引導(dǎo)程序。
引導(dǎo)程序有兩個地址需要關(guān)注:一個是應(yīng)用數(shù)據(jù)2在EPCS中的存儲地址,另一個是之前所提到的應(yīng)用數(shù)據(jù)中段記錄地址。第一個地址決定待搬移數(shù)據(jù)在EPCS中的源地址,它可以自行任意設(shè)置,所以應(yīng)用數(shù)據(jù)2可以存儲在EPCS中任意未重疊的位置處。第二個地址決定待搬移數(shù)據(jù)的目的地址,它是由CPU的reset地址所決定的,因此在編譯應(yīng)用程序2時,應(yīng)該將CPU的reset地址由ROOT ROM改為SDRAM。
3.2 程序2的燒寫
如上所述,程序2的配置文件和應(yīng)用文件均可燒寫到EPCS中任意位置,其中應(yīng)用文件也不需要緊隨配置文件燒寫,但由于EPCS中程序的擦除及燒寫都是以塊為單位進行的,所以燒寫的目的地址應(yīng)該為各塊的開始地址。
如圖1中EPCS所示,本系統(tǒng)將配置文件2存放到EPCS偏移量為0x28 0000位置處,由于存在偏移量,所以并不能直接將sof文件轉(zhuǎn)換為flash格式燒寫,具體的燒寫流程如圖5所示。
圖5 配置文件2燒寫流程圖
本系統(tǒng)將應(yīng)用文件2存放到EPCS偏移量為0x50 0000位置處,燒寫流程同上,需要先將elf文件轉(zhuǎn)換為bin格式,再通過在bin2flash命令中加入位置信息- -location=0x50 0000以及使用燒寫命令來實現(xiàn)對EPCS的帶偏移量燒寫。
按上述方法搭建好如圖1所示的SOPC系統(tǒng),程序1和程序2的相關(guān)設(shè)置及功能如表1所列,其中reset表示SOPC中CPU的reset地址,如上方法所述,生成相關(guān)文件并燒寫到EPCS中。
表1 程序1和程序2的相關(guān)設(shè)置及功能
燒寫完畢后,系統(tǒng)重新上電,LED1、LED3將點亮,說明配置1和應(yīng)用1正在運行;按下按鍵,LED1、LED3熄滅,LED2、LED4點亮,說明RSU已經(jīng)控制在0x28 0000位置處進行重配置并通過引導(dǎo)程序啟動了存儲在0x50 0000中的應(yīng)用;再次按下按鍵,重新回到程序1的狀態(tài)。多次按動按鍵,現(xiàn)象來回跳轉(zhuǎn),說明程序1和程序2已經(jīng)同時存儲在EPCS中,并可完成程序間的切換。通過同樣的方法,可以實現(xiàn)更多程序在EPCS中的存儲和切換運行。
[1] 楊海鋼,孫嘉斌,王慰.FPGA器件設(shè)計技術(shù)發(fā)展綜述[J].電子與信息學(xué)報,2010,32(3):714-719.
Method of Storage and Switching Running for Multiple NIOS Programs in EPCS
Luo Minghua
(China Coal Technology Engineering Group Chongqing Research Institute,Chongqing 400039,China)
In the paper,a method for Altera FPGA to store multiple NIOS II embedded programs into EPCS Flash and let them swtich to each other for running is proposed.Taking two embedded programs as the example,the program boot process,the specific method of the two program's storage and switch running are introduced.The experiment results show that the method is feasible.This method makes the FPGA with NIOS II soft core more convinient in program debugging and practical application.Especially for program remote update,it can be completed without destroying the original program,and therefore the security of the system is enhanced greatly.
FPGA;NIOS II;EPCS;program storage;reconfiguration;program boot
省部級-“礦用膠帶機撕裂檢測控制系統(tǒng)研究”;重慶市社會事業(yè)與民生保障專項項目(cstc2015shmszx90007)。
TN791
A