通过本文档,你将能够了解:
- 如何使用Vivado搭建PYNQ-Z2上可以使用的摄像头输入、HDMI输出的视频通路Overlay
- 如何在Overlay中添加自定义图像处理IP
- 如何在SDK中如何初始化摄像头、配置图像处理IP
- The PYNQ-Z2 board
- MicroUSB to USB-A cable
- OV5640 camera
- PMOD adapter
- HDMI cable
- HDMI screen
-
Vivado® Design Suite 2018.2
-
Board files for PYNQ-Z2 should be installed
Vivado 2018.2默认并不包含PYNQ-Z2的板级支持文件,所以需要将
{path/to/doc}\files\pynq-z2
文件夹拷贝至{ptah/to/vivado}\2018.2\data\boards\board_file
-
Xilinx SDK 2018.2
-
Vivado HLS 2018.2
-
HLS Image Processing IP Core
- {path/to/doc}表示文档根目录
- {path/to/vivado}表示Vivado安装目录
- {path/to/prj}表示所创建工程根目录
将OV5640 camera接到PMOD adapter上并连接至PYNQ-Z2 board PMODA及PMODB,使用HDMI cable连接PYNQ-Z2 HDMI OUT及HDMI screen,使用MicroUSB to USB-A cable连接PROG UART及电脑USB端口。
- 单击
Start > Xilinx Design Tools > Vivado 2018.2
打开Vivado。
- 在打开的Vivado窗口
Quick Start
部分单击Create Project
,打开New Project
窗口,此时处于Create a New Vivado Project
界面,单击Next
进入Project Name
界面。
- 在
Project name:
栏中输入工程名pynq4cv
,在Project location:
栏中选择工程所在位置,即{path/to/prj}
,单击四次Next
,跳过Project Type
、Add Sources
、Add Constraint(optional)
界面,进入Default Part
界面。
- 在
Default Part
界面,单击Boards
栏,在Vendor
栏中选择tul.com.tw
,此时Display Name
中显示pynq-z2
开发板,如果没有显示pynq-z2
开发板,请检查是否已经安装PYNQ-Z2
的板级支持文件。单击显示的pynq-z2
开发板一栏,显示浅蓝色后单击Next
进入New Project Summary
界面。
- 在
New Project Summary
界面单击Finish
完成工程创建,稍等片刻,进入工程界面,
- 单击
IP INTERGRATOR > Create Block Design
,弹出Create Block Design
对话框。
- 在
Create Block Design
对话框中,修改Design name:
为system
,单击OK
。
- 在
Diagram
窗口单击蓝色加号,在Search:
栏中输入Zynq
,并双击ZYNQ7 Processing System
添加ZYNQ IP。
- 单击
Diagram
窗口左上角Run Block Automation
,在弹出对话框单击OK
,自动配置ZYNQ IP。
- 双击
ZYNQ7 Processing System
,打开Re-customize IP
,单击并勾选PS-PL Configuration > HP Slave AXI Interface > S AXI HP0 interface
。
- 单击并勾选
Clock Configuration > PL Fabric Clocks > FCLK_CLK1
,并修改频率为24。
- 单击并勾选
Interrupts > Fabric Interrupts > PL-PS Interrupts Ports > IRQ_F2P[15:0]
,单击OK
,完成配置。
- 将
{path/to/doc}\files\ip
文件夹拷贝至{path/to/prj}\pynq4cv.ip_user_files
,在Tcl Console
的输入栏,输入
set_property ip_repo_paths {path/to/prj}/pynq4cv.ip_user_files [current_project]
update_ip_catalog
WARNING:{path/to/prj}
要替换成相应工程路径,如D:/pynq4cv/
,此时应该使用/
而非\
。
- 单击
Diagram
界面蓝色加号Add IP
,或者使用快捷键Ctrl+I
,在Search:
栏中输入video to stream
,双击Video In to AXI4-Stream
,双击添加到Diagram
界面的IP,修改Video Format
为Mono/Sensor
,修改FIFO Depth
为2048
,修改Clock Mode
为Independent
,单击OK
确认。
- 单击选中
processing_system7_0
的FCLK_CLK1
引脚,单击邮件,选择Make External
,也可以使用快捷键Ctrl+T
引出端口。
- 单击选中
FCLK_CLK1_0
端口,修改名字为vid_xclk
。
-
单击
v_vid_in_axi4s_0
的vid_io_i
接口上的蓝色加号,分别引出vid_active_video
、vid_data
,vid_vsync
,vid_io_in_clk
,并修改端口名为vid_hsync
,vid_data
,vid_vsync
,vid_pclk
。 -
添加两个
Constant
,双击xlconstant_1
,修改xlconstant_1
的Const Val
为0
。
- 引出
xlconstant_0
的dout
并修改名字为vid_rst
,引出xlconstant_1
的dout
并修改名字为vid_pwd
。
- 添加
Sensor Demosaic
,单击Diagram
左上角Run Connection Automation
,在弹出窗口,确认s_axi_CTRL
勾选,单击OK
。
- 连接
v_vid_in_axi4s_0 > aclk --> processing_system7_0 > FCLK_CLK0
和v_vid_in_axi4s_0 > video_out --> v_demosaic_0 > s_axis_video
,单击Regenerate Layout
,完成视频输入部分搭建。
- 添加两个
AXI Video Direct Memory Access
模块,即VDMA
,此时出现axi_vdma_0
和axi_vdma_1
,单击Diagram
左上角Run Connection Automation
。
- 在弹出窗口,勾选
All Automation
,单击OK
。此时会自动连接时钟、复位、HP等接口。
- 单击
Diagram
旁的Address Editor
,可以看到VDMA
已经自动分配好了地址。
- 切换回
Diagram
,双击axi_vdma_0
和axi_vdma_0
,修改Stream Data Width
为24
。
- 连接
v_demosaic_0 > m_axis_video
和axi_vdma_0 > S_AXIS_S2MM
,单击Diagram
左上角Run Connection Automation
,在弹出窗口,确认All Automation
勾选,单击OK
。
- 添加
Sobelfilter
,单击Diagram
左上角Run Connection Automation
,在弹出窗口,确认All Automation
勾选,单击OK
。
- 连接
axi_vdma_0 > M_AXIS_MM2S --> sobelFilter_0 > in_r
和sobelFilter_0 > out_r --> axi_vdma_1 > S_AXIS_S2MM
,再次单击Diagram
左上角Run Connection Automation
。
- 在弹出窗口,确认
All Automation
勾选,单击OK
。
-
添加
Clocking Wizard
、Video Timing Controller
、AXI4-Stream to Video Out
和RGB to DVI Video Encoder
模块。 -
双击
Clocking Wizard
,单击Output Clocks
界面,修改clk_out1
的Output Freq
为74.25
,勾选clk_out2
,修改Output Freq
为371.25
,向下拉到Enable Optional Inputs/Outputs for MMCM/PLL
,取消勾选reset
,单击OK
确认。
- 双击
Video Timing Controller
,取消勾选Optional Features
栏中Include AXI4-Lite Interface
和Enable Detection
,单击OK
确认。
- 双击
AXI4-Stream to Video Out
,修改FIFO Depth
为2048
,修改Timing Mode
为Master
,单击OK
确认。
- 双击
rgb2dvi_0
,取消勾选Reset active high
,Generate SerialClk internally from pixel clock.
,在TMDS clock range
栏中,勾选<120MHx(720p)
,单击OK
确认。
- 连接下列端口
processing_system7_0 > FCLK_CLK1 --> clk_wiz_0 > clk_in1
clk_wiz_0 > clk_out1 --> v_tc_0 > clk
clk_wiz_0 > clk_out1 --> v_axi4s_vid_out_0 > aclk
clk_wiz_0 > clk_out1 --> axi_vdma_1 > m_axis_mm2s_aclk
clk_wiz_0 > clk_out1 --> rgb2dvi > PixelClk
clk_wiz_0 > clk_out2 --> rgb2dvi > SerialClk
clk_wiz_0 > locked --> rgb2dvi > aRst_n
v_tc_0 > vtiming_out --> v_axi4s_vid_out_0 > vtiming_in
axi_vdma_1 > M_AXIS_MM2S --> v_axi4s_vid_out_0 > video_in
v_axi4s_vid_out_0 > vid_io_out --> rgb2dvi_0 > RGB
- 单击选中
rgb2dvi_0
的TMDS
并引出端口。
- 添加
AXI IIC
模块,单击Diagram
左上角Run Connection Automation
,在弹出窗口,确认勾选S_AXI
,取消勾选IIC
,单击OK
确认。
- 单击选中
axi_iic_0
的IIC
并引出端口,修改端口名为vid_iic
。
-
添加
AXI Interrupt Controller
模块,单击Diagram
左上角Run Connection Automation
,在弹出窗口,确认勾选All Automation
,单击OK
确认 -
双击
axi_intc_0
,修改Interrupt Output Connection
为Single
,单击OK
确认。
- 添加
Concat
模块,双击xlconcat_0
,修改Numver of Ports
为5
,单击OK
确认。
- 连接下列端口
processing_system7_0 > FCLK_CLK1 --> clk_wiz_0 > clk_in1
axi_vdma_0 > mm2s_introut --> xlconcat_0 > In0
axi_vdma_0 > s2mm_introut --> xlconcat_0 > In1
axi_vdma_1 > mm2s_introut --> xlconcat_0 > In2
axi_vdma_1 > s2mm_introut --> xlconcat_0 > In3
axi_iic_0 > iic2intc_irpt --> xlconcat_0 > In4
xlconcat_0 > dout --> axi_intc_0 > intr
axi_intc_0 > irq --> processing_system7_0 > IRQ_F2P
- 单击
Validate Design
或者按下F6
,如果弹出如下警告单击OK
忽略。
- 在
Sources
栏中右键单击system
,选择Generate Output Products...
,
- 在弹出窗口单击
Generate
,其中Number of jobs:
和电脑配置相关,可修改为能够选择的最大数。
- 稍等片刻,当生成文件完成后,会弹出
Generate Output Products
窗口,单击OK
,在Sources
栏中右键单击system
,选择Create HDL Wrapper...
。
- 确认默认勾选为
Let Vivado manage wrapper and auto-update
,在弹出窗口单击OK
,生成顶层文件。
- 当
Sources
栏中出现system_wrapper
后,右键单击Sources > Constraints
下的constrs_1
,单击Add Sources...
。
- 在弹出窗口单击
Next
,在Add or Create Constraints
窗口,单击Create File
,在弹出窗口修改File Name:
为system
,单击OK
和Finish
。
- 双击打开
Sources > Constraints > constrs_1 > system.xdc
,将{path/to/doc}\files\system.xdc
中的内容拷贝至文本栏中并保存。
- 单击
Flow Navigator
下的Generate Bitstream
,在弹出窗口单击Yes
,在弹出Launch Runs
窗口单击OK
,之后生成Bitstream
文件的过程需要等待十五分钟左右。
- 当
Bitstream
生成完成后,弹出Bitstream Generation Completed
窗口,单击Cancel
完成工程搭建。
- 单击
File > Export > Export Hardware...
。
- 在弹出窗口勾选
Include bitstream
,并单击OK
,如果提醒Save project before exporting?
,单击Save
。
- 单击
File > Launch SDK
,在弹出窗口单击OK
,等待片刻,打开SDK
工作窗口。
- 在
SDK
窗口单击File > New > Application Project
。
- 在弹出窗口,修改
Project name:
为display
,单击Next
。
- 选择
Empty Application
,单击Finish
,完成应用创建。
- 将
{path/to/doc}\files\src
下的main.c
、main.h
和ov5640.h
拖动到工程左侧栏中Project Explorer > display > src
,在弹出窗口单击OK
。
- 此时左侧栏中会出现相应文件,完成应用创建。
- 连接开发板,单击
Xilinx > Program FPGA
,在弹出窗口单击Program
。
- 右键单击
Project Explorer > display
,选择Run As > Launch on Hardware(System Debugger)
。