跳转至

Vivado 使用入门

数字电路实验使用的是 Vivado 开发环境 2019.2 版本。Vivado 开发环境非常庞大,实验只需要安装最基础的 WebPack 免费版本即可。免费版本包含了生成实验板所需要的比特流 bit 文件的生成工具。

需要注意的是 Vivado 不支持中文目录,务必不要安装到中文目录下使用,也不要将 Vivado 的项目放到中文目录下面,否则会综合不过。

创建项目

注意

这里创建项目的流程是给同学们演示一个 Vivado 项目的各个环节,以实验4的项目为例,包括创建项目,编写代码,综合,实现等的过程,理解整个流程可以帮助理解硬件设计的过程。

首次进入 Vivado 的界面:

创建新的一个项目:

输入项目名称:

选择项目的性质:

选择芯片型号 xc7a35tfgg484-2,这个型号就是可编程模块上的 FPGA 芯片型号:

项目情况简介:

创建完成空白的项目:

编写代码

File 菜单栏种选择 Add Sources...

进入添加源文件对话框:

创建新的文件:

输入 decoder 为创建文件的名称,注意文件类型选择为 SystemVerilog:

创建完文件,点击 finish:

设置输入输出:

添加完成,并且可以查看源代码:

在源代码部分输入以下源代码:

module decoder (
    input wire [3:0] sw,    //拨动开关输入
    output reg [6:0] seg    //七段数码管输出
    );

    always_comb begin
        case (sw)
            4'd0: seg = 7'b1111110;
            // ... 补全其他情况 (4'd1~4'd9)
            default: seg = 7'b0; // 默认 4'dA~4'dF 都显示为全灭
        endcase
    end
endmodule

输入代码之后的情况:

上述的代码就是一个七段数码管的译码器,只译码了输入为 0 的情况,其他代码还需要补充。

代码综合

写完代码之后,将经过综合,实现,生成比特流的过程,最终生成可以加载到 FPGA 上面能用的比特流文件。下面是各个流程的含义。

综合 (synthesis):Verilog 语言翻译为门电路的表示,使用 LUT,FF(flip-flop,寄存器)方式来完成门电路的构成等。

实现 (implementation):考虑连线,各个元器件的放置,连线优化等。

生成 bitstream:生成最终的可以使用的比特流文件,可以被加载到 FPGA 上使用。

下面是代码经过综合和实现和生成比特流的各个过程。实际工作中,可以直接点击 Generate Bitstream 选项来直接生成比特流。Vivado 软件会自动调用上面的三个过程。

选择综合选项:

开始综合:

综合进行中:

综合完成:

点击 ok 继续完成实现:

实现完成:

Open Implemented Design 打开实现设计,用于进行添加约束等操作。

Generate Bitstream 生成用于下载到 FPGA 的比特流文件,没有添加约束的情况下直接生成比特流文件可能会报错,因此需要先添加约束。

View Report 查看综合报告。

Note

如果直接选择Generate Bitstream ,在生成比特流的时候,Vivado 会报告类似下面的错误:

[DRC UCIO-1] Unconstrained Logical Port: 11 out of 11 logical ports have no user assigned specific location constraint (LOC). 
...Problem ports: seg[6:0], and sw[3:0].

这是因为目前项目中缺少约束文件,下面介绍如何添加约束,那时就可以成功地生成比特流文件。

添加约束

约束是指定 Vivado 软件一些行为的 Tcl 语言语句,在本实验的范围内,主要用到的就是 IO 约束,即将已经完成的顶层模块中的信号,与 FPGA 芯片实际的输入输出管脚对应起来,这样生成的最后的比特流文件才能够在板子上真正执行。

通过Open Implemented Design 中的 Constraint Wizard 来定义约束,点击 Define Target 按钮:

创建约束文件:

选择 Create File 新建文件:

选择新文件为设计的约束文件:

编辑 clock.xdc 文件:

使用可编程模块上的接插孔连接开关和七段数码管,其中 IO1 ~ IO4 作为输入 sw[3:0],连接到开关模块;IO14 ~ IO20 作为输出 seg[6:0],分别连接七段数码管的a ~ f。将具体的约束写入到 decoder.xdc 中:

# sw input
set_property -dict {PACKAGE_PIN M21 IOSTANDARD LVCMOS33} [get_ports sw[3]];
set_property -dict {PACKAGE_PIN N20 IOSTANDARD LVCMOS33} [get_ports sw[2]];
set_property -dict {PACKAGE_PIN N22 IOSTANDARD LVCMOS33} [get_ports sw[1]];
set_property -dict {PACKAGE_PIN P21 IOSTANDARD LVCMOS33} [get_ports sw[0]];

# seg output
set_property -dict {PACKAGE_PIN Y21 IOSTANDARD LVCMOS33} [get_ports seg[6]];
set_property -dict {PACKAGE_PIN AB22 IOSTANDARD LVCMOS33} [get_ports seg[5]];
set_property -dict {PACKAGE_PIN AA18 IOSTANDARD LVCMOS33} [get_ports seg[4]];
set_property -dict {PACKAGE_PIN AB18 IOSTANDARD LVCMOS33} [get_ports seg[3]];
set_property -dict {PACKAGE_PIN AA20 IOSTANDARD LVCMOS33} [get_ports seg[2]];
set_property -dict {PACKAGE_PIN AB21 IOSTANDARD LVCMOS33} [get_ports seg[1]];
set_property -dict {PACKAGE_PIN AA21 IOSTANDARD LVCMOS33} [get_ports seg[0]];

set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]

其中 set_property PACKAGE_PIN 命令表示设置管脚约束,这类约束是与电路板连线相关的。可编程模块上有各种电路连接到 FPGA 不同的管脚上,进行实验的时候需要选择不同的信号与 FPGA 哪些管脚进行绑定。

完整的管脚绑定关系可以参考可编程模块部分。

最后两条命令 set_property CFGBVSset_property CONFIG_VOLTAGE 设置了 FPGA 配置电路的供电方式,它们由电路板硬件设计得出,在各个实验中不需要更改。

运行实现并生成比特流 bit 文件

重新运行实现(Run Implementatuion)后,选择生成比特流(bitstream)文件:

成功生成 bit 文件,为最终可以装载到 FPGA 中的文件:

在 Vivado 的右上角可以看到当前 Vivado 后台综合,实现,生成 bitstream 的进度情况。

配置 FPGA

有了比特流文件之后就可以将文件装载到 FPGA 中,使其工作,这一过程也叫做配置。 成功生成 bit 文件后,选择 Open Hardware Manager,进入硬件管理界面:

此时 Hardware 框中没有任何芯片信息,下面开始连接电路。

首先把开关模块,可编程模块和带译码的七段数码管模块,进行电路连接:

然后把下载器连接到可编程模块上,下载器通过 USB 连接到电脑上:

接通实验模块电源:

此时 Hardware 框中可以看到芯片信息,如果没有,请点击 Open Target,然后选择 Auto Connect

Hardware 框中就可以看到芯片的信息 xc7a35t_0,此时芯片的状态为 Not programmed

在芯片信息处右键单击:

选择 Program Device... 选择装载的文件,一般默认就是本项目生成的位流文件,不用修改:

选择 Program ,对芯片进行配置

配置完成后,可以看到当输入开关为 0000 时,七段数码管显示 0,译码器工作正常。

注意

每一个开发板都会把特定的 FPGA 管脚与特定的片外元器件相连接在一起,因此约束文件反映的是开发板的硬件实现情况。可编程模块的连接请参考可编程模块部分内容。


最后更新: 2024年4月22日
作者:李山山 (94.96%), Jiajie Chen (4.26%), TRCYX (0.78%)