正点原子 发表于 2020-11-7 16:46:37

【正点原子FPGA连载】第四章Vivado软件的安装和使用

本帖最后由 正点原子 于 2021-1-25 18:39 编辑

1)实验平台:正点原子达芬奇FPGA开发板
2)购买链接:https://detail.tmall.com/item.htm?id=624335496505
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_dafenqi.html
4) 正点原子官方B站:https://space.bilibili.com/394620890
5)对正点原子FPGA感兴趣的同学可以加群讨论:905624739 点击加入:





第四章Vivado软件的安装和使用


Vivado Design Suite是Xilinx公司的综合性FPGA开发软件,可以完成从设计输入到硬件配置的完整FPGA设计流程。本章将学习如何安装Vivado软件以及Vivado软件的使用方法,为大家在接下来学习实战篇打下基础。
本章包括以下几个部分:
44.1Vivado软件的安装
4.2Vivado软件的使用
4.3在线逻辑分析仪的使用
4.4生成固化文件



4.1Vivado软件的安装
Xilinx公司每年都会对Vivado设计套件进行更新,各个版本之间除界面以及其它性能的优化之外,基本的使用功能都是一样的,我们光盘中提供的是最新版Vivado 19.2版本,接下来安装Vivado 19.2(以下简称Vivado)版本的软件。
首先在达芬奇FPGA开发板资料盘(B盘)→Vivado 19.2文件夹下找到Vivado 19.2的安装包文件,文件列表如图 4.1.1所示:

图 4.1.1 Vivado 19.2安装文件
将压缩包解压出来(注意,解压目录的路径名称只能够包含字母、数字、下划线,否则安装程序有可能出问题),双击解压出来的文件夹下的“xsetup.exe”,如下图所示:

图 4.1.2 双击“xsetup.exe”
进入Vivado的安装引导页面,点击“Next”,如下图所示:


图 4.1.3 安装引导页面
在接下来的页面中,勾选3个“I Agree”,然后点击“Next”如下图所示:

图 4.1.4 勾选“I Agree”
接下来是选择版次,这里我们选择全功能的版次,即“System Edition”,其包含最多的子组件。如下图所示:

图 4.1.5 选择版次
接下来是选择工具组件和器件库。为了节省存储空间,我们将用不到的工具组件和器件库去掉,如下图所示:

图 4.1.6 选择组件和器件库
最下面的“Disk Space Required”表示在当前选项下Vivado在安装完成后所占用的磁盘空间大小,为76.42GB。由此可见,Vivado对硬盘存储空间的占用相对来说还是挺大的。
点击“Next”,进入安装目录设置页面,如下图所示:

图 4.1.7 安装目录设置
图中红色方框内是对安装目录的设置,默认安装在C盘下的“Xilinx”文件夹下,如果需要,可以点击后面的三个点来修改安装目录。其他的设置保持默认即可。
点击“Next”,出现Summary界面,该界面是对先前所有安装配置信息的总结,供用户浏览确认。确认无误后,点击“Install”会开始Vivado设计套件的安装。如下图所示:(由于Vivado在安装期间会占用大量的电脑CPU资源和内存资源,所以这里建议大家在开始安装之前,尽量关闭电脑中其他的不必要的应用软件)

图 4.1.8 开始安装
之后会出现下面的正在安装界面:

图 4.1.9 正在安装
安装过程可能会耗费一些时间,请大家耐心等待。在安装期间可能会出现如下消息:

图 4.1.10 点击确定即可
意思是请断开所有的Xilinx下载器与电脑的连接,大家直接点击确定即可。最后出现了安装成功的消息窗口,如下图所示:

图 4.1.11 安装成功
大家直接点击确定即可。一同弹出的还有“Vivado License Manager”窗口,我们可以选择30天试用期,也可以通过购买正版的Xilinx 的License等途径来正常使用(请查看安装包目录下“安装说明.txt”)。如下图所示:



图 4.1.12 “Vivado License Manager”窗口
至此,Vivado设计套件的安装就成功完成了,大家可以在电脑桌面上看到Vivado 2019.2的图标,如下图所示:

图 4.1.13 Vivado 2019.2的桌面图标
4.2Vivado软件的使用
在开始使用Vivado软件之前,大家有必要了解一下Vivado软件的使用流程,如下图所示:

图 4.2.1 Vivado软件使用流程
从上图可以看出,首先打开Vivado软件,新建一个工程,在新建工程的时候,大家可以通过新建工程向导的方式来创建工程;工程建立完成后,大家需要新建一个Verilog顶层文件,然后将设计的代码输入到新建的Verilog顶层文件中;HDL源代码输入完毕之后,就是对设计文件进行分析与综合了。
在代码输入以及设计分析阶段,Vivado软件会检查代码,如果代码出现语法错误,那么Vivado软件将会给出相关错误提示。在FPGA设计中,综合(Synthesis)就是将RTL设计转变为由FPGA器件中的查找表(LUT)、触发器(FF)等各种底层电路单元所组成的网表,在这个过程中综合器也会对设计进行优化,例如,删除多余的逻辑等等。
综合完成后,大家就需要进行约束的输入。约束表达了设计者期望满足的时序要求,规范了设计的时序行为,并在综合与实现阶段来指导工具进行布局和布线,工具会按照你的约束尽量去努力布局和布线,以满足设计的时序要求,并在时序报告中给出结果。常用的约束包括时序约束、引脚约束等等。
接下来就可以实现整个设计了,包括布局和布线等。如果实现成功,则Vivado会给出提示结果。此时,就可以生成用于下载到器件中的比特流文件了。最后,大家通过下载器来将这个比特流文件下载到FPGA中,完成整个开发流程。
在这里只是简单的介绍了一下上述的流程图,让大家有个大致的了解,接下来将以LED灯闪烁实验的工程为例,对每个流程进行详细的操作演示,一步步、手把手带领大家学习使用Vivado软件。
4.2.1新建工程
大家直接点击桌面上的Vivado 2019.2软件图标,打开Vivado软件,Vivado软件启动界面如图 4.2.2所示,然后点击“Create Project”来创建一个新的工程。

图 4.2.2 vivado启动界面
出现下图所示窗口,我们直接点击“Next”:

图 4.2.3 新建工程向导
接下来输入工程的名称和路径。名称要能反应出工程所实现的功能,本次工程实现了LED闪烁的功能,因此工程名称命名为“led_twinkle”。工程路径是指定本次工程存放在电脑磁盘中的位置,这个大家可以自行选择路径,需要说明的是,工程路径不能包含中文、空格或者其它一些特殊的符号,否则工程会创建失败。工程名和路径的设置如下图所示。

图 4.2.4 输入工程名和路径
这里有个需要注意的地方,由于默认勾选了“Create project subdirectory”选项,Vivado会在所选工程目录下自动创建一个与工程名同名的文件夹,用于存放工程内的各钟文件。Vivado会自动管理工程文件夹内的各种工程文件,并创建相应的子目录,这为大家的开发工作带来了很大的便捷。
大家继续点击“Next”,接下来是工程类型的选择,这里选择“RTL Project”,如下图所示:

图 4.2.5 工程类型选择
这里简单介绍下各个工程类型的含义。“RTL Project”是指按照正常设计流程所选择的类型,这也是常用的一种类型,“RTL Project”下的“Do not specify sources at this time”用于设置是否在创建工程向导的过程中添加设计文件,如果勾选后,则不创建或者添加设计文件;“Post-synthesis Project”在导入第三方工具所产生的综合后网表时才选择;“I/O Planning Project”一般用于在开始RTL设计之前,创建一个用于早期IO规划和器件开发的空工程;“Imported Project” 用于从ISE、XST或Synopsys Synplify导入现有的工程源文件;“Example Project”是指创建一个Vivado提供的工程模板。
选择了“RTL Project”后,大家点击“Next”,进入添加源文件页面。这里有个情况需要注意,如果勾选中图 4.2.5中“RTL Project”下的“Do not specify sources at this time”,则不会出现添加源文件的界面。
在弹出添加源文件的界面后,可以在此处创建/添加源文件,当然也可以直接点击“Next”,创建完工程后再创建/添加源文件。这里直接点击“Next”,如下图所示:

图 4.2.6 添加源文件
接下来是添加约束文件,这里也是直接点击“Next”,即在创建完工程后创建/添加约束文件,如下图所示:

图 4.2.7 添加约束文件
接下来是选择器件型号,“Family”一栏选择“Artix-7”、“Package”一栏选择“fgg484”、“Speed”一栏选择“-2”,此时下面的器件列表就会自动筛选出符合以上设置条件的器件,在器件列表中我们选择“xc7a35tfgg484-2”,如下图所示:


图 4.2.8 器件选择
点击“Next”,进入工程概览页面,这个页面将之前几个步骤中的设置全部列了出来,供用户检查,如下图所示:

图 4.2.9 工程概览
确认无误后大家直接点击“Finish”,就进入了Vivado的工程主界面,如下图所示:

图 4.2.10 工程主界面
下面介绍Vivado工程主界面中的几个主要子窗口:
(1)Flow Navigator:Flow Navigator提供对命令和工具的访问,其包含从设计输入到生成比特流的整个过程。 在点击了相应的命令时,整个Vivado工程主界面的各个子窗口可能会作出相应的更改。
(2)数据窗口区域:默认情况下,Vivado IDE的这个区域显示与设计源文件和数据相关的信息,例如:
• Sources窗口:显示层次结构(Hierarchy)、IP源文件(IP Sources)、库(Libraries)和编译顺序(Compile Order)的视图。
• Netlist窗口:提供分析后的(elaborated)或综合后的(synthesized)逻辑设计的分层视图。
(3)Properties窗口:显示有关所选逻辑对象或器件资源的信息。
(4)工作空间(Workspace):工作区显示了具有图形界面的窗口和需要更多屏幕空间的窗口,包括:
• 用于显示和编辑基于文本的文件和报告的Text Editor。
• 原理图(Schematic)窗口
• 器件(Device)窗口
• 封装(Package)窗口
(5)结果窗口区域:在Vivado IDE中所运行的命令的状态和结果,显示在结果窗口区域中,这是一组子窗口的集合。在运行命令、生成消息、创建日志文件和报表文件时,相关信息将显示在此区域。默认情况下,此区域包括以下窗口:
• Tcl Console:允许您输入Tcl命令,并查看以前的命令和输出的历史记录。
• Messages:显示当前设计的所有消息,按进程和严重性分类,包括“Error”、“Critical Warning”、“Warning”等等
• Log:显示由综合、实现和仿真运行创建的日志文件。
• Reports:提供对整个设计流程中的活动运行所生成的报告的快速访问。
• Designs Runs:管理当前工程的运行。
(6)主工具栏:主工具栏提供了对Vivado IDE中最常用命令的单击访问。
(7)主菜单:主菜单栏提供对Vivado IDE命令的访问。常用的命令会一直显示(例如,File > Project > Open),而其他命令只在设计活动时显示(例如,Reports > ReportDRC)。一些菜单命令有一个相关的键盘快捷方式,该快捷方式列在该菜单命令的旁边。
(8)窗口布局(Layout)选择器:Vivado IDE提供预定义的窗口布局,以方便设计过程中的各种任务。布局选择器使大家能够轻松地更改窗口布局,大家也可以使用菜单栏中的“Layout”菜单来更改窗口布局。
4.2.2设计输入
下面就来创建工程顶层文件,大家点击“Sources”窗口中的“+”号,如下图所示:

图 4.2.11 添加源文件
弹出下图所示界面,选择添加设计源文件,这里需要注意的是Vivado不支持使用原理图的方式来输入设计,然后点击“Next”:


图 4.2.12 选择添加设计源文件
点击“Create File”,如下图所示:

图 4.2.13 点击创建源文件
弹出如下对话框,将输入源文件的名称设为“led_twinkle”,然后直接点击OK即可,如下图所示:

图 4.2.14 输入源文件名称
这时大家可以看到列表中已经出现了刚刚新创建的源文件,如下图所示:

图 4.2.15 添加的源文件
点击Finish,会出现如下窗口:

图 4.2.16 定义顶层模块名和模块端口
此窗口用于设置源文件的模块名称和端口列表,Vivado会根据在此窗口中的设置,自动地在HDL源文件中写入相应的verilog语句。我们会手动输入代码,所以这里不作任何设置,直接点击OK即可。
这时“Sources”窗口中就出现了我们刚刚创建的源文件,如下图所示:

图 4.2.17 源文件创建完毕
双击打开该源文件,将其中打开原本存在的代码替换为如下LED灯闪烁的代码:
1module led_twinkle(
2      input          sys_clk,//系统时钟
3      input          sys_rst_n,//系统复位,低电平有效
4
5      outputled         //LED灯
6);
7
8//reg define
9regcnt ;
10
11 //*****************************************************
12 //**                  main code
13 //*****************************************************
14
15 //对计数器的值进行判断,以输出LED的状态
16 assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
17 //assign led = (cnt < 26'd5)         ? 2'b01 : 2'b10 ;//仅用于仿真
18
19 //计数器在0~5000_000之间进行计数
20 always @ (posedge sys_clk or negedge sys_rst_n) begin
21   if(!sys_rst_n)
22         cnt <= 26'd0;
23   else if(cnt < 26'd5000_0000)
24 //else if(cnt < 26'd10)//仅用于仿真
25         cnt <= cnt + 1'b1;
26   else
27         cnt <= 26'd0;
28 end
29
30 endmodule
这里需要注意的是,源代码前面的序号是为了方便大家查看代码的,在将源代码拷贝到软件编辑区的时候,需要去掉前面的序号,大家也可以直接从正点原子光盘中提供的Verilog源代码中拷贝,源代码位于光盘中的4_SourceCode/1_Verilog/1_led_twinkle工程文件夹中(如果是压缩包的话,需要先解压)。
代码编写完成后,在软件中显示的界面如图图 4.2.18所示。

图 4.2.18 Verilog文件编写完成界面
另外,如果读者认为Vivado的Text Editor默认的字体比较小,也可以依次点击“Settings”——“Text Editor”——“Fonts and Colors”,在对画框的“size”选项中来修改字体大小,默认是12,我们修改为20,如下图所示:

图 4.2.19 修改代码的字体大小
接下来单击工作空间中的保存按钮,来保存编辑完成后的代码,如下图所示:

图 4.2.20 保存源文件按钮
每次保存后,Vivado都会对源文件进行部分语法的检查,如果有语法的错误,Vivado会给出提示。另外,在大多数情况下,Vivado IDE会自动识别设计的顶层模块,当然,用户也可以手动指定顶层模块。从“Sources”窗口的右击菜单中选择“Set as Top”来手动定义顶级模块
4.2.3功能仿真
输入了RTL源代码之后,大家就可以对设计进行功能仿真了。在进行功能仿真之前,我们先看一下典型的FPGA设计流程,流程图如下:

图 4.2.21 FPGA的设计流程
从上图可以看到,在设计输入之后,设计综合前进行RTL级仿真,称为综合前仿真,也称为前仿真或功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,检测源代码是否符合功能要求。这时的仿真的对象为HDL代码,可以比较直观的观察波形的变化,在设计的最初阶段发现问题,节省大量的精力。
在布局布线后进行的仿真称为布局布线后仿真,也称为后仿真或时序仿真。时序仿真可以真实地反映了逻辑的时延与功能,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。
Vivado设计套件内部集成了仿真器Vivado Simulator,能够在设计流程的不同阶段运行设计的功能仿真和时序仿真,结果可以在Vivado IDE集成的波形查看器中显示。Vivado还支持与诸如ModelSim、Verilog Compiler Simulator (VCS)、Questa Advanced Simulator等第三方仿真器的联合仿真。
功能仿真需要的文件:
1.设计HDL源代码:可以是VHDL语言或Verilog语言。
2.测试激励代码(TestBench):根据设计要求输入/输出的激励程序,由于不需要进行综合,书写具有很大的灵活性。
3.仿真模型/库:根据设计内调用的器件供应商提供的模块而定,如:FIFO、ADD_SUB等。在使用Vivado Simulator时,仿真器所需的仿真模型/库是预编译好并集成在Vivado中的,因此不需要进行额外的预编译操作,直接加载HDL设计和TestBench即可执行仿真。
接下来我们开始在Vivado IDE中进行仿真,首先首先创建一个TestBench。我们点击“Sources”窗口中的“+”号(Add Sources命令),在弹出的窗口中选择“Add or Create Simulation Sources”,如下图所示:

图 4.2.22 选择添加仿真源文件
点击next,在接下来的页面中点击“Create File”,如下图所示:

图 4.2.23 点击“Create File”
在弹出的对话框中输入TestBench的文件名“tb_led_twinkle”,如下图所示:

图 4.2.24 输入TestBench的文件名
TestBench源文件名称的后缀“tb”可以用来向用户示意该源文件是一个TestBench源文件,仅用于仿真,并不能用于设计的综合和实现。建议大家按照这种规范来创建TestBench,以免设计源文件和仿真源文件相混淆。
点击OK,然后直接点击“Finish”即可,如下图所示:

图 4.2.25 完成TestBench的创建
在弹出的自定义模块窗口中我们直接点击OK即可,结束TestBench源文件的创建,如下图所示:


图 4.2.26 结束TestBench的创建
此时大家就可以在Source窗口中看到刚刚创建的TestBench,双击打开它后发现其模块内部什么都没有定义,如下图所示:

图 4.2.27 打开TestBench
我们将其替换为如下代码:
1`timescale 1ns / 1ps
2
3module tb_led_twinkle();
4
5//输入
6reg         sys_clk;
7reg         sys_rst_n;
8
9//输出
10 wire   led;
11
12 //信号初始化
13 initial begin
14   sys_clk = 1'b0;
15   sys_rst_n = 1'b0;
16   #200
17   sys_rst_n = 1'b1;
18 end
19
20 //生成时钟
21 always #10 sys_clk = ~sys_clk;
22
23 //例化待测设计
24 led_twinkleu_led_twinkle(
25   .sys_clk         (sys_clk),
26   .sys_rst_n       (sys_rst_n),
27   .led             (led)
28   );
29
30 endmodule
编写完成后,单击保存按钮来保存TestBench。
为了让读者能够更好的理解,这里我们就简单介绍一下TestBench源代码。进行仿真首先要规定时间单位,我们建议大家最好在Testbench里面统一规定时间单位,不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题。代码的第1行的timescale是Verilog语法中的不可综合语法,用于定义仿真的时间表示仿真的单位时间为1ns,精度为1ps,这时Xilinx官方推荐的仿真单位时间和精度。代码的第3行就是TestBench的模块名定义,第6行至第10行是我们的数据类型定义,到了第13~18行是信号的初始化,第21行是时钟信号的生成,50MHz时钟对应周期为20ns,第24行是被测模块的调用。
在开始仿真之前,大家有一点需要注意,我们在Vivado软件中实现的功能是LED闪烁效果,它的间隔时间是500ms,如果我们想要仿真这个功能,那么我们仿真软件运行时间最低就是500ms。这500ms在我们看来是很短很短的,而对仿真软件来说是很漫长的,毕竟我们的仿真时间单位可是1ns。为了便于我们仿真,这里我们需要稍微改动“led_twinkle.v”文件的代码,将计时器counter的最大计时值设为10,如下图所示:

图 4.2.28 修改源文件
这里,我们将源代码注释掉,并将源代码复制一份放到源代码的前面,将计数值修改为10。待仿真结束后进行分析和综合时,再将标记为“仅用于仿真的”的语句注释掉或者直接删除。
在“Flow Navigator”窗口中点击“Run Simulation”并选择“Run Behavioral Simulation”,如下图所示:

图 4.2.29 Run Simulation命令
之后我们就进入了仿真界面,如下图所示:

图 4.2.30 仿真界面
下面分别介绍仿真界面中的各个子窗口:
(1)Scope窗口:Scope(范围)是HDL设计的层次划分。在Scope窗口中,您可以看到设计层次结构。当大家选择了一个Scope层次结构中的作用域时,该作用域内的所有HDL对象,包括reg、wire等都会出现在“Objects”窗口中。大家可以在“Objects”窗口中选择HDL对象,并将它们添加到波形查看器中。
(2)Object窗口:“Objects”窗口会显示在“Scopes”窗口中选择的范围内的所有HDL仿真对象。例如,我们在Scope窗口中选择顶层模块“led_twinkle”,在“Objects”窗口中就会自动显示出led_twinkle模块中所有的对象。如下图所示:

图 4.2.31 “Objects”窗口中的对象
可以看出,在led_twinkle顶层模块中除了顶层端口sys_clk、sys_rst_n和led之外,还包括在内部定义的计数器cnt。
(3)波形窗口:用于显示所要观察信号的波形。若要向波形窗口添加单个HDL对象或多个HDL对象,在“Objects”窗口中,右键单击一个或多个对象,然后从下拉菜单中选择“Add to Wave Window”选项。例如,我们把“led_twinkle”模块下的“cnt”计数器添加到波形窗口中,如下图所示:

图 4.2.32 将“cnt”计数器添加到波形窗口中
添加到波形窗口中的“cnt”计数器如下图所示:

图 4.2.33 添加到波形窗口中的“cnt”计数器
一般来说,每当我们进行一次仿真时,都会把当前波形的配置信息保存下来,包括波形窗口中具有哪些信号等等,以便在下一次打开仿真器进行仿真时,继续使用上一次仿真的配置信息。我们点击波形窗口中的保存按钮,如下图所示:

图 4.2.34 波形窗口中的保存按钮
之后会弹出“Save Waveform”对话框,提示用户将当前波形配置信息保存为“.wcfg”后缀的文件,且工具已经自动地输入了文件名“tb_led_twinkle _behav”,文件的保存目录也被工具自动设置为了当前的工程目录,所以我们保持其默认状态即可,直接点击“Save”。如下图所示:

图 4.2.35 保存.wcfg文件
这里有个地方需要大家注意下,wcfg文件只是包含波形窗口的配置信息,并不包含波形的数据文件,波形的数据文件被存储在另外的文件中。
在点击保存后会弹出一个消息框,询问用户是否将刚刚创建的波形配置信息文件tb_led_twinkle _behav.wcfg添加到当前工程中,我们直接点击“Yes” 即可。如下图所示:

图 4.2.36 将tb_led_twinkle _behav.wcfg文件添加到工程中
(4)仿真工具栏:仿真工具栏包含运行各个仿真动作的命令按钮。从左至右依次是:
• Restart:将仿真时间重置为零,此时波形窗口中原有的波形都会被清除。下次执行仿真时,会从0时刻重新开始。
• Run all:运行仿真,直到其完成所有事件或遇到HDL语句中的$stop或$finish命令为止。注意,如果没有在TestBench语句中加入$stop或$finish命令,当点击Run all命令时,仿真器会无休止地一直仿真下去,除非用户点击仿真工具栏中的“Break”按钮来手动地结束仿真。但是这里有个地方需要注意,如果此时需要仿真的设计比较复杂,则仿真器在运行仿真时会耗费电脑大量的CPU和内存资源,此时有可能会造成电脑卡顿甚至死机的情况。所以,如果设计比较复杂,且没有在TestBench语句中加入$stop或$finish命令,最好不要轻易点击Run all命令。
• Run For:运行特定的一段时间。紧随在后面的两个文本框用于设定仿真时长的数值大小和时间单位。
• Step:按步运行仿真,每一步仿真一个HDL语句。
• Break:暂停当前仿真。
• Relaunch:重新编译仿真源并重新启动仿真。在使用Vivado仿真器来调试HDL设计时,您可能会根据仿真结果来对您的HDL源代码进行修改。在修改完HDL源代码后,可以点击Relaunch按钮来重新加载UUT设计和TestBench,以重新对修改后的HDL源代码进行仿真。此时就不需要再关闭并重新打开仿真器了。
介绍完各个窗口和命令按钮的使用后,我们就可以开始仿真了。
在刚打开仿真器时,仿真器会首先将TestBench中的信号加入到波形窗口中,并执行一段时长的仿真,仿真的时长由Settings设置窗口中的参数值指定,如下图所示:

图 4.2.37 Settings窗口中设置默认仿真时长的参数值
可以看到,仿真器启动后默认立即执行的仿真时长是1000ns。由于我们是在默认立即执行仿真结束之后,才加入了“cnt”计数器信号,所以新加入的cnt信号并没有波形。此时我们需要将仿真时刻重置为0,重新开始仿真。点击Restart按钮,波形窗口中的当前仿真时刻点(黄色标尺)就会回归到0ns,且原先的所有波形都被清除,如下图所示:

图 4.2.38 Restart仿真
此时点击仿真工具栏中的Run For按钮,默认仿真时长是10us,如下图所示:

图 4.2.39 Run For按钮
此时就可以看到波形窗口中就出现了波形,我们点击波形窗口中的显示工具栏中的“Zoom Fit”按钮,波形就会自动缩放到整个窗口,如下图所示:

图 4.2.40 “Zoom Fit”按钮
按住“Ctrl”键并滚动鼠标滚轮,就可以放大/缩小波形,如下图所示:

图 4.2.41 放大波形
cnt信号默认显示为16进制,为了方便观察,我们将其设置为10进制。对cnt信号右键,在弹出的菜单中依次选择“Radix”——“Unsigned Decimal”,如下图所示:

图 4.2.42 按无符号10进制显示
修改显示后的波形如下图所示:

图 4.2.43 波形
这里可以看出,cnt每计数到10,led就翻转一次。证明我们的HDL设计达到了我们想要的功能。
至此,仿真结束。
4.2.4分析与综合
功能仿真通过之后,就可以对设计进行分析(Elaborated)了。我们首先将源代码中为仿真而修改的部分恢复成原来的代码,如下图所示:

图 4.2.44 将仿真用的代码恢复成原来的代码
点击“Flow Navigator”窗口中的“Open Elaborated Design”按钮,如下图所示:

图 4.2.45 “Open Elaborated Design”按钮
此时,Vivado会编译RTL源文件进行全面的语法检查,并在Messages窗口中给出相应的“Error”和“Warning”。打开分析后(Elaborated)的设计后,Vivado会生成顶层原理图视图,并在默认view layout中显示设计,如下图所示:

图 4.2.46 打开的分析后的设计
可以看到,此时窗口布局已经发生了变化,新增了Schematic(原理图)、Netlist(网表)等窗口。此时,底部的Messages窗口会显示出现在分析阶段产生的消息,如下图所示:

图 4.2.47 Messages窗口中的消息
可以看出,我们的led_twinkle源代码并没有产生警告或者错误。
此时,我们也可以进行I/O引脚分配,在右上角的窗口布局(Layout)选择器中选择“I/O Planing”,如下图所示:

图 4.2.48 点击“I/O Planing”Layout
此时,窗口布局会打开一些与IO规划相关的子窗口,如下图所示:

图 4.2.49 I/O Planing窗口布局
在下方的“I/O Ports”窗口中,就可以进行IO的分配了。这里我们暂时不分配,先对设计进行综合,综合之后再统一输入时序约束和IO引脚的物理约束。
我们首先将打开的分析后的设计关闭。在工作区域的顶部标题栏处,用鼠标右击,在弹出的命令列表中选择“close”,如下图所示:

图 4.2.50 关闭分析后的设计
我们点击“Flow Navigator”窗口中的“Run Synthesis”按钮,如下图所示:

图 4.2.51 “Run Synthesis”按钮
在弹出的窗口中我们直接点击OK,如下图所示:

图 4.2.52 Launch Runs窗口
这时可以看到在“Design Runs”窗口中显示正在综合,如下图所示:

图 4.2.53“Design Runs”窗口
综合完成后,弹出如下窗口:

图 4.2.54 综合完成
我们关闭该窗口。接下来进行约束的输入。
4.2.5约束输入
大家首先需要创建一个用于存储约束语句的约束文件。点击“Sources”窗口中的“+”号,在弹出的窗口选择“Add or create constraints”,如下图所示:

图 4.2.55 添加约束文件
点击next,在接下来的界面中点击“Create File”,如下图所示:

图 4.2.56 Create File
在弹出的对话框中输入约束文件的名称“led_twinkle”,然后点击OK,如下图所示:

图 4.2.57 输入约束文件的名称
然后直接点击Finish即可,如下图所示:

图 4.2.58 点击Finish
这时我们就可以在“Sources”窗口中看到添加的这个约束文件了,如下图所示:

图 4.2.59 添加完成的约束文件
这里有个地方需要大家注意下,Vivado的约束文件是以“.xdc”为文件后缀的ASCII文本文件,其中存储的是一条条的xdc约束命令。
我们双击打开led_twinkle.xdc,输入如下内容:
1 #时钟周期约束
2 create_clock -name clk -period 20
3
4 #IO管脚约束
5 set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33}
6 set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33}
7 set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} }]
8 set_property -dict {PACKAGE_PIN R3 IOSTANDARD LVCMOS33} }]
下面我们以sys_clk时钟引脚为例,简要介绍xdc文件的语法。第一行以“#”号开头,表示这是一条注释语句。第二行是有效的约束命令。每一个约束命令单独占用一行,命令的结尾没有如verilog中的分号“;”一样的语句结束符号。每一条注释也单独占用一行。命令的第一个关键字代表该命令的名称,其后的所有字段都是该命令的参数列表。例如,在第二行的时钟周期约束命令中,“create_clock”是该命令的名称,它会创建一个时钟;其后的“-name clk”、“-period 20”、“”都是该命令的各个参数,分别表示所创见的时钟的的名称是“clk”、时钟周期是20ns、时钟源是sys_clk引脚。
第5行至第8行是对IO管脚的引脚位置约束和电平标准约束。例如,在第5行中,“set_property”是命令的名称;“PACKAGE_PINR4”是引脚位置参数,代表引脚位置是R4;“”代表该约束所要附加的对象是sys_clk引脚, “IOSTANDARDLVCMOS33”代表该引脚所使用的电平标准是LVCMOS33。
其他IO引脚的约束命令的语法与sys_clk引脚是相同的,这里就不再重复了。但是要注意,create_clock约束命令只能在sys_clk时钟引脚上使用,其他普通IO上不能使用create_clock约束命令。
点击Text Editor中的保存按钮后,就完成了约束的输入。
另外,为了便于大家的查看,我们整理出了包含开发板上所有引脚分配的表格,该表格位于资料盘/3_正点原子达芬奇FPGA开发板原理图/达芬奇FPGA开发板IO引脚分配表。
4.2.6设计实现
约束输入完毕之后,就可以开始实现设计了。我们点击点击“Flow Navigator”窗口中的“Run Implementation”按钮,如下图所示:

图 4.2.60 点击“Run Implementation”按钮
在弹出的界面中直接点击OK即可,如下图所示:

图 4.2.61 开始实现
这时可以看到“Design Runs”窗口中显示实现正在进行,如下图所示:

图 4.2.62 正在实现
实现完成后会弹出提示窗口,我们直接点击取消来关闭窗口,如下图所示:

图 4.2.63 实现完成
这时我们再次查看“Design Runs”窗口中的实现结果,如下图所示:

图 4.2.64 实现结果
发现时序要求都已经满足,即没有报红,说明设计成功地在FPGA中完成了实现。
4.2.7下载比特流
要下载设计,首先要生成用于下载到器件中的比特流文件。我们点击“Flow Navigator”窗口中的“Generate Bitstream”按钮,如下图所示:

图 4.2.65 “Generate Bitstream”按钮
在弹出的窗口中直接点击OK,如下图所示:

图 4.2.66 开始生成比特流
此时我们可以看到在“Design Runs”窗口中显示正在生成比特流,如下图所示:

图 4.2.67 正在生成比特流
比特流生成完毕之后,Vivado会弹出提示窗口,我们点击取消关闭该窗口:

图 4.2.68 比特流生成完毕
接下来我们开始下载比特流,点击“Flow Navigator”窗口中的“Open Hardware Manager”按钮,如下图所示:

图 4.2.69 “Open Hardware Manager”按钮
接着Vivado就会打开Hardware Manager,同时窗口布局也跟着发生了变化,如下图所示:



图 4.2.70 Hardware Manager窗口布局
首先我们将下载器一端连接电脑,另一端与开发板上的JTAG接口相连接,然后连接开发板电源线。下图为达芬奇开发板的实物连接图:

图 4.2.71 达芬奇开发板连接实物图
点击“Hardware”子窗口中的“Auto Connect”按钮,如下图所示:

图 4.2.72 “Auto Connect”按钮
在“Hardware”子窗口中出现如下界面就表示Vivado就已经和下载器连接成功了,如下图所示:

图 4.2.73 与下载器连接成功
我们右击“xc7a35t_0”,在弹出的菜单中选择“Program Device”,如下图所示:

图 4.2.74 点击“Program Device”
在弹出的对话框中直接点击“Program”即可,如下图所示:

图 4.2.75 开始下载
下载完成之后,我们可以看到位于开发板上的LED灯在不断地闪烁,如下图所示:

图 4.2.76 LED灯闪烁
4.3在线逻辑分析仪的使用
传统的FPGA板级调试是由外接的逻辑分析仪连接到FPGA的控制管脚,然后将内部信号引出至引脚IO上,进行板级调试。这种方法的缺点是首先我们需要一个逻辑分析仪,而逻辑分析仪一般价格都比较昂贵,且对于需要测试几十个引脚的时候,选择使用外接的逻辑分析仪就比较繁琐了。在线逻辑分析仪克服了以上所有的缺点,其借用了传统逻辑分析仪的理念以及大部分的功能,并利用FPGA中的逻辑资源,将这些功能植入到FPGA的设计当中。一般地,在线逻辑分析仪的应用原理框图如下图所示:

图 4.3.1 在线逻辑分析仪的应用原理框图
其中,待测设计(Design Under Test,DUT)就是用户逻辑,它与片内的在线逻辑分析仪一起位于FPGA中。在线逻辑分析仪通过一个或多个探针(Probe)来采集希望观察的信号,然后通过片内的JTAG硬核组件,来将捕获到的数据传送给下载器,进而上传到Vivado IDE上以供用户查看。Vivado IDE也能够按照上述数据路径,反向地向片内在线逻辑分析仪传送一些控制信息。由此可见,在线逻辑分析仪不需要将待测信号引出至I/O上,也不需要电路板走线或者探点,当然更不需要外部的逻辑分析仪的花费,在Vivado中就可以将在线逻辑分析仪添加到设计中。但是在线逻辑分析仪会占用一定数量的内部逻辑资源,如块RAM、查找表、触发器等等。
在Vivado中,在线逻辑分析仪的功能被称为“集成逻辑分析器(Integrated Logic Analyzer,ILA)”,它以IP核的形式被加入到用户设计中。Vivado工具提供了三种具有不同集成层次的插入ILA方法,以满足不同Vivado用户群的不同需求:
• 集成层次最高的方法是直接在HDL代码中例化一个ILA IP核,也被称为“HDL实例化调试探针流程”。ILA IP核可以在IP Catalog(IP目录)中找到,并对其进行配置,以符合所需的调试需求。这是最直接的方法,但其灵活性也较差。在调试工作完毕之后,还需要在HDL源代码中删除ILA IP核,然后重新综合并实现,以生成最终的设计。
• 第二种方法是在综合后的网表中,分别标记要进行调试观察的各个信号,然后通过一个简单的“Setup Debug”向导来设置各个探针和ILA IP核的工作参数,然后工具会根据用户设置的参数,自动地加入各个ILA IP核。这个方法也被称为“网表插入调试探针流程”。在此流程中,用户不需要修改HDL源代码,并且能够单独控制每个ILA IP核以及每个探针,这样就提供了很大的灵活性。用户设置的调试信息会以Tcl XDC调试命令的形式保存到XDC约束文件中,在实现阶段,Vivado会读取这些XDC调试命令,并在布局布线时加入这些ILA IP核。在调试工作完毕之后,用户就可以在综合后的网表中删除ILA IP核,然后实现最终的设计。
• 集成层次最低的方法,手动地在XDC约束文件中书写对应的Tcl XDC调试命令,在实现阶段工具会自动读取这些命令,并在布局布线时加入这些ILA IP核。在调试工作完毕之后,用户还需要在XDC约束文件中删除这些命令,然后实现最终的设计。
本小节同样以LED灯闪烁实验的工程为例,介绍前两种ILA调试流程,即“HDL实例化调试探针流程”和“网表插入调试探针流程”。
4.3.1实例化调试探针流程
“HDL实例化调试探针流程”需要在HDL源代码中实例化ILA IP核。我们点击“Flow Navigator”窗口中的“IP Catalog”按钮,如下图所示:

图 4.3.2 “IP Catalog”按钮
这时“IP Catalog”窗口就被打开了,如下图所示:

图 4.3.3 “IP Catalog” 窗口
我们在搜索栏中输入“ILA”,这时Vivado会自定根据关键词搜索出相应的结果,我们双击“ILA(Integrated Logic Analyzer)”,如下图所示:


图 4.3.4 搜索ILA
在弹出“Customize IP”窗口中,最上面的“Component Name”一栏用于设置ILA IP核的名称。IP核的配置包含两个子页面,分别是“General Options”和“Probe_Ports(0..0)”, “General Options” 页面用于设置ILA IP核的总体设置,“Probe_Ports(0..0)”页面用于对每个探针的参数进行设置。在“General Options” 页面中,“Number of Probes”一栏用于设置所需的探针数量,一般地,一个探针用于连接一个待测信号,例如,我们要想观察“led”和“counter”这两个信号,则需要把“Number of Probes”设置为2;“Sample Data Depth”用于设置采样深度,在每个采样时钟下,ILA都会将捕获到的探针信号的值送入RAM中,由于RAM的存储空间是有限的,所以此选项就用于设置RAM最大存储多少个探针信号的值,我们保持其默认1024,其数值越大,消耗的RAM资源也越多。其它选项保持默认即可,如下图所示:

图 4.3.5 “Customize IP”窗口
在“Probe_Ports(0..0)”页面中,用于设置每个探针的参数,一般我们只需设置探针宽度“Probe Width ”一栏即可,由于“led”和“cnt”这两个信号的宽度分别为2和26,所以我们需要将其分别设置为2和26,然后点击OK即可,如下图所示:

图 4.3.6 设置探针宽度
在弹出的对话框中直接点击OK即可,如下图所示:

图 4.3.7 点击OK
接下来就会弹出“Generate Output Products”对话框,我们保持默认设置,直接点击“Generate”即可,此时Vivado就开始对该ILA IP核进行OOC综合了。如下图所示:

图 4.3.8 开始为ILA IP核生成输出文件
在这里,我们简要介绍一下Vivado的OOC(Out-of-Context)综合的概念。对于顶层设计,Vivado使用自顶向下的全局(Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为OOC方式的模块除外,它们独立于顶层设计而单独综合。通常,在整个设计周期中,顶层设计会被多次修改并综合。但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如IP,它们被设置为OOC综合方式,OOC模块只会在综合顶层之前被综合一次。这样,在顶层的设计迭代过程中,OOC模块就不必跟随顶层模块,而进行一次次的会产生相同结果的多余的综合了。所以,OOC流程减少了设计周期时间,并消除了设计迭代,使大家可以保存和重用综合结果。
Out-of-Context(OOC) 综合是一种自底向上的设计流程,默认情况下,Vivado设计套件使用OOC的设计流程来综合OOC模块。OOC模块可以是来自IP catalog的IP、来自Vivado IP Integrator的block design或者顶层模块下手动设置为OOC方式的任何子模块。
来自IP catalog的IP就默认使用OOC综合的方式,例如上图中的“Synthesis Options”选项就设置为了“Out of Context Per IP”。这些IP会在顶层的全局综合之前,单独地进行OOC综合并生成输出产品(Generate Output Products),包括综合后的网表等各种文件。在对顶层进行综合时,OOC模块会被视为黑盒子,并且不会参与到顶层的综合中来。在综合之后的实现过程中,OOC模块的黑盒子才会被打开,这时其网表才是可见的并参与到全局设计的布局布线中来。
介绍完了OOC综合的概念,现在我们回到ILA的调试流程中来。在“Design Runs”窗口中可以看到Vivado正在为ILA IP核运行OOC综合,如下图所示:

图 4.3.9 ILA IP核正在进行OOC综合
OOC综合完毕之后如下图所示:

图 4.3.10 综合完毕
这时可以在“Source”窗口中看到已经出现了ILA IP核,如下图所示:

图 4.3.11 添加的ILA IP核
由于我们还没有把它例化到顶层的HDL代码中,所以在层次结构上它与顶层并排。下面我们将其例化到顶层的HDL代码中。在“Source”窗口中的“IP Sources”选项卡中双击ILA IP核的例化模板文本文件,找到例化模板的内容,如下图所示:

图 4.3.12 例化模板
将图中的红色方框中的模板代码复制并粘贴到led_twinkle.v顶层HDL代码中,并将ILA的时钟和探针信号连接到顶层设计中,如下图所示:

图 4.3.13 将ILA例化到顶层中
我们将ILA的时钟连接到了顶层时钟sys_clk信号上,probe0探针连接到了led,probe1探针连接到了cnt。保存源文件之后就可以直接综合并实现设计,最后生成比特流。
至此,我们就成功地使用“HDL实例化调试探针流程”将ILA IP核添加到了设计中。接下来就可以将比特流下载到FPGA中,并对信号进行在线观察,这一部分内容在本小节的第3子小节中叙述。
4.3.2网表插入调试探针流程
“网表插入调试探针流程”需要在综合后的网表中,将要进行调试观察的各个信号,标记“Mark_Debug”属性,然后通过“Setup Debug”向导来设置ILA IP核的参数,最后工具会根据参数来自动创建ILA IP核。
我们点击“Flow Navigator”窗口中的“Open Synthesized Design”按钮,如下图所示:

图 4.3.14 点击“Open Synthesized Design”按钮
在综合后设计的窗口布局选择器中,我们选择“Debug”窗口布局,如下图所示:

图 4.3.15 切换到“Debug”窗口布局
此时,Vivado打开了“Netlist”子窗口、“Schematic”子窗口以及“Debug”子窗口。其中,“Netlist”子窗口和“Schematic”子窗口都用于标记要进行观察的信号,“Debug”子窗口用于显示并设置ILA IP核的各个参数。如下图所示:

图 4.3.16 “Debug”窗口布局
在“Debug”子窗口中,又包含两个选项卡“Debug Cores”和“Debug Nets”。这两个选项卡都用于显示所有的已标记为“Mark_Debug”的信号。不同之处在于,“Debug Cores”选项卡是一个更加以ILA IP核为中心的视图,所有已标记为“Mark_Debug”的信号并且已经被分配到ILA探针的信号都会被显示在各个ILA IP核的视图树下,已标记为“Mark_Debug”的信号但是还没有被分配到ILA探针的信号被显示在“Unassigned Debug Nets”下,当然也可以在其中查看和设置ILA IP核的各种属性和参数。“Debug Nets”选项卡仅显示已标记为“Mark_Debug”的信号,但不显示ILA IP核,所有已标记为“Mark_Debug”的信号并且已经被分配到ILA探针的信号都会被显示在“Assigned Debug Nets”下,已标记为“Mark_Debug”的信号但是还没有被分配到ILA探针的信号被显示在“Unassigned Debug Nets”下。
我们首先标记要进行观察的信号,以led信号为例,在“Netlist”子窗口中的“Nets”目录下,找到“led_OBUF”网络,右击该网络(此时右边的“Schematic”子窗口也会自动地高亮选择此网络,因为“Netlist”子窗口中的对象和“Schematic”子窗口中的对象,两者之间是交叉选择的),在弹出的菜单中心选择“Mark Debug”命令,如下图所示:

图 4.3.17 在“Netlist”子窗口中点击“Mark debug”命令
也可以在“Schematic”子窗口中选择网络,然后右键选择“Mark Debug”命令,如下图所示:

图 4.3.18 在“Schematic”子窗口中点击“Mark debug”命令
另外,也可以在HDL源代码中为想要观察的reg或wire信号添加“Mark Debug”属性,例如:
(* mark_debug = “true” *)regcnt ;
其中“(* mark_debug = “true” *)”必须紧挨在变量声明的前面。这样,在综合完之后打开综合后的设计,counter信号就自动被标记了“Mark Debug”属性。
此时在“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就会出现我们刚刚标记的“led_OBUF”网络。,如下图所示:

图 4.3.19 “Unassigned Debug Nets”目录下的“led_OBUF”网络
同理我们将cnt信号标记为“Mark Debug”,如下图所示:

图 4.3.20 将cnt信号标记为“Mark Debug”
此时“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就有了“led_OBUF”和“cnt”两个信号,如下图所示:


图 4.3.21 标记为“Mark Debug”的“led_OBUF”和“cnt_reg”两个信号
之后我们点击“Debug”子窗口中的“Setup Debug”按钮,如下图所示:

图 4.3.22 “Setup Debug”按钮
弹出“Setup Debug”向导,我们直接点击next,如下图所示:

图 4.3.23 “Setup Debug”向导
接下来的页面是选择用于采样待测信号的时钟域,Vivado会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟,例如,我们刚刚添加的这“led_OBUF”和“cnt”两个信号就属于“sys_clk_IBUF”时钟域,并且Vivado也已经自动将“sys_clk_IBUF”时钟设置为了这两个信号的采样时钟,如下图所示:

图 4.3.24 选择待测信号的时钟域
当然,用户也可以手动指定各个用于采样待测信号的时钟域,右击待测信号,选择“Select Clock Domain”,弹出“Select Clock Domain”窗口,如下面两个图所示:

图 4.3.25 手动指定待测信号的时钟域1

图 4.3.26 手动指定待测信号的时钟域2
在“Select Clock Domain”窗口中就可以选择用于采样待测信号的时钟了。“Setup Debug”向导会为每个采样时钟生成一个单独的ILA IP核,由于本例程中只有一个时钟,所以这里最后只会生成一个ILA IP核。
设置完采样时钟后,我们点击next,接下来的页面用于设置ILA IP核的全局设置,如下图所示:

图 4.3.27 ILA IP核的全局设置
其中“Sample of data depth”用于设置采样深度,“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。
我们点击next,就进入了最后的概览页面,确认无误后直接点击finish即可,如下图所示:

图 4.3.28 完成“Setup Debug”向导
在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到Vivado已经添加了ILA IP核,并且“Unassigned Debug Nets”目录下已经没有未被分配的信号了,如下图所示:

图 4.3.29 添加了ILA IP核的“Debug”子窗口
网表中被标记为Mark Debug的信号也变为了虚线,以表示其完成了      ILA IP核的分配,如下图所示:

图 4.3.30 网表中完成Setup Debug的信号
前面我们提到过,在“网表插入调试探针流程”中,用户设置的调试信息会以Tcl XDC调试命令的形式保存到XDC约束文件中,在实现阶段,Vivado会读取这些XDC调试命令,并在布局布线时加入这些ILA IP核。此时,我们所做出的所有的更改和设置,都还只是停留在电脑内存中,我们需要将其保存在硬盘的XDC约束文件中,点击工具栏中的保存按钮,如下图所示:

图 4.3.31 保存按钮
在出现的对话框中直接点击OK,如下图所示:

图 4.3.32 点击OK
弹出的“Save Constraints”窗口中,用于询问用户将约束保存在哪个XDC约束文件中,本例的工程中只有一个XDC约束文件,如下图所示,我们直接点击OK即可:

图 4.3.33 设置要保存的XDC约束文件
此时,我们打开led_twinkle.xdc,就会看到在用户约束的下面,Vivado自动写入了用于debug的约束,如下图所示:

图 4.3.34 Vivado自动写入的用于debug的约束1

图 4.3.35 Vivado自动写入的用于debug的约束2
在实现阶段,Vivado会读取这些约束,并按照这些命令的参数来自动地在布局布线时加入ILA IP核。
至此,我们就成功地使用“网表插入调试探针流程”将ILA IP核添加到了设计中。接下来就可以将实现设计并生成比特流,最后将比特流下载到FPGA中,以对信号进行在线观察,这一部分内容在本小节的第3子小节中叙述。
4.3.3 在Hardware Manager中进行观察调试信号
生层比特流之后,我们打开Hardware Manager,连接到开发板,并下载比特流,如下图所示:

图 4.3.36 下载比特流
在弹出的窗口中,Vivado会自动识别比特流文件和具有调试探针信息的.ltx文件,如下图所示:

图 4.3.37 下载比特流和调试文件
.ltx文件存储了调试探针的信息,用来传递给Vivado IDE,它是从您的设计中被提取出来的。通常来说,调试探测文件是在实现过程中自动创建的,并位于和比特流文件相同的目录下。若实现后的设计中包含了ILA IP核,则在下载比特流时,Vivado会自动识别出.ltx文件。这里我们不必太多地关注此文件,只要按照Vivado自动的设定来下载设计即可。
我们直接点击“Program”,此时Vivado会自动打开ILA的调试窗口,如下图所示:

图 4.3.38 ILA的调试窗口
Vivado已经自动地将待测探针信号添加到了波形窗口中,如下图所示:

图 4.3.39 自动添加到波形窗口中的探针信号
下面开始触发条件的设置。在这里简要介绍一个触发的概念。前面我们介绍过,ILA会将每个时钟周期所采集到的探针数据存放在RAM中,然后通过JTAG和下载器上载到Vivado。那么触发就是决定ILA会在什么时候将RAM中的探针数据上载到Vivado,当ILA检测到触发条件得到满足时,就会把RAM中的探针数据上传到Vivado,然后Vivado将探针数据的波形显示出来。
我们在“Trigger Setup”窗口中添加触发条件,将cnt信号添加进来,如下图所示:

图 4.3.40 添加cnt信号到“Trigger Setup窗口中来
之前我们在HDL代码中设置为了cnt计数器每计数到26'd25_000_000就将led翻转一次,为了方便led翻转状态的查看,我们可以将触发条件设置为“cnt”等于十进制数25_000_000,即ILA检测到counter计数器的值等于26'd25_000_000时,就会将RAM中的数据上载到Vivado,如下图所示:

图 4.3.41 设置触发条件
然后我们就可以开始进行触发动作了。在波形窗口中有4个触发动作,如下图所示:

图 4.3.42 触发动作
从左至右依次是:(1)自动触发开关、(2)开始触发、(3)立即触发、(4)停止触发。下面对他们分别进行介绍:
(1)自动触发开关,它和“开始触发”按钮联合在一起使用。若打开了此选项,则在ILA开始运行触发(即点击了“开始触发”按钮)后,会不断地对触发条件进行检测,每次触发条件被满足时(即cnt计数到了25_000_000),都会将RAM中存储的所有的探针数据上载到Vivado,Vivado上显示的波形也会随之不断更新,直到用户点击了“停止触发”按钮。若没有点击此选项,则在ILA开始运行触发(即点击了“开始触发”按钮)后,在检测到触发条件得到满足并完成了上载数据之后,就会停止触发,等待用户下一步的指令。
(2)开始触发,它和“自动触发开关”按钮联合在一起使用。点击之后ILA就会开始进行触发操作。
(3)立即触发,立即将当前ILA RAM中的数据上载到Vivado,而不管触发条件是否得到满足。
(4)停止触发,停止当前正在进行的触发活动。
我们这里直接点击“开始触发”按钮,而不打开“自动触发”开关。然后由于cnt计数器每隔500ms就会计数到25_000_000,所以我们几乎马上就可以看到波形窗口中出现了波形,如下图所示:

图 4.3.43 更新的波形
将波形放大之后就可以看到counter的具体值,如下图所示:

图 4.3.44 将波形放大
可以看到,默认是16进制显示,我们将其修改为10进制,右击cnt探针,在弹出菜单中选择“Radix”,然后选择“Unsigned Decimal”,如下图所示:

图 4.3.45 将数值修改为10进制显示
此时就可以看到,在当counter计数到25_000_000时,led的状态就会发生跳变,如下图所示:

图 4.3.46 进制显示的波形
读者也可以尝试再次点击“开始触发”按钮或打开“自动触发”按钮,来观察波形。至此,在线逻辑分析仪的使用就介绍完毕。
4.4生成固化文件
通过前面的介绍,相信读者已经学会了如何使用Vivado这款软件了,但是当我们调试好一个工程后我们不能每次上电都要去下载一次代码,那样显得操作太麻烦。为了能够让工程上电就能运行,所以我们还需要最后一个步骤就是生成固化文件,然后将文件固化到板载flash中去,这样上电后程序就能启动。这里我们向读者提供三种方法固化工程,在生成固化文件之前我们先打开我们的工程时序约束文件,在时序约束文件里添加这样一段原语:
set_property CFGBVS VCCO
set_property CONFIG_VOLTAGE 3.3
set_property BITSTREAM.GENERAL.COMPRESS true
set_property BITSTREAM.CONFIG.CONFIGRATE 50
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes
如下图所示:

图 4.4.1 bit流约束原语
添加这段原语的目的主要是为了生成的bit流文件转换成固化文件后能够适用于4bit位宽SPI通信的flash器件。
4.4.1用Vivado控制台生成.mcs文件
如下图所示首先在工具栏找到Tools,打开扩展框然后点击Generate Memory Configuration File。

图 4.4.2 Generate Memory Configuration File
之后会出现器件编辑选项框(Create a configuration file to program the device )如图所示:

图 4.4.3 器件编辑
从图中我们可以看到一些配置选项,在此仅对我们需要用到的一些配置做简要介绍:
Format:指的生成文件的格式,这里我们选择生成MCS文件。
Custom Memory Size(MB):指的是所用flash的容量大小,这里选128(根据flash手册决定)。
Filename:这里编辑生成的mcs文件名称,右边的三个点按钮是选择mcs文件保存路径。
Interface:指的是所用flash的通信方式,这里我们选SPIx4(4bit通信flash,根据flash手册决定)。
Load bitstream files:这个选项勾上,然后添加你要生成mcs文件的原文件(bit流文件)。
Write checksum:写校验。
Disable bit swapping:禁止位交换。
Overwrite:覆盖原文件。
配置选项完成后点击OK,会出现下图提示信息,这就代表我们mcs文件生成成功,点击OK就行。

图 4.4.4 生成mcs文件
4.4.2使用tcl指令生成.mcs文件
上述的使用vivado控制台生成mcs文件对新手比较友好,对老手来讲可能就觉得比较慢了,所以接下来向读者介绍另一个方法,使用tcl指令来生成mcs文件。首先在信息栏窗口找到Tcl Console如下图所示:


图 4.4.5 Tcl指令栏
然后在指令栏中输入write_cfgmem -format mcs -interface SPIx4 -size 128 -loadbit {up 0x0 E:/led_twinkle/led_twinkle/led_twinkle.runs/impl_1/led_twinkle.bit} -file E:/led_twinkle/led_twinkle/led_twinkle.runs/impl_1/led_twinkle.mcs然后按回车键就可以生成mcs文件了,指令运行成功可以看到如图所示信息:

图 4.4.6 Tcl指令正确执行
这里简单向读者介绍一下这个指令的含义:
write_cfgmem:命令头。
-format mcs:生成文件格式为mcs。
-interface SPIx4:flash的通信协议及位宽(QSPI也写成SPI)。
-size 128:flash容量128M。
-loadbit{up0x0 E:/led_twinkle/led_twinkle/led_twinkle.runs/impl_1/led_twinkle.bit } :加载bit流文件的路径和bit流文件。
-file E:/led_twinkle/led_twinkle/led_twinkle.runs/impl_1/led_twinkle.mcs:生成的mcs文件及保存路径。
建议读者将这条指令保存下来,下次使用只需要替换一下文件路径和源文件就可以直接使用了。
4.4.3使用Vivado生成.bin文件。
上面已经介绍过两种方法生成mcs文件,接下来在向读者介绍一种生成.bin文件的方法。
如下图所示,首先找到Flow Navigator栏,点击Settings

图 4.4.7 Settings
之后会出现如下图所示的选项栏:

图 4.4.8 生成bin文件
这个选项栏中先在左边Project Settings栏选中Bitstream,然后在右边的选项栏中选择-bin_file,之后点击Apply等待Apply按钮变成灰色,再点击OK。然后我们重新生成bit流文件,bin文件会同时生成,并且和bit流在同一个路径下。
4.4.4添加flash器件及下载固化文件
上文已经详细介绍了如何生成固化文件,相信读者已经都学会了,但是光有固化文件还不够,我们还要添加一个固化flash器件。
首先将板子连接到PC端(不熟悉的可以参考上文“下载比特流”),连接完成后如下图所示:


图 4.4.9 选中FPGA器件
在硬件栏中我们选中器件xc7a35t_0(1),右击如下图所示

图 4.4.10 添加Flash
我们继续点击“Add Configuration Memory Device”如下图所示

图 4.4.11 选择Flash
刚进入这个界面的时候整个Filter栏四个筛选框应该是四个ALL,我们将筛选条件改成上图所示。之后你会发现最底下器件栏只剩下两个了,我们选择mt25ql128-spi-x1_x2_x4,然后点击OK。会出现下图所示的询问栏:

图 4.4.12 生成Device
继续点击OK会出现下图所示的选项栏:

图 4.4.13 添加mcs下载文件
我们按照图示添加对应的mcs文件和对应的.prm文件点击OK就可以下载了,下载完成后会出现下图通知栏,点击OK即可。


图 4.4.14 下载成功
上面的操作是没有产生mcs文件的操作,那么已经产生了mcs文件应该怎么下载呢?如下所示:

图 4.4.15 再次下载
在所选择的flash的型号上右击,出现右侧的扩展框,点击扩展框内红色的方框所框的选项,出现如图 4.4.13所示界面,然后按照上面的操作就可以将程序固化进开发板了。
到这里我们的固化就成功了,将板子断电重启即可,至于BIN文件的下载流程和mcs一样,感兴趣的可以自己尝试一下。

4.4.5擦除固化文件
上文介绍了如何固化文件,接下来将介绍如何擦除固化文件。
同样在所选择的flash的型号上右击,出现右侧的扩展框,点击扩展框内红色的方框所框的选项,如下图所示:

图 4.4.16 选择下载
在弹出的界面内只勾选“Erase”擦除,点击OK,如下图所示:


图 4.4.17 选择擦除
过一会儿弹出如下界面,即表示成功擦除板子原先存在的固化文件。


图 4.4.18 擦除成功
断电重启开发板,会发现原来的程序将不再执行。
页: [1]
查看完整版本: 【正点原子FPGA连载】第四章Vivado软件的安装和使用