胡啟罡 曲明成 吳翔虎
摘 要:如果使用Xilinx公司的Vavido軟件直接用于FPGA開發(fā),則需要進(jìn)行過程繁瑣的圖形化配置,容易出錯(cuò)且不方便新手使用。為了解決這一問題,本文詳細(xì)研究了Vavido軟件中有關(guān)FPGA工程編譯部分的實(shí)現(xiàn)原理,并在Eclipse CDT提供的基礎(chǔ)擴(kuò)展點(diǎn)上針對FPGA工程編寫插件,通過檢索工程目錄,自動(dòng)生成編譯FPGA bit文件的tcl腳本,并以命令行的方式調(diào)用Vavido的相關(guān)功能,完成bit文件的生成。實(shí)現(xiàn)了FPGA工程的建立、編譯和燒寫功能。
關(guān)鍵詞: FPGA;Vavido;Eclipse CDT;tcl腳本生成;bit文件生成
文章編號(hào): 2095-2163(2019)03-0324-04 中圖分類號(hào): TP311 文獻(xiàn)標(biāo)志碼: A
0 引 言
本文是實(shí)驗(yàn)室項(xiàng)目《通用可配置嵌入式軟件集成開發(fā)環(huán)境》中的FPGA部分。該項(xiàng)目涉及到對Xilinx公司ZC706開發(fā)板的調(diào)試工作,其中包含F(xiàn)PGA部分。FPGA,即現(xiàn)場可編程門陣列,過程中,主要使用硬件描述語言(Verilog或VHDL)來完成電路設(shè)計(jì)。
項(xiàng)目的初期,通過使用Xilinx公司的Vavido軟件實(shí)現(xiàn)相關(guān)的操作。但是在設(shè)計(jì)過程中發(fā)現(xiàn),使用Vavido圖形化界面進(jìn)行FPGA開發(fā),需要提供繁瑣的配置,過程復(fù)雜,容易出錯(cuò)且對新手不友好。同時(shí),如果已有外部硬件描述文件,無法方便快捷地生成bit文件。
目前,尚未有一款良好的開源項(xiàng)目能夠支持FPGA的編譯工作,故本文仍在Vavido的基礎(chǔ)上研究其實(shí)現(xiàn)機(jī)制。
其實(shí),Vivado軟件的核心是一個(gè)腳本解釋器,所有操作都附有對應(yīng)的tcl腳本可以調(diào)取執(zhí)行,GUI界面也是將各種腳本命令封裝為圖形化界面。對此,本文研究了Vivado中關(guān)于FPGA部分的tcl腳本,并對其進(jìn)行了抽取集成。
而Eclipse作為一類優(yōu)秀的開源框架,設(shè)計(jì)融入了大量的擴(kuò)展節(jié)點(diǎn)供開發(fā)者集成自定義的功能。本文FPGA部分的功能就是在Eclipse CDT增配的擴(kuò)展點(diǎn)基礎(chǔ)上對Xilinx公司的Vivado設(shè)計(jì)工具進(jìn)行了集成。
在本文中,后臺(tái)采用tcl交互式命令行的模式啟動(dòng)Vivado,調(diào)用Vivado的相關(guān)功能,即調(diào)用Java提供的exe()函數(shù),在cmd命令行中執(zhí)行“vivado –mode tcl tcl_path”指令。tcl_path為該指令需要的參數(shù),即為編譯bit文件所需的tcl腳本的絕對路徑。
1 FPGA工程的建立
在Eclipse CDT的基礎(chǔ)上集成FPGA開發(fā)功能,首先需要能夠建立FPGA工程。FPGA工程是不同于C/Java工程的自定義新工程類型。研究可知,F(xiàn)PGA工程建立的函數(shù)流程則如圖1所示。
由圖1可知,F(xiàn)PGA工程建立的步驟流程可詳述如下。
(1)根據(jù)用戶選擇的產(chǎn)品名,從已集成的硬件配置數(shù)據(jù)中獲取該硬件開發(fā)板的FPGA芯片配置信息。調(diào)用ResourcesPlugin.getWorkspace().getRoot().getProject(projectName)函數(shù)新建工程對象project。
(2)通過ResourcesPlugin.getWorkspace()函數(shù)獲取待建工程所在的工作區(qū)間workspace。
(3)通過workspace.newProjectDescription (project Name)函數(shù)新建待創(chuàng)立工程的描述信息description,參數(shù)為工程名。
(4)通過對description的設(shè)置,主要通過description.setLocation(projectLocation)設(shè)置工程路徑,參數(shù)為創(chuàng)建后工程所在的絕對路徑。
(5)通過調(diào)用函數(shù)project.create(description,null)創(chuàng)建工程。判斷該工程對象是否打開,如果沒有打開,則通過函數(shù)project.open(monitor)打開該工程。
(6)創(chuàng)建FPGA所需的文件夾,包括verilog、xdc、bit、buildTcl、edif、xci等文件夾,并在指定的文件夾下添入相應(yīng)的源代碼文件。
(7) 保存工程配置信息。
研究中,經(jīng)由上述的操作,即可新建出FPGA工程。
2 tcl腳本及bit文件的自動(dòng)生成
2.1 tcl腳本及bit文件的自動(dòng)生成分析
tcl腳本的自動(dòng)生成首先需要添加一個(gè)功能按鈕來提供相關(guān)操作。
在org.eclipse.ui.actionSets擴(kuò)展節(jié)點(diǎn)上,設(shè)計(jì)實(shí)現(xiàn)了一個(gè)生成FPGA bit文件的操作功能按鈕。該按鈕能夠?qū)PGA工程進(jìn)行編譯,包括生成tcl腳本以及根據(jù)該腳本自動(dòng)生成bit文件。需要在plugin.xml中進(jìn)行配置。
研究可得,在擴(kuò)展節(jié)點(diǎn)上創(chuàng)建新按鈕的配置測試代碼可表述如下。
- -
point="org.eclipse.ui.actionSets"> id="Embedded.actionSet1" label="build" visible="true"> class="test.function.FpgaBuildAction" disabledIcon="icons/fpgaBuild.png"> 分析可知,在該xml中,action class屬性指向了該按鈕的功能Java文件,在該文件中,編寫了該按鈕的點(diǎn)擊事件。重寫run函數(shù),定制形成了自己的業(yè)務(wù)操作。 在該按鈕的點(diǎn)擊事件中,設(shè)計(jì)了如下處理內(nèi)容: (1)檢索工程目錄,如果已有bit文件,提示用戶是否重新生成,重新生成,則執(zhí)行第(2)步操作。 (2)檢索工程目錄,如果已有生成bit文件的tcl腳本,則執(zhí)行“vivado -mode batch -source build.tcl”,根據(jù)此腳本生成bit文件。如果沒有tcl腳本,則遞歸遍歷整個(gè)工程,根據(jù)工程所包含的文件,采用模板填充技術(shù)自動(dòng)生成tcl腳本并執(zhí)行。 首先需要規(guī)定出tcl腳本的標(biāo)準(zhǔn)模板,在此基礎(chǔ)上根據(jù)工程包含的文件以及用戶選擇的產(chǎn)品類型做出相應(yīng)修改,自動(dòng)生成tcl腳本文件,tcl腳本文件模板如圖2所示。 (3)執(zhí)行tcl腳本出現(xiàn)錯(cuò)誤,則將報(bào)錯(cuò)信息展示給用戶,用戶可以根據(jù)報(bào)錯(cuò)信息,修改自己的工程文件,也可直接修改tcl腳本,該部分的函數(shù)流程可如圖3所示。在此過程中,工程目錄檢索采用深度優(yōu)先搜索算法。 2.2 tcl腳本的自動(dòng)生成設(shè)計(jì) 本次研究中,相對重要的是tcl腳本的自動(dòng)生成。圖2已經(jīng)給出了tcl腳本的模板。在此基礎(chǔ)上,關(guān)于tcl腳本的自動(dòng)生成算法流程可推演論述如下。 (1)采用深度優(yōu)先搜索算法遍歷工程的工程目錄。 (2)遍歷到文件時(shí),根據(jù)文件的后綴名,判斷文件的類型,填充至模板的相應(yīng)位置。read_vhdl –library是添加vhdl庫文件;read_vhdl是添加vhdl文件;read_verilog是添加verilog文件;read_xdc是添加xdc文件;read_edif是添加網(wǎng)表文件;read_ip是添加xci IP文件。這些指令后面續(xù)接的參數(shù)都是文件所在的絕對路徑。而還有一種glob指令是添加指定目錄下的所有指定后綴名的文件。 (3)文件遍歷完成后,根據(jù)該FPGA工程創(chuàng)建時(shí)所選擇的芯片種類,設(shè)置綜合設(shè)計(jì)中的有關(guān)指標(biāo)參數(shù)。之后就是填充優(yōu)化設(shè)計(jì)、布局、布線等指令。在tcl腳本的末尾再加上bit文件的指令。 至此,研究進(jìn)一步給出tcl腳本自動(dòng)生成的函數(shù)運(yùn)行流程可如圖4所示。 該部分設(shè)計(jì)的按鈕只對FPGA工程有用,點(diǎn)擊該按鈕時(shí),需要判斷當(dāng)前選中工程的類型。但是綜觀本次集成開發(fā)環(huán)境中,除了FPGA的工程類型是自定義的新的工程類型,其它工程類型都是基于C/C++工程或者Java工程的,因此只是根據(jù)工程類型即可判斷是否為FPGA工程。 2.3 tcl腳本的執(zhí)行設(shè)計(jì) 在執(zhí)行tcl腳本時(shí),通過Java的Process類實(shí)現(xiàn)。具體執(zhí)行步驟如下。 (1)通過ProcessBuilder()函數(shù)新建一個(gè)builder對象,參數(shù)為要執(zhí)行的第三方可執(zhí)行程序的絕對路徑。 (2)通過builder.start()執(zhí)行該第三方程序,獲得一個(gè)Process進(jìn)程對象process,process即為打開該第三方程序后的進(jìn)程。 (3)通過process.getOutputStream()獲得該進(jìn)程的輸入流,通過該輸入流執(zhí)行相應(yīng)的指令。指令代碼可參見如下。 new BufferedWriter(new OutputStreamWriter (process.getOutputStream())); //初始化一個(gè)BufferedWriter對象br 之后通過執(zhí)行函數(shù)br.write(cmd),參數(shù)為要執(zhí)行的程序指令,即可通過該輸入流向第三方可執(zhí)行程序發(fā)送指令。 (4)使用WorkspaceJob創(chuàng)建一個(gè)新的線程,用來監(jiān)聽process進(jìn)程的輸出流。 (5)當(dāng)監(jiān)聽線程開始執(zhí)行之后,會(huì)監(jiān)聽第三方可執(zhí)行程序的輸出流。這里使用了一個(gè)while循環(huán),循環(huán)的終止條件就是標(biāo)準(zhǔn)輸出流和錯(cuò)誤輸出流均為空。 (6)當(dāng)標(biāo)準(zhǔn)輸出流和錯(cuò)誤輸出流都為空時(shí),關(guān)閉這2個(gè)輸出流,同時(shí)刷新工程所在的工作區(qū)間。 刷新工程所在的工作區(qū)間的原因在于,在調(diào)用第三方可執(zhí)行程序時(shí),有時(shí)會(huì)產(chǎn)生一個(gè)文件結(jié)果,例如FPGA工程編譯結(jié)束后會(huì)形成一個(gè)bit文件。如果不執(zhí)行刷新操作,則bit文件不會(huì)直接顯示在Eclipse工程目錄下,需要用戶手動(dòng)刷新。因此為了用戶友好性的研究需要,這里就在每次調(diào)用了第三方可執(zhí)行程序后都會(huì)針對工程工作區(qū)間采取自動(dòng)刷新的解決辦法。 Process類調(diào)用第三方程序執(zhí)行,獲得執(zhí)行結(jié)果的通用函數(shù)設(shè)計(jì)流程則如圖5所示。 3 結(jié)果測試 綜合前述的研究設(shè)計(jì)可得,最終的測試效果將如圖6所示。 從控制臺(tái)的輸出可以看出bit文件已被成功生成。 4 結(jié)束語 本文在Eclipse的擴(kuò)展節(jié)點(diǎn)上,研究建立了FPGA工程,同時(shí)提供了一個(gè)功能按鈕,通過深度優(yōu)先搜索算法對工程目錄進(jìn)行遍歷,按照模板填充生成tcl腳本文件,最終通過命令行方式調(diào)用Vivado軟件中的相關(guān)功能,實(shí)現(xiàn)了FPGA bit文件的生成工作。 參考文獻(xiàn) [1]田丹, 林卓, 衛(wèi)進(jìn). 基于Eclipse的嵌入式集成開發(fā)環(huán)境工程管理[J]. 微處理機(jī), 2015(2):29-31,34. [2] 朱娜. 基于Eclipse的嵌入式軟件開發(fā)管理平臺(tái)的研究與實(shí)現(xiàn)[D]. 成都:電子科技大學(xué), 2011. [3] 南方. 基于Eclipse的嵌入式集成開發(fā)環(huán)境分析與設(shè)計(jì)[D]. 西安:西安電子科技大學(xué), 2009. [4] YANG Penghao, WANG Rongliang, FAN Ziguo. Study on debugging method based on embedded system development platform[J]. Advanced Materials Research,2013,2385(694):2646-2650. [5] HE Huiqin. Application research of JTAG standard based on ARM debugging system[J]. Applied Mechanics and Materials,2015,3749(719):522-526. [6] STOLLON N. Multicore Debug[M]// MOYER B. Real world multicore embedded systems. USA: Elsevier Inc,2013:561-602. [7] DAN U C. Software development tools for embedded systems[M]//OSHANA R, KRAELING M. Software engineering for embedded systems-Methods, practical techniques, and applications. USA:Elsevier Inc,2013:511-562.