3. Vivado开发环境搭建与Zynq硬件平台构建

在AMD Zynq工业视觉处理平台中,Vivado工程是硬件平台的“源头”。后续的相机接口、图像处理流水线、DDR缓存、PS端Linux系统以及AXI互联,都建立在Vivado导出的硬件描述(XSA)之上。本节围绕Vivado工程创建、Zynq Processing System(PS)配置、时钟与DDR控制器设置、引脚约束与bitstream生成,完成一个可复用的硬件平台骨架。

一、工程创建与器件选型

启动Vivado后,选择“Create Project”,工程名建议采用可追溯的命名,例如zynq_ivp_base,路径避免中文和空格。工程类型选择RTL Project,并勾选“Do not specify sources at this time”,因为Zynq平台通常先搭建Block Design,再添加自定义IP。器件选型必须与实际开发板一致:以常见的Zynq-7000工业视觉板为例,若使用XC7Z020,则选择xc7z020clg400-1;若使用XC7Z045,则选择xc7z045ffg900-2。器件选错会导致后续引脚约束、DDR型号和时钟资源全部不匹配。

工程创建完成后,在Flow Navigator中点击“Create Block Design”,命名为system。随后添加Zynq Processing System IP,Vivado会自动识别为processing_system7_0。此时不要急于连线,先双击该IP进入配置界面,因为PS配置决定了整个平台的时钟、DDR和外围接口能力。

二、Zynq Processing System配置

PS配置的核心是“按板卡实际资源填写,而不是按默认值一路Next”。在Zynq Processing System配置界面中,重点检查以下四类参数:

  • PS-PL Configuration:使能GP Master AXI接口,用于PL访问DDR;使能GP Slave AXI接口,用于PS访问PL寄存器;根据视觉链路需要使能HP Slave AXI接口,用于图像数据高带宽写入DDR。
  • Peripheral I/O Pins:使能UART1用于调试串口,使能SD0用于启动,使能ENET0用于千兆网口,使能USB0或GPIO用于外设控制。工业视觉平台通常还需要使能I2C0,用于相机寄存器配置。
  • MIO Configuration:根据原理图设置MIO电压标准,例如Bank1的MIO电压为1.8V或3.3V,必须与板卡实际供电一致。
  • Interrupts:使能PL-PS中断,用于图像帧同步、DMA完成等事件通知。

配置完成后,Vivado会在Block Design中生成PS的接口引脚。此时应点击“Run Block Automation”,让工具自动完成DDR和FIXED_IO的引出。若板卡有自定义DDR型号,则需要在“DDR Configuration”中手动选择Memory Part,而不是保留默认的MT41K256M16RE-125。

三、时钟与DDR控制器设置

Zynq的时钟体系分为PS时钟和PL时钟。PS端时钟由外部晶振经过PLL产生,典型输入为33.333MHz。在“Clock Configuration”中,需要确认:

  • Input Frequency:填写板卡实际晶振频率,例如33.333MHz。
  • CPU Clock:通常设置为666.666MHz或766.666MHz,需与器件速度等级匹配。
  • DDR Clock:根据DDR型号设置,例如DDR3-1066对应533.333MHz。
  • PL Fabric Clocks:使能FCLK_CLK0,频率设为100MHz,作为PL逻辑和AXI互联的主时钟;若图像处理流水线需要更高频率,可再使能FCLK_CLK1,设为150MHz或200MHz。

DDR控制器设置直接决定图像缓存带宽。以XC7Z020搭配DDR3为例,在“DDR Configuration”中选择正确的Memory Part后,Vivado会自动计算时序参数。需要重点核对:Data Width为16位或32位、Bus Width为32位、DDR类型为DDR3、Speed Grade为-1066。若DDR配置错误,系统可能在FSBL阶段就卡死,表现为串口无输出或反复重启。

Zynq-7000 PS与PL硬件平台结构 Processing System (PS) ARM Cortex-A9 双核 CPU Clock: 666.666 MHz DDR3 控制器 DDR Clock: 533.333 MHz / 32-bit MIO 外设 UART1 / SD0 / ENET0 / I2C0 PS-PL 接口 GP Master / GP Slave / HP Slave 中断与时钟 PL-PS IRQ / FCLK_CLK0 100MHz Programmable Logic (PL) AXI Interconnect GP0 / GP1 / HP0 图像采集接口 MIPI CSI-2 / LVDS / GigE 图像处理流水线 去马赛克 / 滤波 / 缩放 DMA 与帧缓存 AXI VDMA / Frame Buffer 自定义 IP 与约束 XDC 引脚 / 时序约束 外部 DDR3 颗粒 MT41K256M16RE-125 GP Master AXI HP Slave AXI DDR 接口 图像数据流 FCLK_CLK0 = 100MHz → PL 逻辑主时钟

四、引脚约束与XDC编写

Block Design搭建完成后,需要为PL侧端口编写XDC约束。XDC文件至少包含两类内容:引脚位置约束和时序约束。引脚位置必须与开发板原理图一致,不能凭经验猜测。例如,若PL侧有一个cam_clk输入引脚,原理图上连接到FPGA的Y9,则写为:

set_property PACKAGE_PIN Y9 [get_ports cam_clk]
set_property IOSTANDARD LVCMOS33 [get_ports cam_clk]
create_clock -period 10.000 -name cam_clk [get_ports cam_clk]

对于图像数据总线,建议按位宽分组约束,避免逐位写错。例如8位cam_data[7:0]可写为:

set_property PACKAGE_PIN AB12 [get_ports {cam_data[0]}]
set_property PACKAGE_PIN AB13 [get_ports {cam_data[1]}]
set_property PACKAGE_PIN AA13 [get_ports {cam_data[2]}]
set_property PACKAGE_PIN AA14 [get_ports {cam_data[3]}]
set_property PACKAGE_PIN AB14 [get_ports {cam_data[4]}]
set_property PACKAGE_PIN AB15 [get_ports {cam_data[5]}]
set_property PACKAGE_PIN AA15 [get_ports {cam_data[6]}]
set_property PACKAGE_PIN AA16 [get_ports {cam_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[*]}]

时序约束方面,除了输入时钟,还应约束输出时钟和跨时钟域路径。若PL逻辑使用FCLK_CLK0 100MHz,则需在XDC中声明该时钟已由PS提供,避免工具重复约束。对于异步FIFO或跨时钟域信号,应添加set_false_path或set_max_delay,但必须基于实际设计意图,不能滥用。

五、bitstream生成与硬件导出

约束完成后,依次执行“Generate Output Products”和“Create HDL Wrapper”。随后点击“Generate Bitstream”,Vivado会完成综合、实现和比特流生成。若过程中出现时序违例,应优先检查XDC中的时钟周期是否过紧、跨时钟域路径是否未约束,以及DDR接口是否使用了正确的I/O标准。

bitstream生成成功后,通过“File → Export → Export Hardware”导出XSA文件,并勾选“Include bitstream”。该XSA文件是后续Vitis或PetaLinux的硬件输入。若仅做裸机验证,也可在Vivado中直接导出到SDK,但当前课程建议统一使用XSA,便于后续Linux系统集成。

实践建议:在首次上板前,先只生成一个最小系统:PS + DDR + UART + FCLK_CLK0,不添加任何图像IP。用Vitis创建一个“Hello World”工程,确认串口能打印信息、DDR能正常读写。这一步通过后,再逐步加入VDMA、图像处理IP和相机接口,可以显著降低排障难度。
常见问题:若bitstream生成后PS端无法启动,优先检查DDR配置中的Memory Part是否与板卡一致;若PL端逻辑无输出,检查FCLK_CLK0是否使能、约束中是否遗漏了时钟声明;若串口无打印,检查MIO电压标准和UART引脚是否与原理图匹配。

完成本节后,你应得到一个包含PS配置、DDR控制器、PL时钟、引脚约束和bitstream的完整Vivado工程。这个工程是后续所有图像采集、处理和系统集成工作的硬件基础,建议将其保存为模板工程,便于在新项目中快速复用。