PYNQ攻略(上)

PYNQ-Z2初上手——啓動PYNQ系統

PYNQ-Z2板子說明

硬件資源

  • PYNQ包括有
  • ① 選擇板子的啓動方式,分別從JTAG、QSPI Flash和SD卡啓動。
    • JTAG啓動方式:經過④Micro-USB接口鏈接到電腦上,下載bit文件和elf文件,進行在線調試;
    • Flash啓動方式:將程序燒錄到Flash中,斷電後從Flash中開始運行程序;
    • SD啓動方式:將鏡像文件拷貝到SD卡中,從SD卡中讀取運行程序。
      JP1跳線帽
  • ② 選擇電源供電模式,分爲從USB供電運行和從外部電源供電運行。
    JP9跳線帽
  • ③SD卡配置
    PYNQ從SD卡啓動,SD卡中配置有啓動鏡像文件,須要有一塊空白的SD卡、讀卡器和配置教程

啓動PYNQ

總體認識

PYNQ是利用Python語言對ZYNQ進行開發的項目。PYNQ從SD卡中啓動,從鏡像文件中加載系統程序,經過網口鏈接到瀏覽器上的Jupyter Notebook,在上面進行Python開發。html

  • ZYNQ
    ZYNQ包括一個雙核ARM Cortex-A9處理器和一個FPGA,即處理器系統(PS)和可編程邏輯(PL),主要經過AXI接口鏈接。
  • Python開發環境Jupyter Notebook
    PYNQ中集成有Python開發環境,能夠利用Jupyter Notebook進行開發。Jupyter是基於瀏覽器的互動式編程環境,可以實現代碼編輯、程序結果實時顯示和文本編輯。

啓動步驟

  • 將配置好的SD卡放入SK卡槽;
  • 將①跳線帽鏈接到SD卡啓動,②跳線帽鏈接到USB供電;
  • 鏈接Micro USB和網線,USB線做爲電源線和UART串口線,網線做爲系統傳輸線;
  • 將電源開關撥到ON位置;
    現象:紅色LED亮起表示板上有電源。幾秒鐘後,黃色/綠色LED亮起,表示板上設備正常運行。一分鐘後兩個藍色LED和四個黃色/綠色 LED同時閃爍,以後藍色LED關閉,而黃色/綠色發光二極管常亮,系統現已啓動並可供使用。
  • 打開web瀏覽器鏈接到Jupyter Notebook(http://192.168.2.99),登陸帳號密碼爲xilinx。
  • 也能夠在主機上訪問,打開windows資源管理器,鍵入「 \\192.168.2.99\xilinx 」,登陸帳號密碼爲xilinx。

從底層向上走——熟悉ZYNQ開發

PS中運行程序,利用PL設計相應的模塊加速程序算法,最後將編譯的程序文件和FPGA配置文件封裝成一個獨立的、能夠在Python開發環境中調用的Overlay。因此從最底層的ZYNQ開發起步,熟悉PS和PL設計流程,而後瞭解Overlay是怎麼生成的,最後學習Python中如何調用底層文件來實現功能,才能對整個系統有一個總體的概念。
ZYNQ開發主要分爲PS開發和PL開發,可是兩者是相輔相成的,PL開發是爲PS服務的,而少了PL部分,PS程序也沒法實現。主要開發工具是Vivado,推薦教程爲xilinx的Advanced-Embedded-System-Design-Flow-on-Zynqpython

FPGA設計基礎(《深刻淺出玩轉fpga》和《Xilinx FPGA設計權威指南》筆記與心得)

應用領域

  • 邏輯粘合與實時控制
  • 信號處理與協議實現
  • 片上系統

開發流程

FPGA開發流程
ZYNQ開發流程

  • RTL行爲級仿真:使用Verilog從行爲級來模擬與FPGA接口的外圍電路的時序,驗證代碼所實現的功能是否符合要求。仿真沒有延遲信息,通常與器件無關。(絕大部分設計人員將這個階段的仿真叫功能仿真!)
  • 綜合(Synthesis):將較高層次的電路描述轉化爲較低層次的電路描述。具體地說,就是將設計代碼轉化爲底層的與門、非門、RAM、觸發器等基本邏輯單元相互鏈接的網表。
  • 綜合後門級功能仿真(前仿真):利用綜合後的Verilog網表進行仿真,須要在仿真過程當中加入廠家的器件庫。
  • 時序約束:對工程進行全局約束,而後對I/O接口時序進行約束,在對須要的的地方作時序例外約束。
  • 實現(Implementation):翻譯、映射和佈局,包括優化設計、功耗優化設計、佈局設計、物理優化設計、佈線設計和寫比特流。
  • 時序仿真(Post-Implementation Timing Simulation,後仿真):利用實現完的時序仿真模型和SDF時序標註文件(Standard Delay Format Timing Annotation)進行仿真。仿真帶有延遲信息,可能出現時序問題。
    FPGA的仿真是經過給設計模型添加一個激勵,模擬出實際FPGA運行狀態輸出響應,設計者觀察波形進行判斷。(不一樣仿真的區別參考教程)
  • 板級調試:Vivado集成設計環境包含邏輯分析特性和串行I/O分析特性。包括三個階段:
    • 探測階段(Probing phase):用於標識須要對設計中的哪一個信號進行探測,以及探測的方法;
    • 實現階段(Implementation phase):實現設計,包括將額外的調試IP鏈接到被標識爲探測的網絡。
    • 分析階段(Analysis phase):經過與設計中的調試IP進行交互,調試和驗證設計功能。

深刻了解ZYNQ(《The Zynq Book》筆記與心得)

Zynq 的本質特徵,是它組合了一個雙核ARM Cortex-A9 處理器和一個傳統的現場可編程門陣列(Field Programmable Gate Array,FPGA)邏輯部件。
在Zynq上,ARM Cortex-A9 是一個應用級的處理器,能運行完整的像Linux 這樣的操做系統,而可編程邏輯是基於Xilinx 7 系列的FPGA 架構。這個架構實現了工業標準的AXI 接口,在芯片的兩個部分之間實現了高帶寬、低延遲的鏈接。
ZYNQ總體架構git

具體架構

處理器系統

Zynq處理器系統

  • 應用處理單元(APU, Application Processor Unit)
    • NEON:媒體處理引擎(Media Processing Engine,MPE),實現了單指令多數據(Single Instruction Multiple Data,SIMD)功能來實現媒體和DSP 類算法的戰略加速。能夠對輸入向量中的多組數據,同時執行相同的運算來獲得對應的輸出向量。NEON 支持多種數據類型,可是不支持雙精度的。
    • FPU:浮點運算單元(Floating Point Unit,FPU);
    • MMU:內存管理單元(Memory Management Unit),在虛擬地址和物理地址之間作翻譯。
    • L1(D)、L1(I):一級cache存儲器
    • SCU:一致性控制單元(Snoop Control Unit)。負責維持兩個處理器的數據cache 存儲器和共享的二級cache存儲器之間的存儲一致性;經過加速器一致端口(Accelerator Coherency Port,ACP)來管理在PS 和PL 之間的訪問會話。
    • OCM:片上存儲器(On Chip Memory)
      APU框圖
  • 處理器系統外部接口
    • MIO(Multiplexed Input/Output):提供54個靈活配置的引腳,包括SPI、I2C、CAN、UART、GPIO、SD、USB和GigE
    • EMIO(Extended MIO):經過共用了PL 的I/O 資源來實現的

可編程邏輯

PL結構
基於Artix-7和Kintex-7的FPGA組件。github

  • 可配置邏輯塊(CLB, Configurable Logic Block):由兩個邏輯片和一個緊鄰的開關矩陣組成。
    • 片(Slice):有實現組合和時序邏輯電路的資源,由4個查找表、8個觸發器和其餘一些邏輯組成。
      • 查找表(LUT, Lookup Table)
      • 觸發器(FF, Flip-flop):一個實現1 位寄存的時序電路,帶有復位功能。
    • 開關矩陣(Switch Matrix):鏈接CLB 內的單元,或把一個CLB 與PL 內的其餘資源鏈接起來。
      CLB組成
  • 輸入輸出塊(IOB, Input/Output Block),50個IOB一組,分爲高性能(HP, High Performance)或高範圍(HR, High Range)
  • DSP48E1:用於高速算數
  • 塊RAM:知足密集存儲須要,最多存儲36KB的信息
  • 通訊接口GTX收發器,包括一個PCI Express塊
  • XADC:專用的模數轉換器,由PS裏的PS-XADC接口控制塊實現。
  • 時鐘:PL 接收來自PS 的四個獨立的時鐘輸入,另外還能產生和分發它本身的與PS 無關的時鐘信號。

處理器系統與可編程邏輯的接口

  • AXI接口
    ZYNQ中鏈接PS和PL兩部分採用高度定製的AXI(Advanced eXtensible Interface)互聯和接口。
    PS和PL的AXI互聯接口
    • 接口分爲主機和從機,按照慣例,主機是控制總線併發起會話的,而從機是作響應的。
    • 通用AXI(General Purpose AXI):32 位數據總線,適合PL 和PS 之間的中低速通訊。總共有四個通用接口:兩個PS 作主機,另兩個PL 作主機。
    • 加速器一致性端口(Accelerator Coherency Port):總線寬度爲64 位,用來實現APU cache 和PL的單元之間的一致性。PL 是作主機的。
    • 高性能端口(High Performance Ports):數據寬度是32 或64 位,帶有FIFO緩衝來提供「 批量」 讀寫操做,並支持PL 和PS 中的存儲器單元的高速率通訊。在全部四個接口中PL 都是作主機的。
  • EMIO接口
    從PS 出來,有幾種鏈接能夠經由PL 到外部接口上,這被稱做擴展的MIO(Extended MIO),即EMIO。
    EMIO接口
    • 經EMIO 的接口直接鏈接到所需的PL 的外部引腳上的,由一個約束(描述)文件中的條目所指定的。在這個模式下,EMIO 能夠實現額外的64 個輸入線和64 個帶有輸出始能的輸出線。
    • 用EMIO 來鏈接PS 和PL 裏的外設模塊。

ZYNQ設計層次

ZYNQ設計層次

  • 功能劃分
    軟件(在PS 端)經常用來完成一些通常性的順序執行的任務,好比操做系統、用戶應用程序以及圖形界面;PL端主要實現數據流計算的任務和具備並行限制的軟件算法。
  • 硬件開發和測試
    • Vivado IDE開發套件,IP庫
    • 配置PS
    • 在PL上設計和實現外部模塊和邏輯單元
  • 軟件開發和測試
    軟件系統能夠被認爲是創建於基於硬件的系統上的一個棧。
    • 板級支持包(BSP):提供底層的驅動和函數供下一層(操做系統)使用和硬件通訊。BSP根據基礎硬件系統進行調整。
    • 操做系統
    • 軟件應用
  • 系統集成和測試
    利用軟硬件交叉觸發器進行嵌入式聯合調試。這一過程將PL 上的ILA(Integrated Logic Analyzer)的硬件調試核心和Zynq PS 端的FTM(Fabric Trace Module)經過一對輸入輸出信號進行鏈接。

ZYNQ小實驗(Advanced-Embedded-System-Design-Flow-on-Zynq)

準備工具

  • lab1:搭建簡單的嵌入式系統
    • 本實驗利用集成的IP核搭建了PYNQ板上leds、buttons和switches的外部接口,將生成的比特流導入到SDK中,使用c語言編寫程序,控制板子上的leds、buttons和switches。
    • SDK方式和Jupyter notebook方式的區別:SDK方式是使用C或C++語言對ZYNQ進行開發,Juputer notebook是在PYNQ上利用python語言開發。
  • 拓展1:在jupyter notebook中控制leds、buttons和switches
    • 啓動PYNQ,將vivado生成的比特流文件(.\lab1\lab1.runs\impl_1\design_1_wrapper.bit)和硬件描述文件(.\lab1\lab1.srcs\sources_1\bd\design_1\hw_handoff\design_1.hwh)拷貝至PYNQ的系統文件目錄下,並將兩個文件的名稱改成lab1.bit和lab1.hwh。
    • 在文件目錄下啓動一個python3的編譯環境,輸入並執行代碼。
from pynq import Overlay
from pynq.lib.axigpio import *
ol = Overlay("lab1.bit")
ol.download()
print(ol.ip_dict.keys())
btn = ol.buttons
sw = ol.switches
led = ol.leds

btn.setdirection(AxiGPIO.Input)
sw.setdirection(AxiGPIO.Input)
led.setdirection(AxiGPIO.Output)
led.write(4, 0xf)

print("-- Press any of BTN0-BTN3 to see corresponding output on LEDs --\r\n")
print(("-- Set slide switches to 0x03 to exit the program --\r\n"))
while not sw.read(0) & 0xf == 0x3:
    mask = btn.read(0) & 0xf
    led.write(0, mask)
print("-- End of Program --\r\n")
  • 拓展2:利用verilog製做gpio的ip核
  • lab2:使用VIO(virtual input/output)和ILA(integrated logic analyzer)調試硬件
    • 本實驗利用集成的VIO和ILA IP核在lab1實驗的基礎上搭建硬件調試平臺。利用ILA(Integrated Logic Analyzer)來檢測led輸出信號;利用System ILA檢測定製math IP的S_AXI接口;利用VIO模擬math ip的輸入輸出信號。
    • VIO的使用:能夠在vivado硬件管理界面手動控制和觀察VIO模塊的輸出和輸入,用於測試已經在硬件中實現的ip核的功能
    • ILA的使用:能夠在vivado硬件管理界面設置觸發條件,捕捉硬件端口或AXI接口的波形信號,同時也能在觸發後暫停軟件程序(主要用於debug中)。
  • lab3:使用塊RAM擴展內存
    • 本實驗在硬件電路中例化了一個集成的BRAM IP核,在SDK開發環境中,程序默認跑在BRAM中。能夠發現程序比跑在ddr中快了若干倍。
  • lab4:使用CDMA(AXI Central Direct Memory Access)直接訪問內存
    • 本實驗在硬件電路中例化了一個CDMA模塊,實現了從DDR到BRAM、從DDR到DDR和從BRAM到DDR搬運數據,測試了分別採用正常方式和CDMA模塊的方式的快慢。結果代表在大數據的搬運中,採用DMA可以實現更快的搬運速度。
  • lab5:ZYNQ啓動方式的配置
    • ZYNQ啓動方式能夠配置爲SD卡啓動、QSPI flash啓動。
    • 理解ZYNQ啓動過程、FSBL
  • lab6:程序分析與性能優化
    • 在SDK中能夠對程序進行profile,分析程序中不一樣函數的運行次數和運行時間,對較長時間的軟件功能函數能夠考慮利用硬件實現。

高層次綜合(HLS)

HLS大實驗(High-Level-Synthesis-Flow-on-Zynq-using-Vivado-HLS)

  • lab1:Vivado HLS設計流程
    • 本實驗完整的描述了利用HLS生成IP核的步驟,包括C調試和仿真、C綜合和C&RTL聯合仿真。另外分析綜合報告來了解硬件時延和邏輯資源消耗,分析仿真波形來驗證程序功能。
  • lab2:性能優化設計
    • 優化指令以#pragma語句的形式嵌入到源代碼中。
    • TRIPCOUNT:爲了幫助在綜合時對循環延遲進行估計,Vivado HLS提供了一個TRIPCOUNT指令,該指令容許限制用戶指定的變量的邊界。
    • PIPELINE:PIPELINE指令必須應用於每一個函數中最內層的循環——最內層的循環是非變量有界的循環,而外層的循環只會向內層循環提供數據。
    • DATAFLOW:當執行DATAFLOW優化,自動在函數之間插入內存緩衝區,以確保下一個函數完成以前就能夠開始操做以前的函數。容許內存緩衝區包括乒乓緩衝區(默認,能夠隨機訪問緩存數據)和FIFO。
  • lab3:內存和資源的優化設計
    • PIPELINE:當PIPELINE指令應用於外循環時,將自動致使內循環展開(unroll)而且並行處理(若是能夠的話),致使資源利用率的增長。
    • Partition和RESHAPE:RESHAPE指令將容許對BRAM進行屢次訪問,可是,若是單個元素須要修改,則須要當心,由於它將致使對整個字節的讀-修改-寫操做。
    • INLINE:當INLINE指令應用於函數時,較低層的層次結構將自動分解並內聯到上層函數。
    • DATAFLOW:只在頂級循環和函數上進行優化。
  • lab4:IP-XACT實例
    • 以實際工程來訓練上述實驗中的要點,最後生成一個FIR濾波器的IP核並例化進工程,實現對輸入音頻的濾波做用。