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 CFGBVS
和 set_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 管脚与特定的片外元器件相连接在一起,因此约束文件反映的是开发板的硬件实现情况。可编程模块的连接请参考可编程模块部分内容。