為了學習 RISC-V 以及體驗看看 Xilinx 的開發平台,最近我入手了 Zybo Board ,這是一塊具有 FPGA 同時又包含了 ARM Cortex-A9 雙核心的開發板。
在我們開始這一切之前,我們需要稍微了解一下這片開發板以及他的週邊等資訊。
要了解 Zybo Board 的週邊,首先要看的就是開發商 DIGILENT 所提供的 ZYBO FPGA Board Reference Manual。 讓我們來看看一些比較重要的地方吧!
基本硬體認識
方塊圖
除了基本的硬體外,我們也可以透過方塊圖來了解這片板子有哪些功能,下圖取自 Embedded Linux Hands-on Tutorial for the ZYBO
電源輸入(5V)
Zybo Board 允許三種不同類型的電源輸入模式,分別是 USB、外接電源(J15)、外接電池。我們可以從 Reference Manual 得到電源模組的大致資訊。
控制電源輸入的位置在 JP7 的排針座上,我們可以透過切換跳線(Jumper)來選擇我們需要的電源輸入,在週邊使用不多的情況下,我會直接使用 USB (5V) 來作為電流的輸入。
要注意到的是,Zybo Board 僅吃 5V 電源,因此不論你是用外接電源(J15)或是外接電池,你最好都先確認你的電壓是否為 5V (或是低於) ,否則你的開發板可能因此燒壞。
插上電源後,透過電源開關 (Power Switch, SW4) 的切換即可完成給電/斷電的動作。
Zynq SOC
Zybo Board 核心是 Xilinx Zynq-7000 系列的 Z-7010 ARM/FPGA SoC 處理器,這是一種混和了 FPGA 以及 ARM Cortex-A9 處理器的 FPGA 核心。以往的 FPGA 開發板需要用到 CPU 的時候只能夠燒錄用 HDL 語言撰寫的軟核心到開發板上,這種混搭 FPGA/ARM 的開發板則是讓你可以針對通用需求使用 ARM CPU 進行程式的開發,特殊需求則透過 FPGA 進行處理/加速來運作,是一種蠻有趣的架構。
我們可以把 Zynq SoC 分為兩個區塊, 處理系統 (Processing System, PS) 以及 可程式邏輯區塊(Programmable Logic, PL),像這樣
處理系統(Processing Syste, PS) 也就是有 ARM Cortex-A9 處理器的部份,可程式邏輯區塊(Programmable Logic, PL) 則是 FPGA 所包含的部份。
在上面的區塊圖中,我們要另外注意到 MIO (Multiplexed I/O) 以及 EMIO (Extended multiplexed I/O) ,在 Zynq 7000 系列 SoC 中,我們共有 54 個 MIO 可用,而這些 MIO 所連接的位址是無法在 可程式邏輯區塊 (Programmable Logic, PL) 中看到。
在 Zybo Board 我們有這幾個地方是連接到 MIO (Multiplexed I/O) 上的
系統啟動流程
由於 Zynq 7000 系列內建了 ARM CPU,也因此和傳統的 FPGA 開發板相比,系統啟動流程也會不同,整體開機流程可以分為三個階段:
階段 0
當 Zybo board 電源啟動後,CPU0 會執行內部已經預燒錄的程式 BootROM,這個程式會根據
JP5所設定的資訊來更新狀態暫存器(mode register),接著 BootROM 會透過狀態暫存器(mode register)的資訊從 MicroSD、NOR Flash、JTAG 等位置抓取 Zynq Boot Image,並將包在 Zynq Boot Image 裡面的第一級啟動開機程式 (First Stage Bootloader, FSBL)複製到內部 256KB 的記憶體 (On-Chip Memory, OCM) 去,最後執行 FSBL,進入下一個階段。如果 BootROM 是因為按下了 RESET 按鈕等狀況而被執行,Zybo board 會選用之前已經存放在狀態暫存器(mode register)的開機狀態,而不是當下的
JP5狀態。階段 1
在這階段中, 第一級啟動開機程式 (First Stage Bootloader, FSBL) 初始化了 DDR 記憶體、GPIO 等週邊設定,接下來會載入存放在 Boot Image 內的位元流 (bitstream),用他來對可程式邏輯區塊 (Programmable Logic, PL) 進行設定。
當可程式邏輯區塊(Programmable Logic, PL)設定完成後,FSBL 會去載入程式(ex: u-boot)並執行它。
階段 2
最後的接段即是執行 FSBL 所載入的程式,這些程式可以從簡單的 "Hello World",到像 u-boot 這樣的第二階段開機程式,用來載入 Linux 或是其他的作業系統。
更改開機模式
我們可以透過切換 JP5 的跳線(Jumper)來決定我們要透過哪種方式去載入第一級啟動開機程式 (First Stage Bootloader, FSBL)
MicroSD 啟動
當使用者將 MicroSD 插入到 J4 的 SD 卡槽,並設定好 JP5 的跳線的話,我們可以透過 MicroSD 來進行開機的動作。
若你希望透過 MicroSD 進行開機,你需要先設定好你的 SD 卡:
- 透過電腦格式化 MicroSD 卡成
FAT32檔案格式 - 複製從 Xilinx SDK 製作出來的 Zynq Boot Image 到 MicroSD 卡上
- 將 Zynq Boot Image 命名為
BOOT.bin - 將 MicroSD 卡從電腦移除,並插入到 Zybo Board 的 J4 SD 卡槽上
- 接上電源,並設定好 JP7 (Power Source Select)
- 將
JP5的跳線 (Jumper) 調整到 MicroSD 模式 (板上標示為 SD 的那個) - 啟動電源。接下來 Zybo Board 就會從 MicroSD 卡啟動。
QSPI 啟動
在 Zybo board 上有一顆 128-Mbit Quad-SPI (QSPI) 的 NOR Flash,我們可以透過 Xilinx ISE 和 Vivado 等工具去將 Zynq Boot Image 下載到 QSPI Flash 上。
當下載完成後,照這樣的步驟即可透過 QSPI 啟動:
- 接上電源,並設定好 JP7 (Power Source Select)
- 將
JP5的跳線 (Jumper) 調整到 QSPI 模式 (板上標示為 QSPI 的那個) - 啟動電源。接下來 Zybo Board 就會從 QSPI 卡啟動。
JTAG 啟動
當你將 JP5 設定為 JTAG 啟動模式,Zynq 內的 Cortex-A9 處理器會等到電腦端的 Xilinx 工具載入了要執行的程式之後,再執行預執行的程式,或是啟用一步一步(step-by-step)的執行模式來方便我們除錯。
除此之外,我們也可以透過 iMPACT 或是 Vivado Hardware Server 透過 JTAG 來設定可程式邏輯區塊 (Programmable Logic, PL)。
Zybo Board 預設是開機啟動 Cascaded JTAG 模式,在這種模式下 處理器系統 (Processing System, PS) 和 可程式邏輯區塊 (Programmable Logic, PL) 可以透過同一個 JTAG 去進行控制。如果你將 JP6 短路,則可以讓 JTAG 僅看得到 可程式邏輯區塊 (Programmable Logic, PL),在這種狀況下,使用者可以透過 EMIO (Extended multiplexed I/O) 將 JTAG 拉出,讓外部的設備可以和 處理器系統 (Processing System, PS) 進行溝通。