學會Zynq(1)搭建Zynq-7000 AP SoC處理器

FPGADesigner發表於2019-03-10

有三四個月沒有記錄blog了,這段時間也參加了一些比賽,以及上課。Vivado的資料還沒有記錄完,不過還是先記錄下這段日子用的比較多的Zynq, 也為接下來的專案做做準備。學習主要還是看官方資料,還有黑金米聯的一些教程(雖然一些細節、概念有錯誤,但能讓入門更快也是好事)。


FPGA嵌入式開發概述

使用Xilinx FPGA進行嵌入式設計有兩種解決方案:(1).使用MicroBlaze軟核處理器進行設計,適用於純FPGA平臺;(2).基於Zynq-7000 AP SoC處理器進行設計,只適用於Zynq系列FPGA。Zynq晶片內部包括ARM處理器(通常稱為PS部分)與可程式設計邏輯部分(通常稱為PL部分)。

本系列將講述如何使用Vivado完成基於Zynq平臺的嵌入式系統設計。一個完整的嵌入式系統設計要考慮硬體、軟體、FPGA設計三個部分。Xilinx為了儘量簡化設計流程,提供如下兩個主要設計工具:

  • Vivado IDE中的IP Integrator,將基於處理器的設計連線在一起,以圖形化的方式設定器件、選擇外設、配置硬體設定。

  • Vivado開發套件中的另一款軟體開發工具SDK(Software Development Kit),對基於微處理器的系統和嵌入式軟體應用進行設計、除錯。

目前Zynq包含Zynq UltraScale+ MPSoC系列(內建Cortex-A53)和Zynq 7000 SoC系列(內建Cortex-A9雙核)。本部落格系列主要以Zynq 7000系列為主,其嵌入式開發流程相對比較簡單,開發板採用米聯的MZ7X(淘寶可購買,適合新手)和火龍果ZedBoard(適合進階階段,較貴)。相關學習資料可以參考官方文件UG898、UG940、UG585、UG821、UG782。


嵌入式系統設計流程

Xilinx提供的工具,既支援開發無需作業系統的裸機應用,也支援開發基於開源Linux作業系統的應用。下圖給出了一個大致流程:
在這裡插入圖片描述
完成一個嵌入式處理器設計的大致步驟如下:

  1. 建立一個Vivado工程。
  2. 在IP Integrator中建立一個塊設計,例項化Zynq處理器與其它Xilinx IP和自定義IP。
  3. 為塊設計中的IP生成輸出產品。
  4. 建立頂層封裝wrapper,將塊設計例項化到頂層RTL設計中。
  5. 執行綜合、實現、生成bit流,匯出硬體到SDK中。
  6. 在SDK中建立軟體應用,將可執行的ELF檔案與硬體設計聯絡在一起。
  7. 下載程式到開發板中。

IP Integrator中的連線

配置好Zynq處理器後,通常還要新增一些其它IP。IP Integrator中的設計助手(Designer Assistance)特性可以幫助設計者完成系統搭建與埠之間的連線,主要包括如下兩個功能:

  • Block Automation,模組自動化幫助設計者完成一些模組的配置,完成基本系統的建立,支援交叉觸發(cross-trigger)特性。
  • Connection Automation,連線自動化在檢測到當前例項化的IP之間可能需要連線時,可以自動完成連線操作。

當然,連線也可以手工完成。當工具檢測到某些工作可以通過設計助手完成時,會在視窗上方給出提示,如下圖:
在這裡插入圖片描述
系統搭建完成後,最好執行DRC檢查避免設計中存在錯誤。點選上圖中的Validate Design按鈕(倒數第4個),如果沒有錯誤會彈出如下提示視窗:
在這裡插入圖片描述


把塊設計整合到頂層設計中

本節具體講述下設計步驟的3、4步。生成輸出產品會產生IP核的原始檔與約束檔案。匯出檔案的語言由工程設定決定,如果某IP核不支援該語言,匯出時會提示相關資訊。源視窗中選中IP Integrator驗證好的塊設計,右鍵->Generate Output Products,或在左側Flow Navigator中點選IP INTEGRATOR->Generate Block Design,可匯出該塊設計中所有IP的輸出檔案。
在這裡插入圖片描述
點選上圖中的Create HDL Wrapper,可以將塊設計整合到一個更高層次的設計中。Vivado提供兩種封裝方式,如下圖:
在這裡插入圖片描述
第一項允許設計者修改封裝檔案,但如果塊設計的埠發生變化,設計者要記得更新封裝檔案。第二項生成的封裝檔案為Read-Only模式,Vivado自動管理和更新該檔案。封裝好後便可以執行綜合、實現、生成bit流等操作。


硬體設計匯出到SDK

當把IP Integrator中的處理器硬體設計匯出到SDK時,會生成下表中格式的一些檔案。

檔名 功能
system.xml 執行SDK時預設開啟,顯示系統的地址對映相關資訊
Ps<#>_init.c Ps<#>_init.h 包含Zynq處理器系統的初始化程式碼,還有DDR、時鐘、PLL和MIO的初始化設定資訊
PS<#>_init.tcl 初始化檔案的Tcl版本
PS<#>_init.html 描述初始化資料

SDK提供了為Xilinx嵌入式處理器建立軟體應用的完整開發環境,具體包括:基於GNU的編譯工具鏈(GCC編譯器、TCF系統偵錯程式、相關單元和庫)、JTAG偵錯程式、Flash程式設計器、Xilinx IP和裸機板級支援包的驅動、使用C/C++進行裸機開發或Linux應用開發的IDE。SDK基於開源的Eclipse平臺開發,還包含了C/C++開發工具箱。

當設計已經實現並生成了bit流時,通常都需要將設計匯出到SDK中進行軟體應用開發。某些設計中PL部分可能不包含任何邏輯(即單純地把Zynq當作ARM來使用),無需實現和生成bit流便可匯出設計。先點選File->Export->Export Hardware,彈出如下視窗:
在這裡插入圖片描述
選中“Include bitstream”,點選OK匯出硬體資訊。完成後再點選File->Launch SDK即可執行SDK。之後便可以在SDK中進行軟體應用設計。設計完成後還可以在SDK中除錯、下載軟體,也可以匯出ELF檔案,在Vivado中和bit流一起進行下載、測試。


Hello World例項

本文前面介紹了一些FPGA嵌入式開發的基本知識和軟體特性,本小節將以一個完整的Hellow World例項熟悉如何搭建Zynq-700 AP SoC處理器。這個過程中將運用到上述特性,也會出現一些大家不熟悉的概念。本節著重體會一個大致的流程,具體概念在下一篇著重講述。

  1. Vivado中建立一個工程,選擇晶片時選擇一個與開發板相符的型號。
  2. 點選IP INTEGRATOR->Create Block Design,為塊設計命名。
  3. 白板中新增IP核“ZYNQ7 Processing System”,注意上方彈出設計助手,點選Run Block Automation,彈出視窗如下:
    在這裡插入圖片描述
  4. 設計助手提示我們會自動建立FIXED_IO和DDR,直接點選OK:
    在這裡插入圖片描述
  5. 將M_AXI_GP0_ACLK和FCLK_CLK0手工連在一起:
    在這裡插入圖片描述
  6. 雙擊ZYNQ,對IP核進行配置。首先在“Clock Configuration”中配置時鐘,引數要與開發板相符。這裡PS時鐘為33.3M。
    在這裡插入圖片描述
  7. DDR Configuration中配置DDR記憶體,同樣要與開發板相符,DDR Controller Configuration->Memory Part中要選擇正確的DDR晶片型號。
    在這裡插入圖片描述
  8. 接下來在MIO Configuration中配置PS部分的外部I/O資訊,我這裡只希望用一組串列埠列印“Hello World”,因此只配置了UART1,另外Bank0核Bank1的I/O電壓設定也要與開發板相符。
    在這裡插入圖片描述
  9. 配置完成後,依次生成輸出產品、用wrapper封裝、生成bit流、匯出硬體、啟動SDK(注意某些開發板需要在啟動SDK前便與電腦連線好)。
  10. 耐心等待SDK啟動和載入完硬體,視窗如下。左側Project Explorer顯示了硬體平臺資訊,中間顯示了地址對映關係。基於建立好的硬體平臺,我們可以建立多個軟體應用。
    在這裡插入圖片描述
  11. 點選File->New->New Application Project建立新的應用,這裡只設定了工程名,如下:
    在這裡插入圖片描述
  12. 點選Next,選擇示例工程Hello World,點選Finish。
    在這裡插入圖片描述
  13. 接下來對該示例工程進行除錯,選擇如下圖:
    在這裡插入圖片描述
  14. 彈出視窗中,Xilinx C/C++ application(System Debugger)->右鍵->new:
    在這裡插入圖片描述
  15. 彈出如下視窗。如果匯出硬體時沒有選擇Include bitstream,此處Bitstream File視窗顯示為空,點選Browse選擇即可。選中Reset entire system和Program FPGA,點選Apply,再點選Debug。
    在這裡插入圖片描述
  16. 等待Debug載入完成。注意如果你發生這種情況:Vivado中可以檢測到FPGA且正常下載程式,但一到SDK中就檢測不到FPGA,最簡單的解決方法就是開發板上不要插入帶有作業系統程式的SD卡。很多初學者就是犯了這個錯誤,導致無法從SDK中下載程式。
  17. 在下方的SDK Termianl視窗中,點選“+”新增串列埠,Port為對應COM號:
    在這裡插入圖片描述
  18. 連線成功後,SDK Terminal視窗中有相應提示,點選Resume按鈕或按F8,終端中列印出Hello World,表明功能正確。
    在這裡插入圖片描述

至此便完成了一個簡單的嵌入式開發例項,接下來的文章將介紹整個流程中設計到的很多概念,以及一些選項的具體配置方法。本文實驗使用的是SDK自帶例程,後面的文章中也會講述如何自己在SDK中程式設計。

相關文章