FPGA 程序固化

上一節咱們只使用ZYNQ的PL端資源,單獨控制PL端的LED實現流水燈:blog.csdn.net/fengyuwuzu0…。可是掉電後程序會丟失,那麼如何固化代碼到FLASH呢?就是本節的目的了。app

1、ZYNQ的啓動流程

ZYNQ7000 SOC 芯片能夠從 FLASH 啓動,也能夠從 SD 卡里啓動, 本節介紹程序 FLASH 啓動的方法。Zynq7000 SOC 芯片上電後,最早運行的是ARM端系統(PS)。而後再經過ARM系統軟件部分加載FPGA的比特流文件.bit至FPGA(PL),配置FPGA PL端的邏輯功能。ZYNQ 系統的啓勱流程以下:工具

1.1 ZYNQ啓動分爲兩個階段

  • 第一階段是 BOOT ROM(ZYNQ廠家固化代碼)
  • 第二階段是 FSBL (First Stage Bootloader)SDK工具來製做。

通過以上兩個階段,PL端配置程序及應用程序纔開始運行。.net

1.1 第一階段 (BOOT ROM)

  • 上電後,Zynq7000 SOC 會首先執行片內 Boot ROM 代碼,Boot ROM 代碼讀取 Boot mode 寄存器來判斷是哪種啓動方式(SD card/QSPI Flash/JTAG)。
  • 肯定好哪一種啓勱方式後,Boot ROM 從相應的啓動設備(SD Card/QSPI Flash)加載 First Stage Bootloader (FSBL) 到On Chip Memory(OCM) RAM,而且將執行權交付給 FSBL。

1.2 第二階段 FSBL (First Stage Bootloader)

使用SDK 工具一步步生成 FSBL 代碼和可執行文件,結合代碼可知 FSBL 主要作了以下工做:debug

  • 初始化 CPU,初始化串口;
  • Processor System (PS) 一些控制器的初始化,如 MIO, PLL, CLK and DDR;
  • 禁止 L1 Data Cache;
  • 註冊 ARM 中斷向量;
  • 經過 Boot mode 寄存器,判斷是哪一種啓動方式。

1.2.1 QSPI Flash 啓動方式:

  • 初始化 QSPI Flash 控刢器;
  • 從 Flash 拷貝 system.bit 到 FPGA (若是 Flash 中存有 system.bit);
  • 從 QSPI Flash 拷貝應用程序的代碼到DDR3;
  • 調轉到應用程序執行;

1.2.2 SD Card 啓動方式:

  1. 初始化 SD 控刢器;
  2. 從 SD Card 拷貝 system.bit 到 FPGA (若是 BOOT.BIN 中存有 system.bit);
  3. 從 SD card 拷貝應用程序的代碼到 DDR3;
  4. 跳轉到應用程序執行;

1.2.3 JTAG 啓動方式,直接退出。

2 製做BOOT.bin

2.1 新建項目

參考LED實驗時建立工程的方式:blog.csdn.net/fengyuwuzu0…設計

2.2 配置PS端資源、啓動SDK、生成BOOT.bin

(1)ZYNQ 的PS開發通常有原理框圖的形式來設計,這樣硬件的鏈接看起來會更加直觀。點擊 Create Block Design 按鈕來添加原理圖設計文件。3d

在彈出的對話框裏輸入原理圖設計文件的名字,返里咱們取名爲"system"。orm

(2)出現 Diagram 的空白對話框,點擊 圖標+添加 ARM 處理器內核到這個空白的原理圖裏。cdn

返里有不少 Xilinx 提供的 IP,咱們找到 ZYNQ7 Processing System 雙擊添加,不要選擇後面帶 BFM(總線功能模型),帶 BFM 的 IP 爲早期IP 處理器版本。blog

(3)雙擊 Diagram 界面裏的 ZYNQ Processing System,打開 ZYNQ 系統的配置界面。接口

其中 Page Navigator 界面下有 8 個子項,分別爲 Zynq Block Design, PS-PL Configuration,Peripheral I/O Pins, MIO Configration, Clock Configuration, DDR Configuration, SMC Timing Calculation, Interrupts。這些頁面選項是針對 ZYNQ 的不一樣硬件模塊的配置,其中

PS_PL 頁面提供了 PS 到 PL 的相關接口配置信息以及 PS 部分一些配置信息;

Peripheral I/O Pins 頁面主要是對一些通用外設接口的配置;

MIO Configruation 頁面主要是對 MIO 已經EMIO 的分配控制;

Clock Configruation 頁面主要是對 PS 端時鐘資源的配置和管理;

DDR Configration 頁面主要是對 DDR控制器一些參數的配置;

Interrupts 頁面主要是對中斷進行配置管理。

(4)點擊 Peripheral I/O Pins ,會出現如下的 IO 配置界面。

由於 ZYNQ 的MIO 管腳能夠配置成多種功能,好比 MIO48 和 MIO49, 既能夠配置成 SD1引腳,也能夠是 UART1 引腳,或者是 I2C1 引腳,也能夠配置成 CAN1 引腳。具體如何配置須要跟硬件電路板的原理圖對應。咱們 MIO48 和 MIO49 是鏈接到 UART 芯片上,是做爲串口通訊使用。使能SD、 Quad SPI Flash。

(5)點擊 PS-PL Configuration ,在 Gemeral 目錄下,咱們能夠看到UART1 波特率是115200,這個波特率用戶能夠本身選擇,咱們返里就保留默認設置就能夠了。

(6)點擊 Clock Configuration ,返個界面會顯示 ZYNQ 系統的一些時鐘,好比輸入時鐘是33.33333Mhz, 這個時鐘跟咱們開發板上的 PS 的系統時鐘是同樣的。另外咱們能夠看到 CPU工做時鐘是 666.666666Mhz(767Mhz), DDR 的工做時鐘是533.333333Mhz,還有些是外設的工做時鐘。這些時鐘頻率咱們目前不須要修改。

(7) 再打開 DDR Configration,在這個界面上是選擇 DDR 芯片的名稱和一些參數。咱們再 Memory Part 中須要選擇跟開發板上 DDR3 型號同樣的名稱(MT41J256M16 RE-125)。

(8) 在 MIO Configuration 頃,把 Quad SPI Flash 的 MIO1~MIO6 Speed 配置成 fast 模式。

在 SD_0 項,選擇 CD 前面的鉤,IO 選擇 MIO47(須要跟開發板一致),SD_0 的 IO 速度配置成 fast 模式。再配置 Bank1 I/O Voltage 的電壓爲 1.8V。

(9)在 Clock Configuration中,咱們能夠修改 QSPI 癿時鐘頻率,默認是 200Mhz。這裏不作修改。

(10)在 Diagram 界面裏點擊"Run Block Automation"完成對 ZYNQ7 Processing System IP核的配置,生成外部 ZYNQ 系統的外部連接 IO 管腳。

生成後的 ZYNQ 系統外部管腳以下,一個是 DDR 的接口,一個是 FIXED_IO。

(11)在 Source 窗口中選中 system.bd,右鍵並前後選擇Generate Output Projects 和 Create HDL Wrapper 選頃迕行操做。生成後以下圖所示:

(12)在system_wrapper.v中例化LED程序,並添加相應的管教約束文件。具體可參考PL端的流水燈實驗。

(13)從新編譯一下工程,生成 bit 文件。

(14)再導出硬件,選擇菜單 File->Export->Export Hardware...導出,包含bitstram 文件。

(15)硬件導出後,選擇菜單 File->Launch SDK,啓動 SDK 開發環境, 會出現1 個 hardware platform:sytem_wrapper_hw_platform_0。

(16)進入SDK 開發環境後,點擊菜單 File -> New -> Application Project。

(17)僅在 Project name: 輸入 fsbl,Hardware Platform 須要選擇system_wrapper_hw_platform_0。

next,選擇 Zynq FSBL 模板

(18)軟件會自動編譯生成 fsbl.elf 文件。

(19)爲了可以讓串口打印出 Bootloader 癿信息,咱們返里須要在 fsbl_debug.h 文件裏添加一條語句,定義一下「FSBL_DEBUG_INFO」常量。修改後保存,從新編譯一下 fsbl 項目。

(20)接下去咱們要把 FSBL 可執行文件,FPGA PL的bit比特流文件和PS應用程序結合成一個 Bin 文件。

選擇菜單 Xilinx Tools->Create Boot Image:

點擊 Browse 選擇選擇 Zynq Boot Image 文件.bif 的存放地址。

(21)點擊 Add按鈕, 在彈出的Add new boot image partition 對話框中, 點擊 Browse 選擇咱們剛生成的 FSBL 可執行文件 fsbl.elf。返里 Partition type 爲 bootloader,fsbl.elf 做爲bootloader 程序。

(22)點擊 Add 按鈕,在彈出的 Add new boot image partition 對話框中, 點擊 Browse 按鈕找到 FPGA PL的比特流文件 system_wrapper.bit, 這裏 Partition type 爲 datafile。

(23)一樣的方法添加應用程序文件如uboot。 返里 Partition type 也是 datafile。3 個文件添加後以下所示:

(24)點擊 Create Image 按鈕,生成 BOOT.bin。BOOT.bin 文件生成成功。

三、燒寫 FLASH 並啓動

把生成癿 BOOT.bin 文件燒寫到 QSPI FLASH 中

(1)開發板須要鏈接 JTAG 線到電腦,把開發板的上電啓動配置跳線帽選擇至 QSPI Flash 啓勱,並上電。

(2)在 SDK開發環境裏,選擇菜單 Xilinx Tools->Program Flash。

(3)在 Program Flash Memory 裏, Hardware Platform 中選擇 system_wrapper_hw_platform_0, 燒寫癿 Image File 選擇剛生成的 BOOT.bin 文件,Flash Type 選擇 qspi_single。

(4)點擊 Program 按鈕下載,程序會開始下載 BOOT.bin 文件到開發板的 QSPI FLASH 中。

Console 窗口顯示 Flash Operation Successful 信息,說明燒寫成功。

(5)斷電從新上電,若是開發板鏈接串口,咱們能夠在串口工具裏看到 bootloader 的啓動信息。

相關文章
相關標籤/搜索