第1章:Vivado开发流程——从零搭建你的第一个Zynq工程

大家好,我是老李。做FPGA开发十几年了,从早期的ISE一路用到Vivado。说实话,刚接触Vivado那会儿,我也被它复杂的界面搞得头晕。但用顺手之后你会发现,这套工具链其实很有逻辑。

今天咱们就手把手走一遍Vivado的标准开发流程。你跟着我做完,就能跑通一个完整的Zynq图像处理流水线雏形。

1.1 创建Vivado工程——别小看这一步

打开Vivado,点击Create Project。这里有个小细节——工程名不要用中文,路径也不要带空格。我在项目中吃过这个亏,有一次客户发来的工程名带了个“&”符号,结果综合报错查了半天,最后发现是路径解析出了问题。

选RTL Project,勾上Do not specify sources at this time。为什么?因为咱们后面要用Block Design,源文件会自动生成。你想想看,手动添加一堆文件再删掉,多麻烦。

器件选择这里,我建议直接搜XC7Z020-1CLG484C——这是Zynq-7020最常用的型号。如果你用的是其他板子,比如ZedBoard或者MicroZed,记得核对一下封装。

我的习惯:每次新建工程,我都会在工程目录下建一个src、ip、constraints三个子文件夹。后面所有文件按类别放进去,找起来特别快。

1.2 添加IP核——像搭积木一样

Vivado的IP核库非常丰富。咱们做图像处理,最核心的就是Zynq Processing System这个IP核。它相当于把ARM Cortex-A9硬核处理器封装成了一个可配置的模块。

点击IP Catalog,搜索Zynq,双击添加。这时候会弹出一个配置界面——别被那么多选项吓到,咱们先关注几个关键配置:

  • PS-PL Configuration:这里决定ARM和FPGA之间怎么通信。做图像处理,我一般开AXI HP0和AXI HP1两个高速口,带宽够用。
  • Peripheral I/O Pins:把UART1勾上,后面调试要用串口打印信息。
  • Clock Configuration:默认的CPU频率666MHz够用,但PL侧时钟我习惯设成100MHz——这个频率对大多数图像处理算法来说,时序压力不大。
注意:我曾经遇到过一个问题——配置完Zynq IP后,发现AXI接口没连上。后来才发现,M_AXI_GP0默认是关闭的,需要手动在PS-PL Configuration里打开。这个坑我踩过,你别再踩了。

1.3 Block Design设计——连线也有讲究

添加完IP核,进入Block Design界面。这里就是咱们的“画板”了。

先点Create Block Design,把Zynq IP拖进来。然后点Run Block Automation——Vivado会自动帮你连好大部分默认接口。但别急着点确定,看看它帮你连了哪些线。

我个人习惯,会手动添加一个AXI Interconnect IP核。为什么?因为Zynq的AXI接口是主机口,而咱们后面加的VDMA、Video In/Out这些IP都是从设备,需要一个互联模块来桥接。

连线的时候记住一个原则:主机连从机,时钟连复位。具体来说:

  • Zynq的M_AXI_GP0连到Interconnect的S00_AXI
  • Interconnect的M00_AXI留空,后面接VDMA
  • Zynq的FCLK_CLK0连到所有IP的时钟输入
  • Zynq的FCLK_RESET0_N连到所有IP的复位输入

嗯,这里要注意——复位信号是低电平有效,所以名字里带个_N。我第一次用的时候没注意,把复位接到了高电平,结果仿真时IP一直处于复位状态,折腾了一下午。

核心逻辑:Block Design的本质就是数据流 + 控制流。数据流走AXI总线,控制流走GPIO或中断。你只要理清这两条线,设计就不会乱。

下面这张图展示了咱们这个章节的核心流程:

Vivado开发流程——核心知识体系 创建工程 添加IP核 Block Design 生成比特流 导出XSA 关键点: • 工程名不要用中文 • AXI互联要手动添加 • 复位信号低电平有效

1.4 生成比特流——等待也是一种修行

Block Design画完,点Validate Design检查一下。如果没报错,就可以生成比特流了。

点击Generate Bitstream,Vivado会依次执行综合(Synthesis)、实现(Implementation)、生成比特流三步。这个过程根据工程大小,短则几分钟,长则半小时。

等的时候别闲着——我一般会检查一下时序报告。如果看到红色的Setup Violation,说明你的设计跑不到目标频率。常见解决办法:

  • 降低时钟频率(从100MHz降到80MHz)
  • 在关键路径上加流水线寄存器
  • 优化组合逻辑,减少级数
小技巧:第一次生成比特流时,可以勾上Flatten Hierarchy选项。这样综合工具会把层次结构打平,有时候能优化掉一些跨层次的路由延迟。

1.5 导出硬件描述文件(XSA)——连接硬件与软件的桥梁

比特流生成成功后,最后一步就是导出XSA文件。这个文件包含了硬件配置信息,后面Vitis开发环境要用它来生成板级支持包(BSP)。

操作很简单:File → Export → Export Hardware。记得勾上Include bitstream,否则导出的XSA里没有FPGA配置数据。

导出的XSA文件建议放在工程目录下的export文件夹里。我习惯在文件名里加上版本号,比如system_v1.0.xsa。为什么?因为后面迭代时,你可能会导出多个版本,没有版本号很容易搞混。

避坑指南:我曾经有一次导出XSA后,发现Vitis里死活识别不到外设。查了半天,原来是Block Design里有一个IP的地址映射没配好。所以导出前,一定去Address Editor里看一眼,确保每个IP的地址范围没有重叠。

小结

好了,到这里你已经走完了Vivado开发的全流程。从创建工程到导出XSA,每一步都有它的意义。说白了,这套流程就是硬件设计 → 硬件描述 → 软件对接的完整链路。

下一章咱们会基于这个XSA文件,在Vitis里搭建软件工程,真正让Zynq跑起来。到时候你会发现,前面这些准备工作做得越扎实,后面调试就越省心。

可可精品资料库