2、创建第一个工程:新建RTL工程、添加设计文件、添加约束文件、综合与实现、生成比特流

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

这一章,我带你走一遍 Vivado 创建工程的完整流程。说白了,就是从一个空白的 Vivado 界面,到最终生成一个可以下载到板子上的 .bit 文件。你跟着我一步步来,别着急。

核心目标:掌握 Vivado 工程创建的五个关键步骤——新建工程、添加设计文件、添加约束文件、综合与实现、生成比特流。

新建RTL工程 File → New Project 添加设计文件 Add Sources → RTL 添加约束文件 Add Sources → XDC 综合与实现 Run Synthesis → Run Implementation 生成比特流 Generate Bitstream 图:Vivado 工程创建五步走 每一步都环环相扣,缺一不可

2.1 新建 RTL 工程

打开 Vivado,你会看到欢迎界面。我个人习惯直接点 Create New Project,然后一路 Next。

这里有几个关键点你要注意:

  • Project name:别用中文,也别带空格。我一般用 led_test 这种命名方式。
  • Project location:路径里不要有中文,否则后面综合会报一些莫名其妙的错误。嗯,我吃过这个亏。
  • RTL Project:选这个,别选错了。记得勾上 Do not specify sources at this time,这样我们可以先建好工程框架,再慢慢加文件。
  • Part selection:选你板子上的 FPGA 型号。比如我用的 XC7A35T,你就搜 xc7a35t 然后挑对应的封装。

小技巧:如果你不确定芯片型号,可以在 Vivado 里点 Boards 标签页,直接选你的开发板品牌。比如 Nexys A7、Basys 3 这些常见板子都有预设。

2.2 添加设计文件

工程建好了,现在该写代码了。在 Sources 窗口右键,选 Add Sources,然后选 Add or create design sources。

你可以直接新建一个 Verilog 文件,也可以把写好的 .v 文件加进来。我一般这么干:

// led_toggle.v - 一个简单的LED闪烁模块
module led_toggle (
    input  wire       clk,      // 系统时钟,50MHz
    input  wire       rst_n,    // 复位,低有效
    output reg [3:0]  led       // 4个LED
);

    reg [24:0] cnt;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= 25'd0;
        else
            cnt <= cnt + 1'b1;
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 4'b0000;
        else if (cnt == 25'd24_999_999)  // 0.5秒翻转一次
            led <= ~led;
        else
            led <= led;
    end

endmodule

这段代码很简单,就是一个计数器,每 0.5 秒翻转一次 LED 状态。你想想看,这其实就是最基础的时序逻辑——计数器加寄存器输出。

注意:添加文件后,记得检查 Hierarchy 窗口。如果出现 ? 问号图标,说明 Vivado 找不到顶层模块。右键设一下 Set as Top 就行。

2.3 添加约束文件

代码写好了,但 FPGA 不知道你的 clk 对应板子上的哪个引脚。这时候就需要约束文件了,也就是 .xdc 文件。

操作很简单:同样在 Sources 窗口右键,选 Add Sources,这次选 Add or create constraints。

下面是我常用的约束写法:

# 时钟约束 - 50MHz
create_clock -period 20.000 [get_ports clk]

# 引脚约束
set_property PACKAGE_PIN P17 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

set_property PACKAGE_PIN M13 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

set_property PACKAGE_PIN J15 [get_ports {led[0]}]
set_property PACKAGE_PIN L16 [get_ports {led[1]}]
set_property PACKAGE_PIN M14 [get_ports {led[2]}]
set_property PACKAGE_PIN M15 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

这里有个坑,我曾经犯过:引脚编号一定要对着板子的原理图查,别想当然。比如有的板子 LED 是高有效,有的是低有效,你得看原理图确认。

核心要点:约束文件就两件事——告诉 Vivado 时钟跑多快,告诉它每个信号接在哪个引脚上。缺一不可。

2.4 综合与实现

文件都加好了,现在开始跑流程。在左侧 Flow Navigator 里,依次点:

  1. Run Synthesis —— 综合。把 Verilog 代码转成网表。
  2. 综合完成后,点 Run Implementation —— 实现。把网表映射到具体的 LUT、FF 等资源上。

这两个步骤,说白了就是 Vivado 在后台帮你做「翻译」和「布局」的工作。你只需要点一下按钮,剩下的交给工具。

不过要注意,如果代码里有语法错误或者约束冲突,Vivado 会在 Messages 窗口报红。我建议你养成习惯:每次综合完,先看一眼 Warnings,别直接跳过。

我的经验:综合时间取决于工程大小。像咱们这个 LED 闪烁的小工程,一般 1-2 分钟就跑完了。如果超过 5 分钟还没动静,检查一下是不是代码里写了死循环或者巨大的组合逻辑。

2.5 生成比特流

实现完成后,最后一步就是生成比特流。点 Generate Bitstream,Vivado 会生成一个 .bit 文件。

这个 .bit 文件,就是 FPGA 的「灵魂」。它包含了所有配置信息,下载到板子上,FPGA 就知道该怎么工作了。

生成完成后,你可以在 Project Summary 里看到资源利用率:

资源类型 使用量 可用量 利用率
LUT 32 20800 0.15%
FF 29 41600 0.07%
IO 6 106 5.66%
BUFG 1 32 3.13%

你看,一个简单的 LED 闪烁,只用了 32 个 LUT 和 29 个 FF。FPGA 的资源其实很富裕,别怕浪费。

重要提醒:如果生成比特流时报错 Timing constraints not met,别慌。先检查时钟约束是不是写对了,再检查代码里有没有太长的组合逻辑路径。实在不行,可以适当放宽约束,但别养成坏习惯。

好了,到这里,你的第一个 Vivado 工程就创建完成了。从新建工程到生成比特流,一共五步,每一步都不复杂,但每一步都有细节。你跟着做一遍,遇到问题别怕,多试几次就熟了。

总结一下:

  • 新建工程时注意路径和芯片型号
  • 设计文件写好后检查顶层模块设置
  • 约束文件要对着原理图写引脚
  • 综合和实现耐心等待,留意警告信息
  • 比特流生成后检查资源利用率

下一章,我会带你把这 .bit 文件下载到板子上,亲眼看到 LED 闪烁起来。那感觉,比看仿真波形爽多了。


可可精品资料库