將Altera FPGA的sof文件和NIOS II的elf固件合並為一個jic文件以使用Quartus Programmer燒寫
我們在學習和調試NIOS II工程的時候,一般都是先使用Quartus II軟件中提供的Quartus Programmer來燒寫FPGA配置文件(SOF),然后NIOS II EDS中提供的Flash Programmer工具來進行燒寫NIOS II的。這對於開發者來說,並沒有什么不便,反而因為這種方式的靈活,為開發帶了了很大的便利。然而,當我們的產品已經設計完成並量產的時候,就需要將固件燒寫到產品中。生產線上進行燒錄時,總希望能夠用最簡單的方式實現。試想,如果生產線上在進行燒寫時,還需要幾個工具換來換去,等待很久,效率自然就下去了。因此這種Quartus Programmer+Flash Programmer的方式並不適合生產。
小梅哥在最近的工作中也遇到了這樣的問題。我們新設計的一批開發板,在工廠生產完畢后,都要進行出廠測試。然而SMT廠家卻並不熟悉我們的這種Quartus Programmer+Flash Programmer燒寫方式。再說了,要使用這種方式還得安裝Quartus Programmer和NIOS II EDS軟件。廠家表示使用這種方式對他們來說有一定難度,而且效率也不高。所以我就根據Altera 官方網站上的一個帖子,進行了轉換,將SOF文件和NIOS II的elf固件合並並生成了一個jic文件,這樣,廠家就只需要使用Quartus Programmer來燒寫這個jic文件就能實現同時燒寫FPGA配置文件和NIOS II固件的功能了,簡化步驟,節省時間。
從SOF文件和ELF文件得到JIC文件的原帖地址如下:
https://www.altera.com.cn/support/support-resources/knowledge-base/solutions/rd10132010_126.html
因為有經驗不足的朋友反映在看了這個教程后還是不知道怎么操作,總是不成功,因此這里小梅哥使用我們芯航線FPGA的開發板,一步一步演示這個實現過程,將整個過程具體化。
先說明下我這個設計工程的結構:
-
EPCS16: 用來存儲FPGA配置文件和NIOS的固件,本例中最終轉換得到的JIC文件也是燒寫到該器件中。
-
512K字節SRAM: 作為NIOS II運存或者4.3寸TFT顯存,這里作為TFT顯存。(PS:使用SRAM作為運存,相較於使用SDRAM作為運存,NIOS II的性能會有較大的提升。)
-
128Mbit SDRAM: 作為NIOS II運存或者4.3寸TFT顯存,這里作為NIOS II運存。以運行較為復雜的程序或者GUI。
-
4.3寸TFT: 用來顯示文字/圖片等內容。
-
XPT2046觸摸控制器: 使用SPI接口,用來得到觸摸屏信息,實現人機交互
-
CH340 USB2TTL: 將UART協議與USB協議進行互相轉換。以實現調試的功能。
-
4bit LED: 指示程序運行狀態。
-
2X輕觸按鍵: 輸入控制信息
介紹完了這個系統,接下來就可以介紹整個轉換過程了:
1 sof2flash:
從一個.sof 文件生成一個flash文件:
sof2flash --input=<hwimage>.sof --output=hwimage.flash --epcs –verbose
首先我們打開我們的NIOS II軟件工程和對應板級支持包,這里名為tft_touch和tft_touch_bsp
然后選中tft_touch,單擊右鍵選擇Nios II -> Nios II Command Shell
我們的Quartus II生產的sof文件名為" TFT_SRAM.sof",這個時候,如果我們直接輸入
sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose
會提示找不到input file也就是找不到TFT_SRAM.sof文件。
這是因為該命令是在當前目錄下尋找TFT_SRAM.sof文件,而我們的TFT_SRAM.sof文件在E:\easy_sopc\TFT_SRAM\prj\output_files目錄下,因此當然無法找到該文件了。解決這個問題的方法有兩種。
第一種,推薦方案。
因為很多不熟悉命令行的朋友在操作時速度慢而且容易出錯,因此這里提供一種比較熟悉的方式。首先在windows中,將TFT_SRAM.sof文件從output_files文件夾中拷貝到tft_touch文件夾中:
然后回到命令行窗口再次執行
sof2flash --input= TFT_SRAM.sof --output=hwimage.flash --epcs –verbose命令
(提示:使用鍵盤上的向上方向鍵,可以快速切換到之前使用過的命令,這里在切換目錄后,連按兩次方向上鍵就應該能找到之前輸入的sof2flash命令。)生成過程大約花費10秒鍾。生成完成后的截圖如下所示:
然后我們輸入ls命令就能看到,確實生成了這樣一個名為hwimage.flash的文件:
第二種方案:首先在shell中使用cd命令直接將目錄切換到sof文件所在目錄,也就是E:\easy_sopc\TFT_SRAM\prj\output_files。相應命令為(注意斜線方向):
cd e:/easy_sopc/TFT_SRAM/prj/output_files
然后再次執行sof2flash命令即可實現。生成完成后的截圖如下所示:
然后我們輸入ls命令就能看到,確實生成了這樣一個名為hwimage.flash的文件:
一般推薦大家使用第一種方式,當然命令行高手除外。
2 elf2flash:
從一個,elf 生成一個flash文件:
elf2flash --input=<elf file>.elf --output=swimage.flash --epcs --after=hwimage.flash --verbose
因為推薦大家使用第一種方式操作,因此這里就按照第一種方式接着講,相信有能力用命令行方式切換目錄的朋友,也不會對其他操作存在問題。
這里我們就只需要直接輸入elf2flash命令即可了,命令詳細如下:
elf2flash --input=tft_touch.elf --output=swimage.flash --epcs --after=hwimage.flash –verbose
從命令中可以看到,第一步生成的hwimage.flash文件是作為了參數的一部分的,所以這里必須保證hwimage.flash在當前目錄下。(第一步中使用推薦的方式,則能夠自動保證這一點)。命令執行結果如下:
然后我們輸入ls命令,可以看到,在當前文件夾下確實生成了一個名為swimage.flash的文件:
3 flash2hex:
轉換.flash文件到.hex文件:直接輸入以下命令(注意:altera官網中原帖這個地方命令有誤,前后對應不上,原帖為nios2-e…… mysw.flash mysw.hex,應該講mysw改為swimage):
nios2-elf-objcopy --input-target srec --output-target ihex swimage.flash swimage.hex
這個命令瞬間執行完成,我們ls下,就能看到當前文件夾下已經生成了一個swimage.hex的文件:
4 Convert Programming Files
在Quartus® II軟件中,open File > Convert Programming Files > Set the programming file as JTAG Indirect Configuration File (.jic).
5 選擇EPCS
在配置下拉菜單中選擇合適大小的EPCS器件(見10步圖)
6 命名jic
命名你的輸出.jic 文件(見10步圖)
7 Add Device
點擊Flash Loader的下面,在右邊選擇Add Device (見10步圖)
8 選擇FPGA器件
從列表中選擇你的FPGA器件(見10步圖)
9 Add SOF
點擊SOF Data,選擇Add File,選擇加.sof 文件(見10步圖)
10 Add Hex data
點擊Add Hex data,選擇Relative addressing,選擇上面生成的.hex 文件
11 Generate
然后點擊Generate生成。生成完成后檢查生成的 .map 文件(使用記事本打開)有Page_0在起始地址0x0,.hex文件在Page_0結束地址后的起始地址1
12 燒寫
現在在Quartus II Programmer中,選擇Add File,選擇加.jic 文件。檢查Program框,下一步.jic 文件,接着按Start即可。
13 女神鎮樓
最后上一張測試圖,女神鎮樓(話說放這樣一張圖給客戶,客戶是不是會覺得特別開心呢):
如有更多問題,歡迎加入芯航線FPGA技術支持群:472607506
小梅哥
芯航線電子工作室
2016年1月30日星期六