C Vivado使用入门
这里以一个通过拨码开关控制LED灯的电路设计为例,介绍基于Vivado的FPGA设计实现流程。虽然我们对这个例子的介绍是基于Vivado2019.2进行的,但这里所介绍的内容完全适用于自Vivado 2017.1版本以来的各个版本。后续的新版本,请各位读者根据工具具体情况进行尝试,但相信这里介绍基本流程及功能应该都会保留。
C.1 创建工程
通过双击桌面快捷方式或开始菜单的“Xilinx Design Tools\(\rightarrow\)Vivado 2019.2”打开Vivado 2019.2,在界面上的“Quick Start”下选择“Create Project”,如图C.1所示。

图 C.1: Vivado启动界面
这时即可新建工程向导,点击“Next”,如图C.2所示。

图 C.2: 新建工程向导
在图C.3所示界面中输入工程名称,选择工程的存储路径,并勾选“Create project subdirectory”选项,为工程在指定存储路径下建立独立的目录。设置完成后,点击“Next”。(注意:工程名称和存储路径中不能出现中文字符和空格,建议工程名称以字母、数字、下划线来组成。)

图 C.3: 设置工程名称和位置
在图C.4所示的界面中选择“RTL Project”,并勾选“Do not specify sources at this time”(勾选该选项是为了跳过在新建工程的过程中添加设计源文件,如果要在新建工程时添加源文件则不勾选这个选项)。点击“Next”。

图 C.4: 设置工程类型
在图C.5所示的界面中选择对应的FPGA目标器件。本书推荐的本地实验箱和远程实验平台的FPGA型号一样。在“Family”中选择“Artix 7”,在“Package”中选择“fbg676”,在筛选得到的型号里面选择“xc7a200tfbg676-1”。上述选择完毕后点击“Next”。

图 C.5: 选择目标器件
在图C.6所示的界面中确认工程的设置信息是否正确。如果正确,则点击“ Finish”;如果不正确,则点击“上一步”,返回相应步骤进行修改。

图 C.6: 工程信息
完成工程新建后的界面如图C.7所示。

图 C.7: 新建工程完成的界面
C.2 添加设计文件
我们以使用Verilog完成RTL设计为例来说明如何添加设计文件。Verilog代码都是以“.v”为后缀名的文件,可以先在其他文件编辑器里写好代码,再添加到新建的工程中,也可以在工程中新建一个文件再编辑它。
首先添加源文件。在“Flow Navigator”窗口下的“PROJECT MANAGER”下点击“Add sources”,或者点击“Sources”窗口下“Add Sources”按钮(参见图C.8),也可以使用快捷键“Alt + A”添加源文件。

图 C.8: 添加源文件
然后添加设计文件。选择“Add or create design sources”来添加或新建Verilog/VHDL源文件,再点击“Next”,如图C.9所示。

图 C.9: 添加设计文件
接下来添加或者新建设计文件。如添加已有设计文件或者添加包含已有设计文件的文件夹,可以选择“Add Files”或者“Add Directories”,如图C.10所示,然后在文件浏览窗口选择已有的设计文件完成添加。

图 C.10: 添加已有设计文件
如创建新的设计文件,则选择“ Create File”,如图C.11所示。接下来继续介绍采用新建设计文件方式的后续操作步骤。

图 C.11: 新建设计文件
在图C.12所示的界面中设置新创建文件的类型、名称和文件位置。注意:文件名称和位置路径中不能出现中文字符和空格。

图 C.12: 新建设计文件的设置
继续添加其他设计文件或者修改已添加的设计文件。完成后点击“Finish”,如图C.13所示。

图 C.13: 完成设计文件添加
下一步是进行模块端口设置。在“Module Def inition”中的“I/O Port Def initions”处输入设计模块所需的端口,并设置端口方向。如果端口为总线型,勾选“ Bus”选项,并通过“ MSB”和“ LSB”参数确定总线宽度。完成后点击“ OK”,如图C.14所示。端口设置若在编辑源文件时已完成,在这一步可以直接点击“OK”跳过。

图 C.14: 模块端口设置
在图C.15所示界面中双击“Sources”,在“Design Sources”下的“led.v”中打开文件,输入相应的设计代码。如果设置时文件位置按默认的<Local to Project>(见图C.12),则设计文件位于工程目录下的“\led.srcs\sources_1\new”中。完成的设计文件如图C.15所示。

图 C.15: 编辑设计文件
C.3 功能仿真
Vivado中集成了仿真器Vivado Simulator,可以用它来进行功能仿真。
首先添加测试激励文件。在“Source”中“Simulation Sources”处右击鼠标,选择“Add source”,如图C.16所示。

图 C.16: 添加测试激励文件
在“Add Sources”界面中选择“Add or create simulation sources”,点击“Next”,如图C.17所示。

图 C.17: 添加或新建测试激励文件
如果是添加已有的激励测试文件,则选择“Add Files”,如图C.18所示。

图 C.18: 添加已有测试激励文件
如果是在Vivado中新建一个激励测试文件,则选择“Create File”,如图C.19所示。接下来继续介绍采用新建激励测试文件方式的后续操作步骤。

图 C.19: 新建测试激励文件
在图C.20所示界面中输入激励测试文件名,点击“OK”。

图 C.20: 新建测试激励文件的设置
完成新建测试文件后,点击“Finish”,如图C.21所示。

图 C.21: 完成新建测试激励文件
接下来对测试激励文件进行 Module 端口定义。由于激励测试文件不需要有对外的接口,因此不用进行 I/O 端口设置,直接点击“OK”,即可完成空白的激励测试文件的创建。如图C.22所示。

图 C.22: 新建的测试激励顶层文件无需配置端口
如图C.23所示。在“ Sources”窗口下双击打开空白的激励测试文件。测试文件 led_tb.v 位于工程目录下“\led.srcs\sim_1\new”文件夹下。

图 C.23: 空白的新建测试激励文件
可以选择在Vivado的编辑器中完成测试激励文件的代码编写。本例子中写完的测试激励文件代码如图C.24所示。

图 C.24: 完成代码编写的新建测试激励文件
待激励测试文件添加或新建完毕之后,就可以进行仿真了。在左侧的“Flow Navigator”窗口中点击“SIMULATION”下的“Run Simulation”选项(如图C.25所示),选择“Run Behavioral Simulation”,进入仿真界面(如图C.26所示)。

图 C.25: 运行行为级仿真

图 C.26: 行为级仿真界面
可通过图C.26左侧“Scope”一栏中的目录结构定位到想要查看的Module内部信号,在“Objects”对应的信号名称上右击鼠标选择“Add To Wave Window”,将信号加入波形图中(如图C.27所示)。仿真器默认显示I/O信号。由于这个示例不存在内部信号,因此不需要添加其他观察信号。

图 C.27: 将内部信号添加到波形图
可通过选择工具栏中的选项来进行波形的仿真时间控制。如图C.28所示,工具条中的工具分别是复位波形(即回到仿真0时刻)、运行仿真、运行特定时长的仿真、仿真时长设置、仿真时长单位、单步运行、暂停、重启动(重新编译设计和仿真文件并重启仿真波形界面)。我们可以观察仿真波形是否符合预期功能。

图 C.28: 仿真控制工具栏
在波形显示窗口上侧是波形图控制工具,由左到右分别是:查找、保存波形配置、放大、缩小、缩放到全显示、转到光标、转到时刻0、转到最后时刻、前一个跳变、下一个跳变、添加标记、前一个标记、下一个标记、交换光标,参见图C.29。

图 C.29: 波形图控制工具栏
可通过右键选中信号来改变信号值的显示进制数。如图C.30所示,将信号改为二进制显示。

图 C.30: 仿真波形窗口
查看波形以检查设计功能的正确性,如图C.31所示。

图 C.31: 仿真波形结果
C.4 添加约束文件
添加约束文件有两种方法,一种是利用Vivado中I/O Planning功能,另一种是直接创建XDC约束文件,手动输入约束命令后再添加加工程中。这里主要介绍第二种方法。
首先点击“Add Sources”,选择“Add or create constraints”,点击“Next”,如图C.32所示。

图 C.32: 添加约束
然后添加或创建约束文件。如果采用添加已经编辑好的约束文件的方式,则如图C.33所示点击“Add Files”。

图 C.33: 添加约束文件
如果采用创建新约束文件的方式,则如图C.34所示点击“Create Files”。

图 C.34: 新建约束文件
如果采用创建新约束文件的方式,则接下来要设置新建的 XDC 文件,输入 XDC 文件名,点击“ OK”。默认文件位于工程目录下的“\led.srcs\constrs_1\new”中。参见图C.35。

图 C.35: 新建约束文件的设置
无论采用添加还是创建的方式添加好约束文件后,在如图C.36所示界面中点击“Finish”。

图 C.36: 完成添加约束
如果刚才采用的是创建新约束文件的方式,那么接下来可以如图C.37所示界面中,在“Sources”窗口的“Constraints”下双击打开新建好的 XDC 文件“led_xdc.xdc”。

图 C.37: 打开空白XDC文件
将如下所示的约束代码填入到led_xdc.xdc文件中,其中主要是FPGA管脚约束信息和电平标准。
set_property PACKAGE_PIN H8 [get_ports {led[7]}]
set_property PACKAGE_PIN G8 [get_ports {led[6]}]
set_property PACKAGE_PIN F7 [get_ports {led[5]}]
set_property PACKAGE_PIN A4 [get_ports {led[4]}]
set_property PACKAGE_PIN A5 [get_ports {led[3]}]
set_property PACKAGE_PIN A3 [get_ports {led[2]}]
set_property PACKAGE_PIN D5 [get_ports {led[1]}]
set_property PACKAGE_PIN H7 [get_ports {led[0]}]
set_property PACKAGE_PIN Y6 [get_ports {switch[7]}]
set_property PACKAGE_PIN AA7 [get_ports {switch[6]}]
set_property PACKAGE_PIN W6 [get_ports {switch[5]}]
set_property PACKAGE_PIN AB6 [get_ports {switch[4]}]
set_property PACKAGE_PIN AC23 [get_ports {switch[3]}]
set_property PACKAGE_PIN AC22 [get_ports {switch[2]}]
set_property PACKAGE_PIN AD24 [get_ports {switch[1]}]
set_property PACKAGE_PIN AC21 [get_ports {switch[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {switch[0]}]
C.5 综合实现和生成比特流文件
在“Flow Navigator”中点击“PROGRAM AND DEBUG”下的“Generate Bitstream”选项,工程会自动完成综合、布局布线、比特流文件生成的工作。如图C.38所示。完成之后,可点击“Open Implemented Design”来查看工程实现结果。

图 C.38: 生成比特流文件
如果出现图C.39所示的提示,意味着综合过期,需重新运行综合和实现。这时点击“Yes”,在弹出的“Launch Runs”窗口点击“OK”。

图 C.39: 提示重新运行综合和实现
C.6 本地FPGA烧写配置
如果选用的是本地FPGA实验平台,那么在比特流文件生成后就可以进入烧写配置FPGA的阶段了。具体操作是:在比特流文件生成完成的窗口选择“Open Hardware Manager”,点击OK,进入硬件管理界面,如图C.40所示。连接FPGA开发板的电源线和与电脑的下载线,打开FPGA电源。

图 C.40: 打开硬件程序和调试管理
在“Hardware Manager”窗口的提示信息中,点击“Open target”下拉菜单的“Open New Target”(或在“Flow Navigator” 下 的“PROGRAM AND DEBUG” 中展开“Open Hardware Manager”, 点击“Open Target\(\rightarrow\)Open New Target”),也可以选择“AutoConnect”来自动连接器件,如图C.41所示。

图 C.41: 打开新目标
在“Open Hardware Target”向导中,先点击“Next”,进入Server选择向导,如图C.42所示。

图 C.42: Open Hardware Target向导
选择连接到“Local server”,点击“Next”,如图C.43所示。

图 C.43: 连接 Local server
在图C.44所示的界面中选择目标硬件,点击“Next”。

图 C.44: 选择目标硬件
点击“Finish”,打开目标硬件,如图C.45所示。

图 C.45: 打开目标硬件
接下来对目标硬件编程。在“Hardware”窗口右键单击目标器件“xc7a200t_0”,选择“Program Device…”;或者在“Flow Navigator”窗口中点击“PROGRAM AND DEBUG\(\rightarrow\)Hardware Manager\(\rightarrow\)Program Device”。如图C.46所示。

图 C.46: 对目标器件编程
选择下载的比特流文件,点击“Program”,如图C.47所示。

图 C.47: 选择比特流文件
完成下载后,“Hardware”窗口下的“xc7a200t_0”的状态变成“Programmed”,如图C.48所示。

图 C.48: 完成FPGA编程
此时,在FPGA开发板上,8个拨码开关SW18~SW25对应控制8个Led灯LED1~LED8的亮灭。设计完成。运行结果如图C.49所示。

图 C.49: FPGA运行结果
C.7 远程FPGA烧写配置
如果选用的是远程FPGA实验平台,那么只有最后一步烧写配置与本地FPGA实验平台不同,前面的各个步骤都是完全一样的。
首先,找到Vivado生成的比特流文件。对于本节的例子来说,通常是在led\led.runs\impl_1\目录下的led.bit文件。当工程项目名称发生变化时,将上述路径和文件名中的led换成新工程的名字即可。
然后,在浏览器中打开“计算机系统能力培养远程实验平台”的登录页面,进入平台之后,在如图C.50所示的界面中选择好比特流文件之后,点击“上传并开始”。

图 C.50: 远程FPGA实验平台比特流文件上传界面
比特流文件上传完成后,将进入如图C.51所示的远程 FPGA 开发板操作界面。根据页面上的提示进行相应的操作即可。

图 C.51: 远程FPGA实验平台开发板操作界面