引言
PicoBlaze是Xilinx公司為Virtex、Spartan系列FPGA和CoolRunnerII系列CPLD設計的8位嵌入式處理器軟核。PicoBlaze嵌入式處理器具有高達44~100 MIPS的指令執(zhí)行速度,并具有效率高、占用資源少等優(yōu)點,可以方便地嵌入到硬件系統(tǒng)設計中,實現(xiàn)與其他功能模塊的無縫連接[1],在FPGA嵌入式系統(tǒng)中具有廣泛的應用。傳統(tǒng)的PicoBlaze項目調試方法通常將PicoBlaze的匯編程序編譯后,與FPGA相關邏輯綜合、實現(xiàn),然后下載到電路板上進行板級驗證,往往要花費大量時間,效率低下。本文介紹了一種基于pBlazIDE的PicoBlaze匯編程序仿真調試方法,并對基于JTAG Loader的PicoBlaze程序快速更新方法進行了詳細分析。實踐證明,該方法簡便可行、效率較高,大大加快了PicoBlaze項目的調試進度。
1 pBlazIDE仿真調試工具
pBlazIDE是一款免費的圖形化仿真調試工具,只有1?45 MB,無需安裝即可使用[1],非常適合于PicoBlaze匯編程序的前期仿真驗證。pBlazIDE具有以下功能:
◆ 按語法分色高亮顯示代碼;
◆ 指令集仿真器,可設置斷點,并可查看寄存器和存儲器內容;
◆ 源代碼格式化;
◆ KCPSM3到pBlazIDE導入功能,并自動完成語法轉換;
◆ 支持語法分色高亮顯示HTML文件輸出。
pBlazIDE仿真調試工具窗口布局如圖1所示。pBlaz?IDE仿真調試工具窗口布局為標準的Windows界面,主要包括菜單欄、工具欄、代碼區(qū)、I/O端口欄、PicoBlaze處理器狀態(tài)欄、暫存RAM欄、輸出狀態(tài)區(qū)和系統(tǒng)狀態(tài)欄。其中,I/O端口欄和暫存RAM欄只有在程序中使用了I/O端口和暫存RAM時才顯示,平時默認為不顯示狀態(tài)。PicoBlaze處理器狀態(tài)欄顯示程序運行過程中PicoBlaze的寄存器值和標志位狀態(tài),輸出狀態(tài)區(qū)顯示程序編譯和運行信息,系統(tǒng)狀態(tài)欄顯示內容包括程序運行時間、當前PC值、當前堆棧指針和堆棧值等。
圖1 pBlazIDE仿真調試工具
pBlazIDE與標準的KCPSM3語法相比,除中斷處理和其他少量語句外,大部分均相同。在導入KCPSM3程序時,pBlazIDE會自動完成語法轉換,無需人工干預。必須注意的是,pBlazIDE對KCPSM3語法中I/O端口的定義不會自動轉換,必須手動修改,否則編譯時會報錯。例如,KCPSM3語法中輸出端口定義LED EQU 1應修改為LED DSOUT 1,輸入端口和雙向口的定義與此類似。
pBlazIDE仿真調試步驟如下:
① 打開pBlazIDE仿真調試工具,在Settings里選擇合適的Picoblaze 類型,對于Spartan3、VirtexII或VirtexII Pro系列FPGA選擇Picoblaze 3即可。另外,還需在Settings→Options中設置軟核的系統(tǒng)時鐘,以便pBlazIDE顯示程序精確運行時間。
② 點擊File→Import命令,導入KCPSM3語法格式的.psm源文件,pBlazIDE會自動完成語法轉換。
③ 手動修改I/O端口定義,以滿足pBlazIDE語法要求。
④ 單擊Assemble&Simulate按鈕,對程序進行匯編,如果程序沒有錯誤,即可開始仿真。仿真既可以全速運行,也可以單步運行,并可設置斷點等,大部分功能與常用的單片機開發(fā)軟件Keil 51類似。在仿真過程中,可以查看或修改寄存器和存儲器內容,監(jiān)測I/O輸出是否與預期結果相符,設置輸入端口值和模擬端口輸入;另外,還可以對外部中斷進行模擬仿真,極大地方便了用戶程序調試。
2 PicoBlaze程序快速更新方法
PicoBlaze軟核編譯后的程序存儲在FPGA中的BRAM單元中,在調試基于PicoBlaze的項目時,若采用傳統(tǒng)的調試方法,那么每次改變PicoBlaze的匯編程序時都要重新綜合、布局布線,生成新的比特文件,往往需要幾分鐘到十幾分鐘,耗時耗力;而采用JTAG Loader進行調試則無需重新綜合、布局布線,可通過JTAG接口直接修改PicoBlaze的程序BRAM,只需幾秒即可完成,大大加快了調試進度[2]。JTAG Loader程序更新接口示意圖如圖2所示。
圖2 JTAG Loader程序更新接口示意圖
由圖2可知,JTAG Loader通過JTAG接口直接修改程序BRAM,達到更新PicoBlaze程序的目的。整個過程簡便迅速,并且Xilinx公司提供了相應的JTAG_Loader_ROM_form.vhd模板和批處理文件,用戶在初次使用時設置好相關參數(shù)后,只需運行批處理文件即可實現(xiàn)PicoBlaze程序的一鍵更新。JTAG Loader的使用步驟如下:
① 將JTAG_Loader_ROM_form.vhd重命名為ROM_form.vhd,并替換原工程目錄下的ROM_form.vhd。
② 用kcpsm3.exe重新編譯程序。
③ 將程序ROM的reset端連接到PicoBlaze的復位端。
④ 將JTAG Loader文件夾下的hex2svf.exe、hex2svfsetup.exe、playxsvf.exe、svf2xsvf.exe和jtag_loader.bat復制到工程目錄下。
⑤ 編輯jtag_loader.bat文件。
(a) 并口下載電纜方式。打開jtag_loader.bat文件,輸入下列內容:
if exist .\hex2svf.cnf goto one
echo Need to set up jtag chain first
hex2svfsetup.exe
echo jtag chain set up
pause
:one
hex2svf %1.hex %1.svf
svf2xsvf ?d ?i %1.svf ?o %1.xsvf
playxsvf %1.xsvf
將jtag_loader.bat中的1%替換為.psm的文件名,例如led.psm,則將1%替換為led。
(b) USB下載電纜方式。打開jtag_loader.bat文件,輸入下列內容:
if exist .\hex2svf.cnf goto one
echo Need to set up jtag chain first
hex2svfsetup.exe
echo jtag chain set up
pause
:one
hex2svf %1.hex %1.svf
svf2xsvf ?d ?i %1.svf ?o %1.xsvf
@echo setMode ?bscan﹥﹥impact_batch_commands.cmd
@echo setCable ?port usb21 ?baud ?1﹥﹥impact_batch_commands.cmd
@echo addDevice ?position 1 ?file .\%1.xsvf﹥﹥impact_batch_commands.cmd
@echo play﹥﹥impact_batch_commands.cmd
@echo quit﹥﹥impact_batch_commands.cmd
impact ?batch impact_batch_commands.cmd
將jtag_loader.bat中的1%替換為.psm的文件名,例如led.psm,則將1%替換為led即可。
⑥ 運行jtag_loader.bat,按提示進行即可實現(xiàn)程序更新。值得注意的是,第一次運行jtag_loader.bat時,需輸入IR_Length參數(shù),該參數(shù)可以在ISE安裝目錄下查到,如:D:\Xilinx\10.1\ISE\acecf\data\xccace.bsd文件中的attribute INSTRUCTION_LENGTH of XCCACE : entity is 8。其他器件的查閱方法類似。
本方法已在Xilinx XUP VirtexII PRO開發(fā)板上進行了驗證,取得了良好的效果,整個程序過程僅需幾秒,即可實現(xiàn)程序的一鍵更新。
結語
8位嵌入式處理器PicoBlaze應用靈活方便。本文介紹的基于pBlazIDE的PicoBlaze匯編程序仿真調試方法和基于JTAG Loader的PicoBlaze程序快速更新方法簡便可行,可明顯提高PicoBlaze項目調試效率,具有較高的應用價值。