第三章 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入手吧。
- 打开Vivado,点击 Create Project。
- 输入工程名,比如
hdmi_capture。路径选好,别放桌面。 - 选择 RTL Project,勾选 Do not specify sources at this time。为什么?我习惯先建好工程框架,再慢慢加文件。
- 选择器件。我们用的是 xc7a35ticsg324-1L(Artix-7)。如果你用的是开发板,可以直接选Board对应的型号。
- 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的用法:
- 在 Sources 窗口右键,选择 Add Sources,然后选 Add or create simulation sources。
- 新建一个Testbench文件,比如
tb_hdmi_capture.v。 - 在Testbench里例化你的顶层模块,生成时钟和复位,然后加一些激励。
- 在 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开发环境搭建的核心流程。你可以把它当成一个检查清单,每次建新工程时对照着走一遍。
3.7 一些零碎但重要的提醒
最后,再唠叨几句:
- 版本管理。我习惯用Git管理工程,但Vivado生成的中间文件太多(比如
.jou、.log、.str),记得加.gitignore。只跟踪.xpr、.xdc、.v这些源文件就够了。 - 备份IP核配置。每次配置完IP核,截个图或者记下参数。我吃过亏——有一次不小心删了工程,重新配IP核时,死活想不起来当时设的时钟频率是多少。
- 仿真别偷懒。哪怕只是改了一行代码,也建议重新跑一下仿真。你以为的小改动,可能牵一发动全身。
好了,环境搭建这块就聊到这儿。工具链顺了,后面写代码、调时序才能事半功倍。你先把Vivado装好,建个工程跑一遍仿真,咱们下章见真章。