第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——这个频率对大多数图像处理算法来说,时序压力不大。
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或中断。你只要理清这两条线,设计就不会乱。
下面这张图展示了咱们这个章节的核心流程:
1.4 生成比特流——等待也是一种修行
Block Design画完,点Validate Design检查一下。如果没报错,就可以生成比特流了。
点击Generate Bitstream,Vivado会依次执行综合(Synthesis)、实现(Implementation)、生成比特流三步。这个过程根据工程大小,短则几分钟,长则半小时。
等的时候别闲着——我一般会检查一下时序报告。如果看到红色的Setup Violation,说明你的设计跑不到目标频率。常见解决办法:
- 降低时钟频率(从100MHz降到80MHz)
- 在关键路径上加流水线寄存器
- 优化组合逻辑,减少级数
1.5 导出硬件描述文件(XSA)——连接硬件与软件的桥梁
比特流生成成功后,最后一步就是导出XSA文件。这个文件包含了硬件配置信息,后面Vitis开发环境要用它来生成板级支持包(BSP)。
操作很简单:File → Export → Export Hardware。记得勾上Include bitstream,否则导出的XSA里没有FPGA配置数据。
导出的XSA文件建议放在工程目录下的export文件夹里。我习惯在文件名里加上版本号,比如system_v1.0.xsa。为什么?因为后面迭代时,你可能会导出多个版本,没有版本号很容易搞混。
小结
好了,到这里你已经走完了Vivado开发的全流程。从创建工程到导出XSA,每一步都有它的意义。说白了,这套流程就是硬件设计 → 硬件描述 → 软件对接的完整链路。
下一章咱们会基于这个XSA文件,在Vitis里搭建软件工程,真正让Zynq跑起来。到时候你会发现,前面这些准备工作做得越扎实,后面调试就越省心。
可可精品资料库