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。
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”那里指定一下。
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”看看。
- 有没有拥塞区域?如果某个区域全是红色,说明布线太挤了。
4.6 生成比特流:最后的成果
实现通过了,最后一步就是生成比特流。点“Generate Bitstream”,Vivado会生成一个.bit文件。这个文件就是你要下载到FPGA里的配置数据。
生成比特流时,Vivado会再次检查时序。如果时序不满足,它会报错并停止生成。这时候你得回去修改代码或约束。
比特流生成成功后,你可以在“Open Hardware Manager”里连接开发板,然后点“Program Device”把比特流下载进去。如果一切顺利,你的FPGA就开始跑你写的逻辑了。
4.7 我的工作流总结
好了,整个流程走完了。我平时做项目,基本就是按这个顺序来:
- 创建工程,选对器件
- 添加源文件,指定顶层
- RTL分析,检查语法和锁存器
- 综合,看资源使用率
- 实现,跑布局布线
- 生成比特流,下载到板子
每一步都有对应的报告和视图,你多跑几次就熟了。刚开始可能会觉得步骤多,但其实每个步骤都有它的意义——RTL分析帮你抓逻辑错误,综合告诉你资源够不够,实现验证时序能不能跑通。少了哪一步,后面都可能翻车。
嗯,这一章就到这儿。下一章咱们聊聊约束文件怎么写,那可是让FPGA按你想法跑的关键。