4. Vivado基础操作:创建工程、添加源文件、RTL分析、综合、实现、生成比特流

好,咱们正式开始动手了。这一章我带你走一遍Vivado的完整流程——从新建一个空工程,到最后生成能下载到板子上的比特流文件。说白了,这就是FPGA开发的“起手式”,你以后每个项目都得走这么一遭。

我个人习惯把Vivado的流程分成五步:创建工程 → 添加源文件 → RTL分析 → 综合 → 实现 → 生成比特流。嗯,数一下是六步?没错,最后两步其实可以合并理解,但咱们还是按工具菜单来。

4.1 创建工程:别小看这一步

打开Vivado,你会看到欢迎界面。点“Create Project”,然后一路Next。这里有几个关键点我得提醒你:

  • Project name:别用中文,别带空格。我用过“led_test_v1”这种命名,后来项目多了根本分不清。建议用“项目名_日期”的格式,比如“uart_20250320”。
  • Project location:路径也别有中文。Vivado对中文路径的支持……嗯,我只能说“看心情”。
  • RTL Project:选这个就行。别勾“Do not specify sources at this time”,除非你后面想手动加。
  • Target language:Verilog还是VHDL?我个人偏爱Verilog,简洁。但如果你团队用VHDL,那就随大流。
  • Part选择:这里要选对芯片型号。我刚开始时选错过一次,综合报了一堆莫名其妙的错,查了半天才发现是器件型号不对。你可以在“Boards”标签下直接选开发板型号,比如“xc7z020clg400-1”对应Zynq-7020。
我的小技巧:创建工程时,Vivado会生成一个很大的项目目录。我习惯在工程文件夹里再建一个“src”子目录,专门放自己的源码。这样备份或迁移时,只拷src目录就够了。

4.2 添加源文件:把代码喂给工具

工程建好了,接下来就是添加你的设计文件。点击“Add Sources”,有三种方式:

  • Add or create design sources:你的核心代码,比如.v或.vhd文件。
  • Add or create constraints:约束文件,.xdc格式。这个后面会细讲。
  • Add or create simulation sources:测试文件,用于仿真验证。

我一般先把所有.v文件放在一个文件夹里,然后一次性“Add Files”加进来。Vivado会自动识别顶层模块——前提是你得在“Set as Top”那里指定一下。

注意:如果你添加了多个.v文件,但顶层模块没指定,Vivado会默认选第一个文件里的第一个模块。我曾经因为这个原因,综合出来的电路完全不是我想要的。所以,每次添加完源文件,记得右键点击顶层模块,选“Set as Top”。

4.3 RTL分析:看看你的代码长啥样

源文件加好了,先别急着综合。点一下“RTL Analysis”下的“Open Elaborated Design”。这一步会把你写的RTL代码解析成逻辑网表,说白了就是看看你的代码在逻辑层面长什么样。

你会看到一个“Schematic”视图,里面是各种门电路、触发器的连接图。我个人习惯在这里先检查一下:

  • 端口对不对?有没有漏掉信号?
  • 有没有意外的锁存器?比如if语句没写else,case没写default,Vivado会给你生成一个锁存器。这通常不是你想要的。
  • 层次结构清不清晰?好的设计应该像洋葱,一层包一层。

我记得有一次,一个实习生写的代码在RTL分析阶段就报了一堆警告,全是“inferred latch”。我一看,原来他if语句里漏了else分支。这种问题在RTL分析阶段就能发现,省了后面综合的时间。

4.4 综合:把代码变成电路

RTL分析没问题了,点“Run Synthesis”。这一步会把你的RTL代码映射到FPGA的基本单元上——查找表(LUT)、触发器(FF)、块内存(BRAM)等等。

综合需要一点时间,具体看代码量。我见过一个大型设计,综合跑了两个小时。这时候你可以去喝杯咖啡,或者看看文档。

综合完成后,会弹出一个报告。重点关注几个指标:

指标 说明 我的经验
LUT使用率 用了多少查找表 超过70%就要小心布线了
FF使用率 用了多少触发器 一般比LUT少,正常
BRAM使用率 用了多少块内存 注意有些设计会爆BRAM
时序预估 WNS(最差负时序裕量) 如果是负数,说明时序可能不满足

关键点:综合后的时序预估只是“预估”,不是最终结果。但如果你看到WNS是-5ns这种大负数,那基本可以确定后面实现阶段也过不了。这时候别急着往下走,先优化代码。

4.5 实现:把电路放到芯片上

综合通过了,点“Run Implementation”。这一步包括三个子步骤:

  • Opt Design:优化逻辑,减少面积或提高速度。
  • Place Design:把逻辑单元放到FPGA的具体位置上。
  • Route Design:用连线把这些位置连起来。

实现阶段是最耗时的,尤其是布线。我做过一个高速接口设计,布线跑了整整一个晚上。第二天早上来看,还好时序通过了。

实现完成后,打开“Open Implemented Design”,你可以看到芯片的布局布线图。密密麻麻的,像一座城市的交通网。这里你可以检查:

  • 关键路径在哪里?用“Report Timing Summary”看看。
  • 有没有拥塞区域?如果某个区域全是红色,说明布线太挤了。
避坑指南:我曾经遇到一个设计,综合后LUT使用率只有40%,但实现时却报“布线资源不足”。后来发现是因为代码里用了太多分散的查找表,导致布线器无法有效连接。解决办法是重写代码,把逻辑集中到几个模块里。

4.6 生成比特流:最后的成果

实现通过了,最后一步就是生成比特流。点“Generate Bitstream”,Vivado会生成一个.bit文件。这个文件就是你要下载到FPGA里的配置数据。

生成比特流时,Vivado会再次检查时序。如果时序不满足,它会报错并停止生成。这时候你得回去修改代码或约束。

比特流生成成功后,你可以在“Open Hardware Manager”里连接开发板,然后点“Program Device”把比特流下载进去。如果一切顺利,你的FPGA就开始跑你写的逻辑了。

注意:比特流下载到FPGA后,掉电就丢了。如果你想固化到Flash里,需要生成.mcs文件。这个我们后面章节再讲。

4.7 我的工作流总结

好了,整个流程走完了。我平时做项目,基本就是按这个顺序来:

  1. 创建工程,选对器件
  2. 添加源文件,指定顶层
  3. RTL分析,检查语法和锁存器
  4. 综合,看资源使用率
  5. 实现,跑布局布线
  6. 生成比特流,下载到板子

每一步都有对应的报告和视图,你多跑几次就熟了。刚开始可能会觉得步骤多,但其实每个步骤都有它的意义——RTL分析帮你抓逻辑错误,综合告诉你资源够不够,实现验证时序能不能跑通。少了哪一步,后面都可能翻车。

嗯,这一章就到这儿。下一章咱们聊聊约束文件怎么写,那可是让FPGA按你想法跑的关键。