1. 程式人生 > >SDSoC軟硬體協同設計流程系列——4.搭建SDSoC Platform

SDSoC軟硬體協同設計流程系列——4.搭建SDSoC Platform

SoC Platfrom定義了基本的硬體和軟體架構以及應用程式的執行環境,本節從硬體和軟體兩方面,介紹SDSoC Platform如何在SDSoC中被呼叫然後說明如何搭建自己的SDSoC Platform。一個SDSoC Platform應該包含如下檔案:

硬體資料夾,裡面包含Device Support Archive file,DSA檔案定義了Zynq的PL部分, 在編譯時SDSoC利用DSA檔案包含的資訊重新構建硬體工程,並以此為基礎舔加演算法加速器。 軟體資料夾,包含 系統配置和處理器域,定義了系統啟動順序以及每顆CPU上執行的作業系統 啟動相關檔案,如fsbl.elf,u-boot.elf,如果是linux系統還需要提供裝置樹,核心,ramdisk或image.ub(裝置樹,核心,ramdisk的集合)啟動相關檔案,如fsbl.elf,u-boot.elf,如果是linux系統還需要提供裝置樹,核心,ramdisk或image.ub(裝置樹,核心,ramdisk的集合) Prebuild Hardware(可選),包括了位元流,.hdf等檔案,如果程式裡沒有硬體加速函式,SDSoC將跳過呼叫Vivado生成位元流的步驟直接使用預先生成的檔案以加快編譯速度。Prebuild Hardware(可選),包括了位元流,.hdf等檔案,如果程式裡沒有硬體加速函式,SDSoC將跳過呼叫Vivado生成位元流的步驟直接使用預先生成的檔案以加快編譯速度。 庫的標頭檔案以及靜態庫(可選)庫的標頭檔案以及靜態庫(可選) Metadata檔案,用來組織上面提到的檔案Metadata檔案,用來組織上面提到的檔案 Sample Application(可選)Sample Application(可選) SDSoC Hardware Platform

上圖是PYNQ SDSoC Platform硬體部分的基礎平臺,裡面只有系統復位(Processor System Reset)模組和時鐘嚮導(Clocking Wizard)模組。在SDSoC中可以指定硬體加速器的時鐘頻率,如100M、142M、166M和200M,這些頻率並不是憑空產生的,而是在Platform的時鐘嚮導模組中指定的,如果想要其他頻率可以在時鐘嚮導中新增。

上圖是reVISION 的案例平臺zcu102_rv_ss Platform硬體部分的基礎平臺,除了包含系統復位模組和時鐘嚮導模組之外,還包含了MIPI介面和HDMI介面。zcu102_rv_ss提供了一個光流演算法的案例,輸入是MIPI攝像頭,輸出是DisplayPort介面(DP介面是連線到PS上的),在SDSoC中無法編寫MIPI介面的控制邏輯,所以這部分邏輯是在建立SDSoC平臺時準備好的。所有用到MIPI介面的工程都可以使用該基礎平臺,使用SDSoC工具我們可以很容易地在該基礎平臺上實現不同的演算法。

最終載入進PL的位元流由圖3所示工程生成的(路徑:Debug/sds/p0/_vpl/ipi/syn),該工程在圖1的基礎上添加了若干IP,包括:

io:呼叫HLS產生的演算法加速IP。 Constant:某些IP的某些介面需要一直為1/0。 Adaptor:AXI介面在在direct模式下控制訊號以及資料需要通過Adaptor轉換再連線到演算法加速IP上。 AXI Interconnet:Adaptor的AXI介面不能直接與PS的AXI介面相連,需要通過AXI Interconnect轉接。 建立自己的SDSoC Hardware Platform 開啟Vivado IDE並建立一個工程 Vivado沒有提供PYNQ的Board file,將我們提供的PYNQ board file拷貝到{Xilinx_Vivado}\data\boards\board_files路徑下 開啟Vivado IDE,在 Quick Start下點選Create Project,點選Next,輸入工程名PYNQ和工程路徑,點選Next

Project Type保持預設RTL Project,點選Next,跳過Add Sources和Add Constraints Defualt Part介面下選擇PYNQ-Z2

點選Next,檢查後點擊Finish 建立一個IP Integrator設計 在Flow Navigator –> IP Integrator, 選擇Create Block Design.

在Create Block Design對話方塊中為Block Design指定一個名稱,在這裡設定為PYNQ

在Block Design畫布右鍵選擇Add IP

搜尋框內輸入zynq找到ZYNQ7 Processing System IP

在IP catalog中選擇ZYNQ7 Processing System IP,按下回車將其新增到Block Design中。

在IP integrator介面下單機Run Block Automation,如下圖所示

Run Block Automation對話方塊開啟後如下圖所示,這個對話方塊表示FIXED_IO和DDR介面會被建立,Apply Board Preset選項通用會被勾選。在board file資料夾PYNQ目錄下有一個preset.xml檔案,裡面提供了PS部分的基本配置,如DDR的設定。

點選OK,在IP integrator diagram會出現如下的圖形

Running Block Automation 之後Zynq-7000 AP SoC Processing System,注意載入preset之後要檢查TTC模組,QSPI模組,UART模組,Eth模組有沒有被使能,這些模組是Petalinux正常執行所必需的。 右鍵Add IP,輸入proc sys res找到Processor System Reset,按回車將這些模組新增到Block Diagram中,重複三次該操作,最終在Block Diagram中應該有四個Processor System Reset 相似地,新增Clocking Wizard和Concat IP,以上步驟執行之後Block Diagram應跟下面這張圖比較相似

雙擊Zynq IP開啟配置引導介面,在Re-customize IP對話方塊中執行如下操作

PS-PL Configuration-> AXI Non Secure Enablement-> GP Master AXI Interface取消勾選M AXI GP0 interface

Interrupts->勾選Fabric Interrupts->PL-PS Interrupt Ports,勾選IRQ_F2P[15:0],點選OK退出

雙擊Clocking Wizard進入配置介面,選擇Output Clocks選項卡,勾選clk_out2,3,4並按照下圖配置頻率,這些頻率就是最終在SDSoC平臺中可以選擇的頻率。

在該頁面下向下滑動,將Reset Type設定成Active Low,點選OK關閉該介面。

雙擊Concat IP,將Number of Ports設定為1,Re-customizing IP之後的Block Diagram應如下圖所示。

下面開始手動連線

clk_wiz_0/ clk_in1與ZYNQ7 PS/ FCLK_CLK0,clk_wiz_0/clk_out1與proc_sys_reset_0/ slowest_sync_clk相連,以此類推連線所有PSR的slowest。 將ZYNQ7 PS/FCLK_RESET0_N,Clocking Wizard/resetn,所有PSR/ext_reset_in相連 將Clocking Wizard的locked與所有PSR的dcm_locked相連。 將Concat的dout[0:0]與ZYNQ7 PS的IRQ_F2P[0:0]相連。 點選Regenerate Layout按鈕重新生成Block Diagram的佈局。

右鍵bd檔案,點選Generate Output Products-> Synthesis Options->Global,點選Generate

然後右鍵bd檔案,點選Create HDL Wrapper,生成HDL Wrapper。 設定Platform屬性 完成Vivado設計套件中的硬體平臺設計專案後,必須完成新增平臺屬性(PFM)定義平臺名稱並配置平臺介面如時鐘,中斷和匯流排介面。這些屬性被設定一次並存儲在工程中。平臺通常由多個時鐘組成。在當前專案中,我們的設計包含四個用Clocking Wizard生成不同的時鐘,使用者可以在SDSoC中選擇要被硬體加速的函式的時鐘頻率。同理,在SDSoC中被用到的AXI埠也要標註,硬體加速函式會用這些被標註的AXI埠來建立Data motion network。

上圖所示的Block Diagram中S_AXI_HP0被兩個VDMA佔用,那麼這個AXI埠就不再可以被SDSoC呼叫。這些AXI埠在Block Diagram中可能不可見(在該Block Diagram中只能看到S_AXI_HP0),但是隻要平臺屬性裡標註好就可以被SDSoC中的硬體加速函式使用。

平臺屬性(PFM_NAME)必須定義Vendor, Library, Name, and Version (VLNV),在Tcl Console中輸入如下指令並按回車,設定SDSoC Hardware Platform的名稱。 set_property PFM_NAME "xilinx.com:PYNQ:PYNQ:1.0" [get_files PYNQ.bd] 1 PFM_NAME屬性按照下面的格式

<vendor>:<library>:<platform>:<version> 1 使用者可以匯出平臺內的任何時鐘源,但是被匯出的時鐘源要搭配一個Processor System Reset IP。PFM.CLOCK屬性可以設為BD cell,外部埠或者外部介面。比如在本設計中時鐘源來自Clocking Wizard的四個輸出,也可以選擇PS的FCLK_CLK0~3作為時鐘源。輸入如下指令並按回車,設定SDSoC Hardware Platform的時鐘。 set_property PFM.CLOCK {\ clk_out1 {id "0" is_default "false" proc_sys_reset "proc_sys_reset_0"} \ clk_out2 {id "1" is_default "true" proc_sys_reset "proc_sys_reset_1" } \ clk_out3 {id "2" is_default "false" proc_sys_reset "proc_sys_reset_2"} \ clk_out4 {id "3" is_default "false" proc_sys_reset "proc_sys_reset_3"} \ } [get_bd_cells /clk_wiz_0] 1 2 3 4 5 6 定義AXI埠 set_property PFM.AXI_PORT { \ M_AXI_GP0 {memport "M_AXI_GP"} \ M_AXI_GP1 {memport "M_AXI_GP"} \ S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory "ps7 ACP_DDR_LOWOCM"} \ S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" memory "ps7 HP0_DDR_LOWOCM"} \ S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" memory "ps7 HP1_DDR_LOWOCM"} \ S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory "ps7 HP2_DDR_LOWOCM"} \ S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory "ps7 HP3_DDR_LOWOCM"} \ } [get_bd_cells /ps7] 1 2 3 4 5 6 7 8 9 SDSoC產生的中斷需要通過Concat模組轉接到Zynq7000系列的F2P_irq埠 set intVar [] for {set i 0} {$i < 16} {incr i} { lappend intVar In$i {} } set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0] 1 2 3 4 5 生成HDL設計檔案 File->Export->Export Hardware勾選include bitstream,點選OK,這一步的目的是生成.hdf檔案,後面Petalinux會用到這個檔案。 打包DSA檔案 將所有檔案打包成DSA檔案,在Tcl Console中輸入下面指令 write_dsa –force <path_to_project>/PYNQ.dsa -include_bit 1 注意,SDSoC Hardware Platform的名稱,即PFM_NAME下的要與Vivado工程名,block diagram名以及dsa檔名保持一致以免出現不必要的麻煩,在本教程中所有的名稱都是PYNQ。

驗證DSA檔案的正確. validate_dsa <path_to_project>/PYNQ.dsa 1 SDSoC Software Platform Zynq啟動時需要的檔案包括kernel,device-tree,u-boot和fsbl,如果與PL部分相關,還需要.bit檔案,這些檔案除了.bit檔案都可以由Petalinux生成,其中image.ub檔案包含了kernel以及device-tree。

Petalinux 簡介 PetaLinux 是Xilinx 提供的工具鏈, 用於生成Linux 核心映像, 根檔案系統和ZYNQ 的核心模組, 例如帶有可程式設計硬體的嵌入式系統(用於FPGA 部分中的不同硬體設計)。使用PetaLinux工具鏈, 我們可以輕鬆地為ZYNQ PS 構建核心和模組, 而無需使用單獨的交叉編譯工具。使用PetaLinux 的一個缺點是, 每個PetaLinux 版本都帶有特定的Linux 核心版本。例如PetaLinux2017.4 帶有4.9 的預設核心版本。賽靈思提供了一種方法來改變Petalinux 使用的預設核心版本, 讀者可以通過百度搜索輕鬆找到它, 在此不贅述。注意:對於特定的硬體設計,PetaLinux 工具可以生成U-Boot 檔案, 第一階段啟動載入程式(FSBL)和BOOT.BIN。使用Xilinx SDK 可以完成同樣的事情。

環境要求 2017.4/2018.2 版本的工具鏈(包括Vivado,SDSoC,Petalinux)跟之前的版本有很大區別, 因此強烈建議版本與本文保持一致。此外,SDSoC,Vivado,Petalinux必須版本一致,本文在2017.4、2018.2均測試通過。

Ubuntu16.04 的PC SD 卡(8GB 或更大) SD 卡讀卡器 搭載ZYNQ 系列處理器的板卡, 本文在PYNQ 上測試通過 裝有Vivado2018.2的PC,Windows/Linux 均可 安裝Petalinux Petalinux必須安裝在Linux系統上,下面提供在Ubuntu16.04上安裝的步驟 Petalinux2017.4 版本下載連結: https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-designtools/2017-4.html 讀者可以直接到Xilinx官網查詢 $ sudo apt-get install gawk xvfb chrpath socat autoconf libtool git texinfo zlib1g-dev zlib1g-dev gcc-multilib libsdl1.2-dev libglib2.0-dev zlib1g-dev libncurses5-dev libssl-dev zlib1g:i386 –y 1 安裝Petalinux 依賴的庫

$ sudo mkdir -p /opt/pkg/petalinux $ cd /opt/pkg/ $ sudo dpkg-reconfigure bash 1 2 3 UG1144 中提到所用到的/bin/sh 命令都需要是bash, 而Ubuntu 預設的/bin/sh 是dash, 在彈出介面選“否”來禁用dash, 選擇bash

$ sudo chown USERNAME:users petalinux/ -R 1 USERNAME 替換成Ubuntu 的使用者名稱,Petalinux 不能在root 許可權下安裝,,所以需要chown

$ cd <PATH to petalinux-v2017.4-final-installer.run> $ ./petalinux-v2017.4-final-installer.run /opt/pkg/petalinux 1 2 等待一段時間來到了Agreement 部分, 按Enter 進入協議文字, 按q 退出協議文字, 輸入y 同意協議, 進入下一條協議, 若干次之後, 就進入安裝部分, 再等待一段時間Petalinux 就安裝完成了

$ source /opt/pkg/petalinux/settings64.sh 1 每次使用petalinux之前要先設定環境

使用PetaLinux 為SDSoC Hardware Platform 生成image 按照上一章介紹的方法生成PYNQ 的SDSoC Hardware Platform 的Vivado 工程, 生成bitstream。然後File->Export->Export Hardware, 勾選include bitstream, 在工程目錄.sdk 資料夾下可以找到一個.hdf 檔案(硬體描述檔案)。 建立Petalinux工程 $ petalinux-create –type project –template zynq –name PYNQ 1 新建Petalinux 工程, 命名為PYNQ,會自動生成一個名為PYNQ的資料夾

$ cd PYNQ/ 1 將第一步中.hdf 檔案複製到PYNQ 資料夾下

$ petalinux-config –get-hw-description ./ 1 獲取硬體描述檔案, 然後會彈出一個圖形介面

配置system config DTG Settings->Kernel Bootargs->generate boot args automatically 取消勾選該選項 手動將bootargs 設定成 console=ttyPS0,115200 earlyprintk quiet 1 

配置核心 $ petalinux-config -c kernel 1 Device Drivers->Generic Driver Options->Size in Mega Bytes(256) Device Drivers->Staging drivers (ON)->Xilinx APF Accelerator driver (ON)->Xilinx APF DMA engines support (ON) 儲存並退出 

手動新增裝置樹 開啟/project-spec/metauser/recipes-bsp/device-tree/files/system-user.dtsi, 新增如下幾行 /{ xlnk { compatible =“xlnx,xlnk-1.0”; }; }; 1 2 3 4 5 

編譯工程 $ petalinux-build 1 編譯結束後在images/linux下找到zynq_fsbl.elf, u-boot.elf, image.ub, 這些檔案之後會用到。

SDSoC Platform 前兩節我們已經準備好了搭建自己的SDSoC Platform所需要的檔案,下面我們將介紹如何將這些檔案組織成一個SDSoC Platform。一個典型的SDSoC Platform檔案結構如下

建立自己的SDSoC Platform 新建一個資料夾命名為boot,將上一節生成的zynq_fsbl.elf改名為fsbl.elf,和u-boot.elf檔案放到該資料夾下,然後新建一個linux.bif檔案,輸入以下內容 /* linux */ the_ROM_image: {   [bootloader]<linux/boot/fsbl.elf>   <bitstream>   <linux/boot/u-boot.elf> } 1 2 3 4 5 6 7 開啟SDSoC新建一個工程,Project type選擇Platform Project,然後找到dsa檔案,工程會自動命名為dsa檔案的名稱 開啟該工程

SDSoC Platform Project 點選左下角Define System Configuration,新增以下內容

Define System Configuration boot directory裡包含了u-boot.elf,fsbl.elf,這兩個檔案將與SDSoC生成的.bit檔案打包在一起生成BOOT.BIN檔案。

Add Processor Group/Domain

Add Processor Group/Domain 這一步完成點選Generate Platform和Add to Custom Repositories將使該Platform可以被SDSoC工具找到。至此我們就完成了搭建最基礎的SDSoC Platform的流程,下一章將介紹如何將SDSoC應用到實際專案中。

歡迎大家關注Xilinx學術合作以及Pynq的官方公眾號,裡面有許多優質的學習資源等著你哦

希望瞭解HLS的同學可以關注公眾號Xilinx學術合作以及PYNQ中文社群獲取最新版《FPGA並行程式設計-- 以HLS實現訊號處理為例》pdf ,關注任一公眾號,回覆 pp4fpgas 即可獲得

閱讀更多 ---------------------  作者:lulugay  來源:CSDN  原文:https://blog.csdn.net/lulugay/article/details/83242883  版權宣告:本文為博主原創文章,轉載請附上博文連結!