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”,然后在文件浏览窗口选择已有的设计文件完成添加;如创建新的设计文件,则选择“ Create File”。这里选择添加已有设计文件,如图C.10所示。

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

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

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

图 C.13: 添加已有测试激励文件
接下来进行仿真。在左侧的“Flow Navigator”窗口中点击“SIMULATION”下的“Run Simulation”选项(如图C.14所示),选择“ Run Behavioral Simulation”,进入仿真界面(如图C.15所示)。

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

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

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

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

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

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

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

图 C.21: 添加约束
然后添加或创建约束文件。点击“Add Files”添加约束文件,如图C.22所示。

图 C.22: 添加约束文件
C.5 综合实现和生成比特流文件
在“Flow Navigator”中点击“PROGRAM AND DEBUG”下的“Generate Bitstream”选项,工程会自动完成综合、布局布线、比特流文件生成的工作。如图C.23所示。完成之后,可点击“Open Implemented Design”来查看工程实现结果。

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

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

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

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

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

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

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

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

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

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

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

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

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

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