第三章 FPGA开发环境搭建:Vivado/Vitis安装、工程创建流程、IP核管理、仿真环境配置

好,咱们直接进入正题。做FPGA开发,第一件事就是把“家伙事儿”备齐。Vivado和Vitis这套工具链,说白了就是你手里的焊枪和示波器。我见过不少新手,一上来就急着写代码,结果环境没配好,折腾半天连个LED都点不亮。嗯,这章咱们就把这事彻底捋清楚。

3.1 Vivado与Vitis:到底该装哪个?

很多同学会问:Vivado和Vitis有什么区别?我是不是两个都得装?

简单说,Vivado负责硬件设计——写Verilog、综合、布局布线、生成比特流。而Vitis负责软件开发——写C/C++代码、跑嵌入式Linux、做ARM核的调试。如果你只做纯逻辑设计(比如我们这节HDMI采集的RTL部分),装Vivado就够了。但如果你要用到Zynq的PS端(比如配置DDR控制器),那Vitis也跑不掉。

我的建议:直接装Vivado ML Edition(免费版),安装时勾选“Vitis”组件。一步到位,省得以后补装麻烦。我在项目中吃过这个亏——第一次只装了Vivado,后来要用SDK,又得重新跑一遍安装程序,折腾了大半天。

3.2 安装避坑指南

安装过程其实不复杂,但有几个坑我得提前跟你说。

  • 路径不要有中文和空格。这是老生常谈了,但每次都有同学踩坑。我习惯用 C:\Xilinx\Vivado\2024.1 这种纯英文路径。
  • 磁盘空间留够。完整安装大概需要100GB以上。别问我怎么知道的——我第一次装的时候C盘只剩30GB,装到一半直接报错。
  • 安装时选择“Vivado ML Standard”,然后勾选你需要的器件系列。我们做HDMI采集用的是Artix-7或Zynq-7000系列,记得勾上。
  • License问题。免费版不需要license,但如果你要用一些高级IP(比如MIPI D-PHY),可能需要额外申请。我曾经因为忘记申请license,仿真跑了两天发现IP核根本用不了……

注意:安装过程中会提示安装“Cable Drivers”,一定要勾上。否则你的下载器连不上FPGA,到时候干瞪眼。

3.3 工程创建流程:从零开始

装好了,咱们来建个工程。我习惯用Tcl脚本创建工程,但新手还是先从GUI入手吧。

  1. 打开Vivado,点击 Create Project。
  2. 输入工程名,比如 hdmi_capture。路径选好,别放桌面。
  3. 选择 RTL Project,勾选 Do not specify sources at this time。为什么?我习惯先建好工程框架,再慢慢加文件。
  4. 选择器件。我们用的是 xc7a35ticsg324-1L(Artix-7)。如果你用的是开发板,可以直接选Board对应的型号。
  5. Finish。

嗯,到这里工程就建好了。你可能会看到一个空荡荡的界面,别慌,接下来咱们加文件。

3.4 IP核管理:别重复造轮子

做HDMI采集,你肯定要用到一些现成的IP核。比如Clocking Wizard(生成像素时钟)、DDR3/DDR4 Controller(读写DDR)、Video Timing Controller(生成行场同步信号)。Vivado的IP Catalog里都有。

我个人习惯的做法是:

  • 先打开 IP Catalog,搜索你需要的IP。
  • 双击IP,配置参数。比如Clocking Wizard,输入时钟频率、输出频率、相位等。
  • 点击 Generate,Vivado会自动生成IP核的网表和例化模板。

小技巧:生成的IP核会有一个 .xci 文件。你可以把这个文件单独拷贝出来,下次新建工程时直接 Add Sources 加进来,不用重新配置。我在多个项目之间复用IP核时,就是这么干的,省了不少时间。

但要注意,IP核的版本和Vivado版本要匹配。我曾经把一个Vivado 2022.1的IP核拿到2024.1里用,结果综合报了一堆错。嗯,血的教训。

3.5 仿真环境配置:跑通第一个Testbench

写完了RTL代码,下一步就是仿真。Vivado自带的仿真器是 XSim,够用。但如果你习惯用ModelSim或Questa,也可以配置外部仿真器。

咱们先讲XSim的用法:

  1. 在 Sources 窗口右键,选择 Add Sources,然后选 Add or create simulation sources。
  2. 新建一个Testbench文件,比如 tb_hdmi_capture.v。
  3. 在Testbench里例化你的顶层模块,生成时钟和复位,然后加一些激励。
  4. 在 Flow Navigator 里点击 Run Simulation,选择 Run Behavioral Simulation。

举个例子,一个简单的Testbench框架:

module tb_hdmi_capture();

reg clk;
reg rst_n;
wire hsync;
wire vsync;
wire [23:0] rgb_data;

// 时钟生成
initial begin
    clk = 0;
    forever #5 clk = ~clk;  // 100MHz时钟
end

// 复位
initial begin
    rst_n = 0;
    #100;
    rst_n = 1;
end

// 例化DUT
hdmi_capture u_dut (
    .clk(clk),
    .rst_n(rst_n),
    .hsync(hsync),
    .vsync(vsync),
    .rgb_data(rgb_data)
);

// 仿真控制
initial begin
    #1000;
    $finish;
end

endmodule

仿真跑起来后,你可以看波形。如果波形不对,别急着改代码,先检查时钟和复位是不是对的。我遇到过好几次,仿真跑不出来,结果发现是时钟周期写错了——#5 是10ns周期,对应100MHz,但我的设计跑的是148.5MHz(HDMI标准),时钟周期应该是 #3.367。这种小错误,波形上一眼就能看出来。

核心要点:仿真不是为了“跑通”,而是为了“验证”。我习惯在Testbench里加一些自动检查的逻辑,比如用 $display 打印关键信号,或者用 assert 检查时序约束。这样仿真跑完,我就能知道设计有没有问题,不用盯着波形看半天。

3.6 本章知识体系

下面这张图,是我自己总结的FPGA开发环境搭建的核心流程。你可以把它当成一个检查清单,每次建新工程时对照着走一遍。

FPGA开发环境搭建核心流程 1. 安装Vivado/Vitis 2. 创建RTL工程 3. 配置IP核 4. 编写RTL代码 5. 仿真验证 6. 综合与实现 仿真不通过?返回修改代码 关键检查点 • 安装路径无中文/空格 • IP核版本与Vivado版本匹配 • 仿真时钟周期与设计目标一致

3.7 一些零碎但重要的提醒

最后,再唠叨几句:

  • 版本管理。我习惯用Git管理工程,但Vivado生成的中间文件太多(比如 .jou、.log、.str),记得加 .gitignore。只跟踪 .xpr、.xdc、.v 这些源文件就够了。
  • 备份IP核配置。每次配置完IP核,截个图或者记下参数。我吃过亏——有一次不小心删了工程,重新配IP核时,死活想不起来当时设的时钟频率是多少。
  • 仿真别偷懒。哪怕只是改了一行代码,也建议重新跑一下仿真。你以为的小改动,可能牵一发动全身。

好了,环境搭建这块就聊到这儿。工具链顺了,后面写代码、调时序才能事半功倍。你先把Vivado装好,建个工程跑一遍仿真,咱们下章见真章。