第2章:Vivado工程创建与基本设置

好,咱们正式开始动手了。

上一章聊了时序约束是什么,为什么要做。这一章,咱们得先把Vivado这个工具用起来。说白了,你得先会建工程、加文件、跑流程,后面才能谈约束。

我见过不少新手,一上来就急着写约束,结果工程都没跑通。嗯,这其实挺浪费时间的。咱们一步步来。

2.1 创建RTL工程

打开Vivado,你会看到欢迎界面。别慌,点「Create Project」就行。

我个人习惯给工程起名时带上版本号,比如 uart_top_v1_0。这样后面迭代时,一眼就能看出哪个是最新的。别问我为什么强调这个——我曾经在一个项目里看到过 final_final_v3 这种名字,你懂的。

小技巧:工程路径不要带中文,不要带空格。Vivado对路径比较敏感,踩过坑的人都懂。

创建工程时,Vivado会问你选RTL Project还是Post-synthesis Project。咱们选RTL Project,勾上「Do not specify sources at this time」。为什么?因为后面加文件更灵活,你想想看,万一你还没准备好所有文件呢?

接下来选芯片型号。如果你用的是开发板,直接选对应的型号。如果只是学习,选个常见的比如 xc7a35tcsg324-1(Artix-7系列)就行。

2.2 添加源文件

工程建好了,现在加源文件。点「Add Sources」,有三种类型:

  • Design Sources:你的RTL代码(.v, .sv, .vhd)
  • Constraints:时序约束文件(.xdc)
  • Simulation Sources:测试文件(testbench)

我建议你一开始就把约束文件加进去,哪怕里面只写一句 create_clock。空文件占个位置,后面约束时直接编辑就行,省得再回头加。

重点:Vivado里约束文件的扩展名是 .xdc(Xilinx Design Constraints)。它不是普通的文本文件,有自己的一套语法规则。后面几章我们会详细讲。

添加RTL文件时,Vivado会自动识别顶层模块。如果你有多个文件,它会帮你分析依赖关系。但注意,如果顶层模块没指定,Vivado会默认选第一个文件里的模块。我遇到过有人把两个模块写在一个文件里,结果顶层选错了,综合出来一堆莫名其妙的警告。

2.3 综合与实现的基本流程

文件加完了,接下来就是跑流程。Vivado的流程分三步:

  1. Synthesis(综合):把RTL代码转成网表(门级电路)
  2. Implementation(实现):把网表映射到具体的芯片资源上
  3. Bitstream Generation(生成比特流):生成下载文件

咱们做时序约束,主要关注前两步。综合之后可以看时序报告,实现之后可以看更精确的时序结果。

点「Run Synthesis」,Vivado就开始工作了。这个过程可能需要几分钟,取决于你的代码量。我习惯在综合时去倒杯咖啡,回来刚好看到结果。

注意:综合完成后,一定要看有没有错误和严重警告。有些警告可以忽略,但如果是「Timing constraints not met」这种,就得重视了。别等到实现完才发现时序有问题,那时候改起来就麻烦了。

综合通过后,点「Run Implementation」。这一步会把你的设计布局布线到芯片上。实现完成后,Vivado会生成详细的时序报告。你可以在这里看到每条路径的建立时间、保持时间是否满足。

嗯,这里有个小坑。实现完成后,Vivado默认不会自动打开时序报告。你得手动点「Report Timing Summary」才能看到。我刚开始用Vivado时,找了半天才找到这个按钮。

2.4 知识体系一览

为了让你更直观地理解这一章的内容,我画了一张流程图。它展示了从创建工程到生成比特流的完整路径,以及时序约束在其中的位置。

Vivado工程创建与基本流程 1. 创建RTL工程 2. 添加源文件 RTL代码 约束文件 仿真文件 3. 综合 (Synthesis) 4. 实现 (Implementation) 5. 生成比特流 时序约束 create_clock set_input_delay set_output_delay 时序约束在综合和实现阶段都会起作用,但实现后的时序结果更精确

2.5 常见问题与避坑

最后,分享几个我实际项目中遇到的坑:

  • 工程名别乱改:Vivado的工程名和顶层模块名没有强制关系,但建议保持一致。我见过有人工程名叫 test,顶层模块叫 top,结果自己都忘了哪个是哪个。
  • 约束文件别放错位置:约束文件要放在Constraints目录下,不是Design Sources。放错了Vivado不会报错,但约束不会生效。我曾经因为这个查了整整一天。
  • 综合前先检查语法:Vivado的语法检查比一些轻量级工具严格。比如 always @(*) 里漏了敏感信号,Vivado会报warning,但其他工具可能直接通过。养成综合前先跑一遍语法检查的习惯。

好了,这一章的内容就这些。你只要跟着步骤走,建一个能跑通的工程并不难。下一章,咱们开始真正接触时序约束的核心——时钟约束。


可可精品资料库