學會Zynq(6)固化程式到SD卡或QSPI Flash

FPGADesigner發表於2019-03-11

SDK除錯程式時都是通過JTAG,將PL的bit流檔案和應用程式的ELF檔案下載到Zynq中,執行檢視效果。除錯驗證功能後需要將程式固化到板子上,使板子上電後可以從儲存單元中載入程式,而無需SDK的除錯環境。Zynq支援多種儲存裝置,本文將介紹如何將程式固化到常用的SD卡和QSPI Flash中。


配置SD卡

首先要檢視開發板原理圖中SD卡與MIO的連線關係。以火龍果Red Pitaya開發板為例,外部的SD卡插槽通過一個SDIO埠擴充套件晶片與PS的MIO40-47相連。
在這裡插入圖片描述
配置Zynq時在外設中選擇與硬體對應的SD0,可以看到SD訊號與硬體之間保持對應關係(因為這部分硬體設計是比較固定的)。CD和WP訊號可能不是所有的開發板都有,根據硬體實際情況進行選擇。
在這裡插入圖片描述
在Peripheral I/O Pins視窗中,我們可以看到其實可以選擇3組MIO作為SD0,硬體設計時選擇其中一組用於SD卡儲存即可。
在這裡插入圖片描述
Clock Configuration的IO Peripheral Clocks中,可以看到SDIO的預設時脈頻率為100MHz。該時鐘的設定應該處於SD卡支援的範圍內。
在這裡插入圖片描述


配置QSPI Flash

同樣也要檢視開發板原理圖中QSPI Flash與MIO的連線關係。以火龍果Red Pitaya開發板為例,QSPI Flash晶片與MIO1-6相連。
在這裡插入圖片描述
配置Zynq時選中與硬體對應的QSPI Flash,訊號與硬體之間保持對應關係。
在這裡插入圖片描述
在Peripheral I/O Pins視窗中,我們可以看到QSPI Flash只能通過MIO1-6與Zynq相連,硬體設計時要特別注意。
在這裡插入圖片描述
同樣在IO Peripheral Clocks中,也可以配置QSPI的時脈頻率,應該處於QSPI Flash晶片支援的範圍內。


Zynq啟動模式的選擇

如果板子上有多種程式儲存裝置,Zynq在上電時通過一些MIO的電平狀態決定採用哪種啟動模式,具體見下表。可以看到主要與MIO3-5三個管腳有關。
在這裡插入圖片描述
米聯的MZ7XA開發板整合了QSPI和SD卡,控制啟動模式的電路圖如下:
在這裡插入圖片描述
從表中可以看到QSPI和SD卡的區別僅在於MIO4,通過一個撥碼開關控制模式間的切換,其它MIO固定拉高或拉低即可。注意這個板子的原理圖設計時MODE0-4與上表中的BOOT_MODE0-4並不對應,不要混淆。
在這裡插入圖片描述
火龍果開發板的設計要更簡潔。它將其它MIO的電平固定拉高或拉低,MIO4直接由SD卡的檢測訊號驅動,實現了SD卡和QSPI啟動模式之間的自動切換。


製作BOOT.bin

BOOT.bin就是儲存在SD卡或QSPI Flash中的程式,上電時Zynq會從外部儲存裝置將BOOT.bin讀取到片記憶體儲器中執行。製作BOOT.bin除了需要bit流檔案和ELF檔案外,還需要一個FSBL檔案。FSBL主要用於Zynq第一階段的初始化,SDK中已經提供了現成的FSBL檔案,對於絕大多數應用只要稍許修改即可使用。

為了使用現成的FSBL,先新建一個工程,使用示例工程中的Zynq FSBL工程模板。
在這裡插入圖片描述
選中要建立BOOT映象的工程,右鍵->Create Boot Image。一般情況下,SDK會自動設定BOOT.bin的輸出路徑,自動新增工程中的bit流檔案和ELF檔案,以及工作環境中存在的FSBL.elf檔案。
在這裡插入圖片描述


固化程式

將匯出的BOOT.bin檔案拷貝到SD卡中,插在開發板上接通電源,可以觀察到在沒有JTAG的情況下程式便會自動載入執行。注意Zynq的啟動模式要設定正確。

連線好JTAG並接通電源,點選Xilinx Tools->Program Flash Memory開啟如下視窗:
在這裡插入圖片描述
選擇要下載到Flash中的映象檔案,點選Program即可將BOOT.bin匯入到QSPI Flash中。將啟動模式切換為QSPI Flash啟動,在不接JTAG的情況下重新上電,也可以看到程式自動載入後執行。至此便完成了程式的固化。

一開始如果對Zynq的開發流程不是很熟,很容易出現刷進去了BOOT.bin但程式沒跑起來的情況。這時候要先確保ELF程式在JTAG模式下是已經無誤的(如果DDR3就配置錯了,就算程式碼是對的,程式也會跑不起來),然後要檢查Vivado中硬體平臺環境配置問題,相應的外設是否啟用,SD卡的時鐘是否過高等等。

相關文章