board:zcu106
tool: vivado 2019.2 vitis 2019.2 petalinux 2019.2
doc:PG252 UG1209
ref:http://www.zynqnotes.com/a-simple-vcu-design
ref:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/176783395/Zynq+UltraScale+MPSoC+VCU+TRD+2019.2
zcu106_hdmitx
想demo一个简单的例子,编解码SD卡上的数据,在PC上验证是否成功
- 逻辑设计:
vivado 2019.2
- 新建工程(采用zcu106模板)
- 添加PS:ZYNQ UltraScale+ MPSoC (Run Block Automation),可以将zcu106默认的一些器件都自动配置好,这一步不要忘
- 添加VCU:ZYNQ UltraScale+ VCU (Run Block Automation)
PG252 Ch12 Design Flow Steps (P149)可以大概参考一下,可是照着做好像不行。
VCU有6个AXI接口
S_AXI_LITE:APU主,VCU从,用于APU访问配置VCU寄存器
M_AXI_ENC0,M_AXI_ENC1,M_AXI_DEC0,M_AXI_DEC1,M_AXI_MCU(32bit 其余128bit):VCU主,system memory从,VCU从memory取video数据和MCU软件
还有vcu_resetn 复位 vcu_host_interrupt 中断 还有AXI要连接一个时钟信号,已经整个vcu有一个参考时钟 pll_ref_clk
上面这些对外管脚都要连接到APU上。
4.配置 Zynq UltraScale+ MPSoC
使能 AXI slave interfaces, clocking, 和PL-PS interrupt
5.用connection automation 连接 S_AXI_LITE interface of VCU IP to the M_AXI_HPM0_LPD interface.
会自动加入processor system reset和AXI interconnect
6.手动连接AXI,中断,复位和时钟等信号
复位和时钟参考zcu106_hdmitx,复位最开始采用PG252方式,用了一个constant,可以生成位流,但是启动kernel时候会报错(reset没有定义之类)
所以参考zcu106_hdmitx,从EMIO拉了reset到VCU,slice配置见下图
加入clocking wizard,配置如下图:
参考zcu106硬件原理图zcu106-schematic-xtp469
输入时钟配置为差分,300MHz。
输出时钟clk_out1--33.33MHz,连接至VCUpll_ref_clk,clk_out2--200MHz,连接至mspoc和VCU的AXI的aclk。
完整连线见下图:
7.自动分配地址(点击红框中的自动分配地址)
对于PS端,可访问vcu的寄存器,地址为0x00_A000_0000 - 0x00_A000_FFFF
VCU做为主,访问DDR,可访问空间为
0x000_0000_0000 - 0x000_7FFF_FFFF
0x008_0000_0000 - 0x00F_FFFF_FFFF
还有OCM QSPI,这里都是自动分配好了,我还要花点时间理解一下。(可以看一下https://www.eefocus.com/antaur/blog/17-08/423773_0818c.html)
8.Validate Block Design
9.Generate Output Products 生成Diagram Block Design的HDL源文件以及相应端口癿约束文件。
10.Create HDL Wrapper
11.添加约束文件
File-->add sources--> add or create constraints--> create file (zcu106_vcu.xdc)
内容如下:
set_property PACKAGE_PIN AH12 [get_ports {si570_user_clk_p}]
set_property IOSTANDARD LVDS [get_ports {si570_user_clk_p}]
12.Run Synthesis
13.Run Implementation
14.Generate Bitstream
至此,vivado部分工作已经完成,生成了bit流
- petalinux部分
vcu trd 下载了 rdf0428-zcu106-vcu-trd-2019-2
rdf0428-zcu106-vcu-trd-2019-2apuvcu_petalinux_bsp里有bsp
将xilinx-vcu-zcu106-v2019.2-final.bsp拷贝到ubuntu中
1. petalinux-create -t project -s ../xilinx-zcu106-v2019.2-final.bsp
2. cd ./xilinx-vcu-zcu106-v2019.2-final
将vivado生成的zcu106_vcu_wrapper.xsa copy到zcu106_vcu.hw 然后传到ubuntu的xilinx-vcu-zcu106-v2019.2-final中
3. petalinux-config --get-hw=./zcu106_vcu.hw #参考UG1209设置为SD启动 P48
4. vim ./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
加入以下部分:
&sdhci1 {
no-1-8-v;
};
&vcu_0 {
reset-gpios = <&gpio 119 0>;
};
为了fix sd mount error和加入vcu reset (No reset gpio info from dts for vcu)
5. petalinux-config -c rootfs 增加 packagegroup-petalinux-gstreamer
。 gstreamer 是用于驱动 VCU 的软件组件。
6. git clone git://anongit.freedesktop.org/gstreamer/common (编译过程中会报错 所以手动下载 具体依报错信息拷贝到相应目录)
7. petalinux-build
8. cd ./images/linux/
9. petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot --force --fpga zcu106_vcu_wrapper.bit
- 运行
- 将
images/linux
目录下的BOOT.BIN
和image.ub
拷贝到 SD 卡 - 将 ZCU106 设置为从 SD 卡启动: SW6[1:4] = ON, OFF, OFF, OFF,上电启动
- 连接串口,Interface 0
- Login: root, password: root
- Mount SD 卡:
mount /dev/mmcblk0p1 /mnt
- 尝试从 MP4 文件解码: gst-launch-1.0 filesrc location=/mnt/sun_xuan.mp4 ! qtdemux ! h264parse ! omxh264dec ! queue max-size-bytes=0 ! filesink location=./sun_xuan.yuv
- 播放编解码后的视频文件
在 PC 上安装 ffmpeg,运行指令 ffplay.exe -f rawvideo -pixel_format nv12 -video_size 640x360 -i suan_xuan.yuv