PYNQ移植ZCU102详细流程分析

在goggle上搜zcu102 pynq可以找到一些移植方法的信息
0. prebuilt
pynq移植zcu102编译好的固件
1. 生成镜像
git clone
$ git clone https://github.com/xilinx/pynq.git
$ cd pynq
$ git checkout v2.3
$ git checkout -b vacajk_dev
检查依赖环境,qemu,crosstool-ng
$ cd sdbuild/scripts
$ ./setup_host.sh
$ source /opt/pkg/petalinux/settings.sh
$ source /opt/xilinx/vivado/2018.2/settings64.sh
$ cd ../../
拷贝zcu104的配置作为zcu102来使用,删除不用的zcu104petalinux配置
$ cp -rf ./boards/zcu104 ./boards/zcu102
$ rm -rf ./boards/zcu102/petalinux_bsp/
$ mv ./boards/zcu104/zcu104.spec ./boards/zcu102/zcu102.spec
$ gedit ./boards/zcu102/zcu102.spec
修改zcu102.spec的内容
arch_zcu102 := aarch64
bsp_zcu102 := xilinx-zcu102-v2018.2-final.bsp
stage4_packages_zcu102 := ethernet
从官网上下载xilinx-zcu102-v2018.2-final.bsp,复制到./boards/zcu102目录下从github下载的脚本能够完整的生成img文件,并会自动将所有的环境搭建完毕,但是速度很慢,看了pynq的官网发现能够直接下载编译好的rootfs
这样仅仅编译boot.bin和只包含kernel的image.ub就可以了。
网上下载的rootfs
如果准备使用下载的rootfs,在这里下载rootfs的镜像
http://www.pynq.io/board.html
https://www.xilinx.com/member/forms/download/xef.html?filename=pynq_root...
解压后把bionic.aarch64.2.3.img复制到./sdbuild/prebuilt下
如下指令:
$ make boot_files boards=zcu102
$ make images boards=zcu102 prebuilt=./prebuilt/bionic.aarch64.2.3.img
自行生成的rootfs
如果准备自行编译rootfs,如下指令。比较花时间且网速影响较大
$ make boards=zcu102
2. 烧写镜像
生成的img文件在./sdbuild/output/zcu102-2.3.img
使用win32_disk_imager将img烧写到sd卡中
在linux上可以查看sd卡分区及内容,可以看到包含一个fat32分区用于存放boot.bin和image.ub
第二个分区是文件系统,ubunttu 18.04尝试启动,使用串口可以看到能够正常登陆
通过网页直接连接访问zcu102,输入密码xilinx可以打开jupyter-notebook,默认目录中有各种例子,可以进行尝试。
3. 自定义fpga固件
因为使用的是bsp中的fpga固件,里面的逻辑外设可能不符合要求,下面重新编辑fpga固件,测试板上的led和dip switch
编辑vivado工程
使用vivado 2018.2打开xilinx-zcu102-v2018.2-final.bsp中的vivado工程
增加两个axi_gpio模块,分别用于测试led和switch,添加几个其他ip用于整体系统组成
在xdc中添加io管脚约束。
set_property package_pin ag14 [get_ports {led_8bits_tri_o[0]}]
set_property package_pin af13 [get_ports {led_8bits_tri_o[1]}]
set_property package_pin ae13 [get_ports {led_8bits_tri_o[2]}]
set_property package_pin aj14 [get_ports {led_8bits_tri_o[3]}]
set_property package_pin aj15 [get_ports {led_8bits_tri_o[4]}]
set_property package_pin ah13 [get_ports {led_8bits_tri_o[5]}]
set_property package_pin ah14 [get_ports {led_8bits_tri_o[6]}]
set_property package_pin al12 [get_ports {led_8bits_tri_o[7]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[0]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[1]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[2]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[3]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[4]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[5]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[6]}]
set_property iostandard lvcmos33 [get_ports {led_8bits_tri_o[7]}]
set_property package_pin an14 [get_ports {dip_switch_8bits_tri_i[0]}]
set_property package_pin ap14 [get_ports {dip_switch_8bits_tri_i[1]}]
set_property package_pin am14 [get_ports {dip_switch_8bits_tri_i[2]}]
set_property package_pin an13 [get_ports {dip_switch_8bits_tri_i[3]}]
set_property package_pin an12 [get_ports {dip_switch_8bits_tri_i[4]}]
set_property package_pin ap12 [get_ports {dip_switch_8bits_tri_i[5]}]
set_property package_pin al13 [get_ports {dip_switch_8bits_tri_i[6]}]
set_property package_pin ak13 [get_ports {dip_switch_8bits_tri_i[7]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[0]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[1]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[2]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[3]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[4]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[5]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[6]}]
set_property iostandard lvcmos33 [get_ports {dip_switch_8bits_tri_i[7]}]
create hdl wrapper,注意zcu102_wrapper.v的内容是否正常,我是删除了原有的,然后重新生成的。编译并生成bitstream
完成后使用export block design将bd的tcl生成文件输出。
拷贝并重命名刚生成的bit和tcl文件,并重命名为:
zcu102_led.bit和zcu102_led.tcl
使用python测试led和dip
使用tftp将刚才的两个文件复制到板上的目录中:/home/xilinx/zcu102_test/
$ cd ~/zcu102_test/
$ sudo python3
python 3.6.5 (default, apr 1 2018, 05:46:30)
[gcc 7.3.0] on linux
type help, copyright, credits or license for more information.
>>> from pynq import overlay
>>> ol = overlay('zcu102_led.bit')
>>> leds = ol.gpio_leds.channel1
>>> leds[0:8].on()
>>> leds[0:8].off()
>>> sws = ol.gpio_sws.channel1
>>> sws.read()
170
>>> sws.read()
85
如上即可使用python测试led和dip switch
使用jupyter-notebook来进行测试:
import time
from pynq import overlay
ol = overlay(./bit/zcu102_led.bit)
leds = ol.gpio_leds.channel1
sws = ol.gpio_sws.channel1
for i in range(256):
leds.write(mask=255, val=i)
time.sleep(0.05)
print(led test finish!)
led test finish!
print(sws status: 0x%08x % sws.read())
sws status: 0x00000028
4. 问题
问题1:发现在python中使用自动补全时程序崩溃
在python中使用ol = overlay(‘zcu102_led.bit’)后,输入ol进行自动补全时会使python程序崩溃。
>>> ol.[ 1491.769317] bad mode in error handler detected on cpu0, code 0xbf000002 -- serror
[ 1491.776716] internal error: oops - bad mode: 0 [#3] smp
[ 1491.781922] modules linked in:
[ 1491.784963] cpu: 0 pid: 4501 comm: python3 tainted: g d 4.14.0-xilinx-v2018.2 #1
[ 1491.793466] hardware name: zynqmp zcu102 rev1.0 (dt)
[ 1491.798416] task: ffffffc877b4c000 task.stack: ffffff80092f8000
[ 1491.804319] pc is at 0x7f9d84b458
[ 1491.807616] lr is at 0x55cc3c
[ 1491.810568] pc : [] lr : [] pstate: 80000000
[ 1491.817946] sp : 0000007fc15c5060
[ 1491.821245] x29: 0000007fc15c5060 x28: 0000007f9945ae00
[ 1491.826540] x27: 0000007f99297e40 x26: 0000000000845578
[ 1491.831836] x25: 0000000000000000 x24: 0000000000860000
[ 1491.837131] x23: 0000007f9c5c0f60 x22: 0000007f9c645230
[ 1491.842426] x21: 000000003b4ccf90 x20: 0000007f9c645282
[ 1491.847721] x19: 0000007f9945ac48 x18: 0000007f9e0d3a70
[ 1491.853017] x17: 00000000005751e0 x16: 0000007f9d8ab650
[ 1491.858312] x15: 00000000000001ff x14: 0000000000000008
[ 1491.863608] x13: 0000007f9a2bc348 x12: 0000000000000000
[ 1491.868903] x11: 0000000000000000 x10: 000000003bb93498
[ 1491.874198] x9 : 000000003bb93490 x8 : 0000000000000001
[ 1491.879493] x7 : 00000000007b5750 x6 : 0000007f9db43008
[ 1491.884789] x5 : 0000007fc15c4a48 x4 : 0000007f9d8b5d58
[ 1491.890084] x3 : 0000007f994cb738 x2 : 5d43e4b8b60b9d00
[ 1491.895380] x1 : 0000007f9d84b458 x0 : 0000007f994cb738
[ 1491.900676] process python3 (pid: 4501, stack limit = 0xffffff80092f8000)
[ 1491.907448] ---[ end trace fef7a706ca15de64 ]---
segmentation fault
检查发现问题出在了vivado中zynq ultrascale+ mpsoc模块的配置有问题,但一直未定位到。。
模块配置文件:zcu102_ps_conf.tcl
可使用该配置在模块中进行apply configuration,就能解决崩溃问题
>>> ol.
ol.bs_fpga_man ol.gpio_dict ol.load_ip_data(
ol.bs_fpga_man_flags ol.gpio_leds ol.parse_bit_header(
ol.axi_intc_0 ol.gpio_sws ol.parser
ol.bin_path ol.hierarchy_dict ol.partial
ol.bitfile_name ol.interrupt_controllers ol.reset(
ol.clock_dict ol.interrupt_pins ol.timestamp
ol.convert_bit_to_bin( ol.ip_dict
ol.download( ol.is_loaded(
问题2:发现网络不能正常连接
启动以后进入系统,发现没有eth0网口,感觉是下载的rootfs img没有加载执行stage4_packages_$(board)定义的ethernet包
查看/sdbuild/packages/ethernet内的文件内容,发现需要将eth0文件放在/etc/network/interfaces.d下
有三种方式:
1. 在格式化sd卡前,直接在linux内编辑镜像,并复制eth0到指定位置
2. 在串口控制台使用vim编辑文本,并复制到指定位置
3. 使用sudo ifconfig eth0 up && sudo ifconfig eth0 192.168.2.99 先使能网络然后用tftp将eth0文件复制到指定位置
eth0文件内容如下:
auto eth0
iface eth0 inet dhcp auto eth0:1
iface eth0:1 inet static
address 192.168.2.99
netmask 255.255.255.0
编辑完成后,重启板子,即可看到网卡信息
xilinx@pynq:~$ ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.2.110 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::f4e8:61ff:fe39:2f29 prefixlen 64 scopeid 0x20
ether f6:e8:61:39:2f:29 txqueuelen 1000 (ethernet)
rx packets 1207 bytes 1082085 (1.0 mb)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 1180 bytes 106838 (106.8 kb)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 31
eth0:1: flags=4163 mtu 1500
inet 192.168.2.99 netmask 255.255.255.0 broadcast 192.168.2.255
ether f6:e8:61:39:2f:29 txqueuelen 1000 (ethernet)
device interrupt 31
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (local loopback)
rx packets 191 bytes 22047 (22.0 kb)
rx errors 0 dropped 0 overruns 0 frame 0
tx packets 191 bytes 22047 (22.0 kb)
tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0为dhcp得到的ip地址。
eth0:1为静态ip地址


Apollo 2.5推出了基于动态的实时相对地图的解决方案
高通发布三款平台,入门级PC也能实现高速蜂窝网络连接了
短路和断路有什么区别_短路和断路的区别口诀
仓库管理系统大幅提升企业效率
电源的“整体分类”及“常见电源”简单介绍
PYNQ移植ZCU102详细流程分析
MR25HxxxDF的2.0mm裸露底垫新封装已获Everspin批准生产
苹果砍断“泰坦”计划,主要是核心技术不过关
DS31415高性能频率转换和合成的集成电路
采用PLC和Modbus通讯协议实现油罐区储运监控系统的设计
一款采用缝隙耦合馈电的2.45 GHz读写器圆极化微带天线设计概述
诺基亚9旗舰机全曝光,诺基亚能否强势归来?
AR技术让WatchBox打破了传统的销售模式
工业电脑出现蓝屏怎么办
基于3D视觉技术和PLR传感器的机器人引导部件定位装置设计
变频器维修的一些基本知识
中兴创新语音技术,发布三模动态频谱共享方案
FPGA设计高级技巧(Xilinx篇)
径卫SaaS风控系统推动货车保险行业数字化升级
广东省已经通过了《广州人工智能与数字经济试验区建设总体方案》