1.1 xilinx zynqMp 架構
1.1.1 16nm 級別工藝
Zynq UltraScale+ MPSoC架構
Xilinx新一代Zynq針對控制、圖像和網絡應用推出了差異化的產品系,這在Xilinx早期的宣傳和現在已經發布的文檔里已經說得很清楚了。她的產品系如圖2所示。
圖2 產品表
從圖2看到,這個系列的Zynq算是8核(或9核)異構產品:四核的ARM-CortexA53 CPU、雙核的Cortex-R5 RPU、Mali-400 GPU(一個Geometry核,兩個像素核)、PL邏輯以及視頻編解碼器Codec核。
在表2中,ZU2E、ZU3E為針對控制類應用,邏輯和Block RAM資源較少,沒有Video Codec和高速收發器。ZU4E、ZU2E和ZU7E針對視頻類應用,有內部的UltraRAM資源、Video Codec和GTH高速收發器。其他型號針對網絡應用,除了Video Code沒有外,其它高大上的東西都有,比如更高速的收發器GTY,還有150G Interlaken和100G Ethernet MAC/PCS/RS-FEC等。
熊貓君是做圖像的,下面的描述都是針對圖像版的Zynq UltraScale+而言的。
因為PS部分的資源是固定的,大家都一樣,在后面一起說就行。PL部分因為有這三個東西,將使設計如虎添翼:
a)大量的Block RAM和Ultra RAM資源,小20Mb的內部RAM資源,對分塊處理圖像,那應該會帶來不少的便捷;
b)Video Code:這個東西是集成在PL側的硬核,有了它,圖像壓縮和解壓縮都不用愁了;
c)GTH:PL端集成的GTH收發器,對SDI、DP等圖像接口接入那是十分的方便,當然也可以做PCIe咯。
不多說了,熊貓君從Xilinx官方文檔UG1085上截一個圖來表示這個高大上通用SoC的系統級架構,也就是下面的圖3啦。
圖3 Zynq UltraScale+ MPSoC系統架構圖
http://blog.csdn.net/haoxingheng/article/details/50098777
時隔三年,Xilinx推出了其全新的異構SoC,大名叫ZynqUltraScale+。相比它的前輩Zynq-7000,這款SoC功能顯得更加強勁:最顯著的變化是新加入了GPU和視頻編解碼器,而且編解碼器在PL端,PS端的高速接口更加豐富。按照Xilinx官方的說法,Zynq UltraScale+主要針對控制、圖像和網絡這三大塊,比如說汽車輔助駕駛、8K圖像、100G網、物聯網等等領域(兵馬未動,糧草先行啦,Xilinx早早的就針對這些差異化應用推出了SDx集成開發環境)。
從圖4可以看到,這是一個帶SDI接口的IP相機。大致分為兩大塊:
a)PL負責原始數據采集、Bayer域處理、ISP和圖像編碼;
b)PS負責對PL的管理、控制和協處理、RTSP服務器、千兆網和SD卡數據存儲。
http://blog.csdn.net/haoxingheng/article/details/50076591
1.2 xilinux zynqMp 開發環境搭建
1.2.1 移植petaLinux之安裝petalinux
-
start.安裝虛擬機,在虛擬機里安裝linux系統(ubuntu16)
- 虛擬機里磁盤盡量留大點,建議60G,我的是80G
sudo passwd
命令,設置超級用戶su時的密碼- 建議安裝VMware Tools
- 開發工具:vivado2017.1(Windows下) + petalinux 2017.1(Linux下)
-
a.更新apt-get(可選,加速用,同傳統方式移植那篇文章的第二節)
-
b.安裝petalinux的依賴環境
安裝petalinux的必要依賴環境,直接復制粘貼下面的命令行到shell中,系統自動下載安裝下面的工具:sudo apt-get install build-essential vim tofrodos \
iproute2 gawk gcc git make net-tools zlib1g-dev \
libssl-dev flex bison libselinux1 libncurses5-dev \
tftpd lib32z1 lib32ncurses5 libbz2-1.0:i386 \
lib32stdc++6 xvfb chrpath socat autoconf libtool -
c.修改/bin/sh
shell中輸入:dpkg-reconfigure dash
,在出現的界面中選擇‘否’ -
d.下載petalinux
去官網下載petalinux-v2017.1-final-installer.run
(文件8個G,上傳不了) -
e.安裝petalinux
- 在一個用戶目錄下(我的是:
home/hlf/mnt
),用鼠標右鍵,新建一個文件夾petalinux
- 在普通用戶下(非root模式下,即命令行是:
hlf@hlf-virtual-machine:~/mnt$
這樣的),shell中輸入命令:./petalinux-v2017.1-final-installer.run ./petalinux
- 經過漫長的等待,安裝到一半的時候,提醒查看許可,按回車查看,按q退出,退出后輸入y,回車,如此重復三次,才開始正式安裝(這個步驟要很小心,如果沒有輸入y,就回車,就要重新了)
- 安裝的時候提示,提示有幾個庫沒裝,不過沒關系,等petalinux安裝完之后,再補也不遲,靜候一直到安裝完畢
- 在一個用戶目錄下(我的是:
-
f.補一些庫的安裝
- 懶人直接只看這一點即可(可以跳過下面兩點),把下面命令粘貼到shell中回車即可:
apt-get install texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev zlib1g:i386 libncurses5 libncurses5-dev libc6:i386 libstdc++6:i386 zlib1g:i386 libssl-dev tftpd tftp openbsd-inetd
-
先安裝剛剛安裝時,提示缺少的庫:
apt-get install texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev zlib1g:i386
-
安裝一些之后需要的庫,全都安裝了避免麻煩:
- 在運行petalinux-config -c kernel會出現錯誤,需安裝:
apt-get install libncurses5 libncurses5-dev
- 編譯時可能會出現錯誤arm-xilinx-linux-gnueabi-gcc: Command not found,需安裝:
apt-get install libc6:i386 libstdc++6:i386 zlib1g:i386
- 提示缺少zlib和openssl,需安裝:
apt-get install libssl-dev
- 出現警告(警告而已,強迫症可以處理一下),提示No tftp server found - please refer to “PetaLinux SDK Installation Guide” for its impact and solution,需安裝:
apt-get install tftpd tftp openbsd-inetd
,安裝完成后,編輯一下/etc/inetd.conf里的東西:
直接shell中輸入gedit /etc/inetd.conf
,打開了文件,並在文件最后一行增加:tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftproot
然后保存並退出 ,之后再進行一些簡單操作:mkdir /tftproot
chmod 777 /tftproot
/etc/init.d/openbsd-inetd restart
輸入netstat -an | more | grep udp
命令,以確定成功(打印出udp 0 0 0.0.0.0:69 0.0.0.0:*
)
- 在運行petalinux-config -c kernel會出現錯誤,需安裝:
- 懶人直接只看這一點即可(可以跳過下面兩點),把下面命令粘貼到shell中回車即可:
-
g.驗證是否安裝成功
source /home/hlf/mnt/petalinux/settings.sh
成功定位不報錯的話,基本是成功了的echo $PETALINUX
命令行會打印出安裝路徑/home/hlf/mnt/petalinux
1.2.2 搭建硬件環境
新建工程,選擇對應的芯片型號,並新建一個 BD 原理圖文件(命名為system),然后添加一個ZYNQ Processing system的IP核,並設置好與硬件相符合的PS和PL時鍾以及DDR型號
然后右鍵單擊 Block 文件,文件選擇 Generate the Output Products,然后右鍵單擊 Block 文件,選擇 Create a HDL wrapper,根據 Block 文件內容產生一個 HDL 的頂層文件,並選擇讓 vivado 自動完成
經Vivado綜合,實現后,在Vivado中導出硬件,輸出PetaLinux所需要的硬件描述文件
輸出的文件就在“/(工程文件夾)/(工程名).sdk”這個文件夾下,這個文件夾下的system_wrapper.hdf待用
1.2.3 搭建petalinux bsp工程
-
a.定位目錄
先在shell中找一個准備存放工程的地方,(我的是home/hlf/PRO
),命令行cd home/hlf/PRO
-
b.定位編譯鏈
根據安裝petalinux的路徑:source /home/hlf/mnt/petalinux/settings.sh
-
c.創建petalinux工程
將在PRO目錄下面,創建一個工程:petalinux-create --type project --template zynq --name h1_petalinux_test
h1_petalinux_test是工程名,該命令會自動在PRO文件夾里創建h1_petalinux_test文件夾 -
d.引用剛才輸出的硬件描述文件
把之前導出的硬件描述文件system_wrapper.hdf拷貝到虛擬機中的h1_petalinux_test工程文件夾下,然后:petalinux-config --get-hw-description=/home/hlf/PRO/h1_petalinux_test
會進入一個配置界面,在里面我們可以配置一些系統參數,主要的配置包括:啟動方式,啟動存儲器分區表,啟動文件名稱等等,本文暫不對其修改(默認是從SD卡中啟動),然后等待其配置(時間較長) -
上圖可以進行基本項配置,
-
e.獲取文件夾權限
在上一步完成后,輸入命令sudo chmod -R 777 /home/hlf
獲取文件夾權限(工程文件夾和petalinux的安裝文件夾),否則編譯的時候,會發生錯誤 -
目前為止,在shell中的命令既可以以超級用戶su的身份運行也可以以普通用戶的方式運行(建議全部都用普通用戶的方式,免得切換),但是等下編譯u-boot和kernel以及rootfs的時候,必須以普通用戶的身份運行命令行,否則會報錯的
-
f.編譯u-boot
注意:到此處的時候,不能再用超級用戶了,要切換到普通用戶下,之后的所有操作都在普通用戶下
普通用戶的shell中輸入petalinux-config -c u-boot
(依然要事先輸入source /home/hlf/mnt/petalinux/settings.sh
命令),然后等待GUI出來,這里暫時不改動啥,直接save(save為u-boot.config
,名字隨便取但不要留空),然后繼續等(新建工程要等的時間還是比較長的,后來就會好的) -
-
g.編譯kernel
命令petalinux-config -c kernel
,操作同上(save為kernel.config
) -
h.編譯rootfs
命令petalinux-config -c rootfs
,操作同上(save為默認即可) -
i.設備樹配置
若要修改,直接在工程文件夾下,Ctr+F搜索.dts
就可以找到相關文件,做出相應修改”
暫時默認吧,不修改,按照它自動生成的設備樹 -
j.編譯工程
配置完成后可以生成適配該硬件的fsbl,u-boot,kernel,rootfs等文件, 輸入命令petalinux-build
,等待即可,最后生成的文件在 image/linux下 -
k.生成BOOT.BIN
把shell定位到image/linux目錄下,執行命令petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga system_wrapper.bit --u-boot
,在文件夾下就可以發現,多了一個BOOT.BIN -
l.將如下文件拷入SD卡
-
m.開機
將SD卡,插回,開機,串口打印信息為:
....
n。生成完啟動文件后可以進行模擬適配
如果不想連接開發板可以先用模擬題運行u-boot,kernel,看看是不是正確
petalinux-boot –qemu –u-boot
petalinux-boot –qemu –kernel
密碼:root
如果模擬器運行沒問題就可以用jtag下載到zynq板子上進行后續調試了,命令參看ug1157-petalinux-tools-command-line-guide
http://blog.csdn.net/zhaoxinfan/article/details/57530627
http://blog.csdn.net/long_fly/article/details/78727813
1.3.Xilinx zynqMP開發基本步驟
a)使用Vivado 工具生成 .hdf文件,比如ZU9_cpu.hdf
b)使用SDK工具生成FSBL。FSBL的作用主要是初始化PLL,DDR,MIO管腳分配,燒寫FPGA,運行uboot等。核心代碼代碼位於psu_init.c中。
c)生成uboot
d)使用bootgen工具生成BOOT.BIN文件,bootgen需要使用.bif文件做輸入。bif指導那個文件用作輸入,targets等
//arch = zynqmp; split = false; format = BIN
the_ROM_image:
{
[fsbl_config]a53_x64
[bootloader]C:\cpu_test\cpu_test\cpu_test.sdk\fsbl\Debug\fsbl.elf
[destination_device = pl]C:\cpu_test\cpu_test\cpu_test.sdk\cpu_test_wrapper_hw_platform_0\cpu_test_wrapper.bit
[destination_cpu = a53-0]C:\cpu_test\cpu_test\cpu_test.sdk\uboot.elf
}
e)把BOOT.BIN,system.dtb和Image文件copy到SD卡第一分區,把rootfs解壓到SD卡ext4分區。
http://blog.csdn.net/ambercctv/article/details/69945902
1.3.1 zynq MP的啟動
(1)啟動過程
下圖時xilinx手冊上摘錄的圖,描述了zynqMP 上的linux的整個boot過程
系統復位后,首先PMU(Platform Management Unit)會執行PMU ROM中固化代碼,執行完后會啟動CSU處理核,CSU會負責從啟動存儲介質中加載FSBL(First Stage Boot Loader)至on-chip ram中,FSBL可以由RPU負責執行也可由APU負責執行,須在制作FSBL時確定。繼而,CSU激勵RPU或APU執行FSBL。FSBL會加載PMU Frameware交付PMU執行。繼而FSBL執行完成后切換至ATF(Arm Trusted Frame),ATF於APU上執行。然后ATF啟動u-boot,u-boot為linux配置好運行環境將執行權交付給Linux內核。
可以看出和Zynq-7000類似,ZynqUltraScale+ MPSoC也是三級啟動方式,只是Xilinx又給它們起了一個新名字,啟動分為以下三級:
a) Pre-configuration:復位后執行PMU ROM代碼,講外部FSBL代碼搬到內部的OCM。相當於Zynq 的Boot ROM執行。
b) Configuration:在內部的OCM代碼,系統根據BOOTHeader的內容選擇在CPU(Cortex-A53)還是RPU(Cortex-R5)上執行。負責初始化必要的時鍾、內存和外設,加載Bit文件和用戶代碼等。
c) Post-configuration:執行用戶代碼。
http://blog.csdn.net/haoxingheng/article/details/50099373
(2)啟動文件詳解
對於ZYNQ MPSoC有以下幾個文件,
a.FSBL
這個FSBL跟zynq-7000的fsbl是一樣的,用戶可以選擇用cortex-a53制作啟動的fsbl文件,也可以選擇用cortex-r5來制作啟動的fsbl文件。
b.PMUFW (pmufw.elf)
PMU的配置文件,但這個不是必須的,用戶是可選的,MPSOC有LPD.FPD.PL三路電源軌,PMU是為了更好的管理電源和控制功耗,一般情況下,大部分客戶不需要修改這個elf文件,這個文件不是制作BOOT.bin必須要的。
c.ARM Trusted Firmware(bl31.elf)
ARM Trusted Firmware文件,是一個arm加密固件,用戶根據需要來定制,這個文件不是制作BOOT.bin必須要的。
d.PL bitstream(design_1_wrapper.bit)
這是FPGA端的bit配置文件,用戶根據自己的需要來配置bit文件,這個文件不是制作BOOT.bin必須要的。
e.uboot(u-boot.elf)
uboot文件,目前我使用的是version是2016.7,制作BOOT.bin需要這個文件。
f.image.ub
這個文件是由petalinux-package --image 打包kernel rootfs device-tree這個三個文件合成的image.ub文件,也就是說,當你啟動mpsoc的時候,你最終只需要兩個文件BOOT.bin image.ub。
http://blog.csdn.net/luhao806/article/details/58591497
1.3.2 uboot 的生成
MPSOC系列基於ZCU102 uboot的編譯生成
查看board/xilinx/zynqmp/zynqmp.c 中board_late_init
這里需要檢查了zynqMP的啟動方式,並設置了環境參數 modeboot ,此次測試使用sd卡boot,故modeboot 會被設置為sdboot,故u-boot會執行run sdboot命令,其中sdboot 環境參數設置在include/configs/xilinx_zynqmp.h中定義,
此處還實現了TFTP形式的boot以及nfs文件系統,這里就不解釋TFTP Boot及nfs(xilinx默認配置是從sd卡第一分區(FAT格式)讀取devicetree以及Image實現boot,並以sd卡第二分區(ext4格式)作為系統的跟文件系統)。
uboot 生成:
cd $u-boot-xlnx-dir
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make distclean
make xilinx_zynqmp_zcu102_rev1_0_defconfig
make -j4 #-jn 為你要運行的核數
http://blog.csdn.net/baidu_23935667/article/details/79099803
or:
1)windows vivado sdk create uboot.bin
打開vivado工程並生成bit stream
導入到 sdk
打開sdk
創建預置的fsbl工程
Xilinx Tools>Creat Boot Image
選擇BIF file path
選擇Output path
在Boot image partitions中
add>fsbl.elf
add>XXX.bit
add>u-boot.elf
Creat Image
其中bif為路徑配置文件:
bif文件如下所示:
//arch = zynqmp; split = false; format = BIN the_ROM_image: { [fsbl_config]a53_x64 [bootloader]PROJECT_DIR/project_1.sdk/fsbl/Debug/fsbl.elf [pmufw_image]PROJECT_DIR/project_1.sdk/pmu/Debug/pmu.elf [destination_device = pl]PROJECT_DIR/project_1.sdk/design_1_wrapper_hw_platform_0/design_1_wrapper.bit [destination_cpu = a53-0, exception_level = el-3]PROJECT_DIR/project_1.sdk/bl31.elf [destination_cpu = a53-0, exception_level = el-2]PROJECT_DIR/project_1.sdk/u-boot.elf }
其中PMU、FSBL由SDK中生成
http://blog.csdn.net/aostas/article/details/78149300
2)petalinux 合成 boot.bin
INFO: File in BOOT BIN: "/home/luhao/xilinx/peta_project/xilinx-zcu102-2016.4/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/home/luhao/xilinx/peta_project/xilinx-zcu102-2016.4/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/home/luhao/xilinx/peta_project/xilinx-zcu102-2016.4/images/linux/u-boot.elf"
INFO: Generating zynq binary package BOOT.BIN...
INFO: Binary is ready.
1.3.3 MPSOC系列基於ZCU102的linux的kernel的編譯
cd linux-xlnx
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make xilinx_zynqmp_defconfig
make menuconfig make -j4 #-jn n為你要運行的核數
http://blog.csdn.net/baidu_23935667/article/details/79099803
or:
手頭必備的TRM UG1085(http://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)
寄存器手冊(http://www.xilinx.com/support/documentation/registers/ug1087/ug1087-zynq-ultrascale-registers.html)
http://blog.csdn.net/kkk584520/article/details/50042757
https://wiki.trenz-electronic.de/pages/viewpage.action?pageId=14746264
1.4.2
在詳細介紹具體做法之前,有必要花點時間來探討針對基於FPGA的嵌入式系統提供的操作系統選項。PetaLinux是FPGA上最常用的操作系統,另外還有μClinux 和Xilkernel。μClinux為Linux發行版,是一款包含小型Linux內核的移植型Linux操作系統,適用於無存儲器管理單元(MMU)的處理器[1]。μClinux配備有各種庫、應用和工具鏈。Xilkernel就其本身而言,是一款小型、高穩健性、模塊化內核,能夠提供高於μClinux 的定制性能,有助於用戶通過定制內核來優化其設計尺寸與功能[2]。同時,PetaLinux也是一款完整的Linux發行版及開發環境,適用於基於FPGA的片上系統(SoC)設計。PetaLinux包含預配置二進制可引導映像、面向賽靈思器件的完全可定制Linux 以及配套提供的PetaLinux軟件開發套件(SDK)[3]。其中SDK包括用於自動完成配置、構建和部署過程中各種復雜工作的工具和實用程序。賽靈思提供可免費下載的PetaLinux開發包,其中包括針對各種賽靈思FGPA開發套件而設計的硬件參考項目。同時包含在內的還有適用於賽靈思FPGA的內核配置實用程序、交叉編譯器等軟件工具、硬件設計創建工具以及大量其它設計輔助功能。據報道,Xilkernel 的性能優於μClinux[4],而PetaLinux的性能又優於Xilkernel [5]。由於這個原因,特別是由於已針對我們賽靈思目標板提供的軟件包原因,我們為我們的項目選擇了PetaLinux。移植PetaLinux的另一大優勢是用戶可以輕松實現遠程編程。這就意味着用戶可使用遠程接入方式,通過遠程登錄,采用新的配置文件(或比特流文件)加載FPGA目標板。有兩種方法可以創建用於構建PetaLinux系統的軟件平台:在Linux終端上使用PetaLinux命令或通過下拉菜單使用GUI。
附錄:
1. zcu102 Linux 完整打印信息log
http://blog.csdn.net/luhao806/article/details/58602337
2. http://www.wiki.xilinx.com/
(提供 了幾乎所有的學習資料,包括:創建FSBL,配置編譯內核,配置編譯u-boot,編譯生成dtb,制作根文件系統,linux 設備驅動程序,設計例程等等)
3.zc702 學習總結
http://blog.csdn.net/Klaus_Wei/article/details/38063349
4. zcu102 pcie視頻傳輸方案
http://blog.csdn.net/vacajk/article/details/78970368
5.zcu102
ZCU102 HDMI Demo測試:
http://blog.csdn.net/vacajk/article/details/78970533
6. zcu102 xen 開源視頻監視
http://blog.csdn.net/telantan/article/details/78872451
7.
閑話Zynq UltraScale+ MPSoC(連載4)——IO資源
http://blog.csdn.net/haoxingheng/article/details/50100573
閑話Zynq UltraScale+ MPSoC (連載3)——啟動加載
http://blog.csdn.net/haoxingheng/article/details/50099373
閑話Zynq UltraScale+ MPSoC (連載2)——架構和電源要求
http://blog.csdn.net/haoxingheng/article/details/50098777
Zynq UltraScale+ MPSoC新鮮出爐
http://blog.csdn.net/kkk584520/article/details/50042757
8. zynq petalinux編譯用戶自定義系統
http://blog.csdn.net/shichaog/article/details/51544173
9.ZYNQ跑系統 系列(二) petalinux方式移植linux
http://blog.csdn.net/long_fly/article/details/78727813
10 ZCU102開發 (1) 運行基於ubuntu文件系統的Linux
http://blog.csdn.net/telantan/article/details/73928695
【Zynq學習筆記3】petaLinux使用
http://blog.csdn.net/wt881010/article/details/71597478
zynq之petalinux安裝和編譯
http://blog.csdn.net/shichaog/article/details/51074980
將PetaLinux移植到FPGA上的原因和步驟詳解 - 全文
http://www.elecfans.com/emb/fpga/20171117581662_a.html
11. xlinux官網資料
http://china.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html#documentation
https://china.xilinx.com/search/support-keyword-search.html?searchKeywords=PetaLinux%20Tools%20Documentation
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug1156-petalinux-tools-workflow-tutorial.pdf
http://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html
https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug1144-petalinux-tools-reference-guide.pdf