详细见Xilinx官方文档:Vivado软件使用手册(UG893)。
频率的意义,取决于对象架构,比如,arm 和 fpga,对主频要求是不一样的,本质是arm是串行运行,而FPGA是并行的,所以频率要求不在同一个频道上,arm追求高频,而fpga则不苛刻于arm一个level。
1.Vivado简介
-
Vivado设计套件,是赛灵思(Xilinx)公司最新的为其产品定制的集成开发环境,支持Block Design、Verilog、VHDL等多种设计输入方式,内嵌综合器以及仿真器,可以完成从设计输入、综合适配、仿真到下载的完整FPGA设计流程。(S6 ISE之前的老环境软件,现在主推vivado,Verilog语言)
-
Vivado集成了HLS(High Level Synthesis)工具,可以实现直接使用 C,C++ 以及 System C 语言对Xilinx的FPGA器件进行编程。用户无需手动创建 RTL,通过高层次综合生成HDL级的IP核,从而加速IP创建。
2.Vivado开发流程
在开始使用 Vivado 软件之前,我们先来了解一下 Vivado 软件的使用流程:
注意:可以跳过综合、实现,直接生成下载
从上图可以看出,主要有如下六步:
-
首先打开 Vivado 软件,新建一个工程,在新建工程的时候,我们可以通过新建工程向导的方式来创建工程;
-
工程建立完成后,我们需要新建一个 Verilog 顶层文件,然后我们将设计的代码输入到新建的 Verilog 顶层文件中;
-
HDL 源代码输入完毕之后,就是对设计文件进行分析与综合了。
在代码输入以及设计分析阶段,Vivado 软件会检查代码,如果代码出现语法错误,那么 Vivado 软件 将会给出相关错误提示。
在 FPGA 设计中,综合(Synthesis)就是将 RTL 设计转变为由 FPGA 器件中的查 找表(LUT)、触发器(FF)等各种底层电路单元所组成的网表,在这个过程中综合器也会对设计进行优化,例如,删除多余的逻辑等等。
-
综合完成后,我们需要进行约束的输入。
约束表达了设计者期望满足的时序要求,规范了设计的时序行为,并在综合、实现阶段来指导工具进行布局、布线,工具会按照你的约束尽量去努力实现以满足时序 要求,并在时序报告中给出结果。常用的约束包括时序约束、引脚约束等等。
-
接下来就可以实现整个设计实现了,包括布局和布线等。如果实现成功,则 Vivado 会给出提示结果。此时,就可以生成用于下载到器件中的比特流文件了。
-
最后,我们会通过下载器来将这个比特流文件下载到 FPGA 中,完成整个开发流程。
操作如下:
接下来输入工程的名称和路径:
-
名称要能反应出工程所实现的功能,本次工程实现了 LED 闪烁的功 能,因此项目名称命名为“led_twinkle”。
-
工程路径是指定本次工程存放在电脑磁盘中的位置,这个大家可以自行选择路径。
注意:
由于默认勾选了“Create project subdirectory”选项,Vivado 会在所选工程目录下自动创建一个 与工程名同名的文件夹,用于存放工程内的各种文件。并且 Vivado 会自动管理工程文件夹内的各种工程文 件,并创建相应的子目录,这为我们的开发工作带来了很大的便捷。
我们继续点击“Next”按钮,接下来是工程类型的选择,我们选择“RTL Project”,如下图所示:
这里简单介绍下各个工程类型的含义:
-
“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 提供的工程模板。
接下来是添加约束文件,我们也是直接点击“Next”,创建完工程后再创建/添加约束文件,如下图所 示:
接下来选择开发板的芯片型号,我们可以直接在搜素框中输入完整的芯片型号,大家根据自己所使用 的 ZYNQ 核心板型号进行选择。如果使用的是 ZYNQ-7020 核心板,则输入“xc7z020clg400-2”
最后进入工程概览页面,这个页面将之前几个步骤中的设置全部列了出来,供用户检查,选择不同的 芯片型号,概览页面列举的芯片型号也不一样,我们直接点击“Finish”按钮完成工程的创建。
工程创建完成后,就进入了 Vivado 的工程主界面,如下图所示:
下面介绍 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):
工作区显示了具有图形界面的窗口和需要更多屏幕空间的窗口,包 括:
• Project Summary。提供了当前工程的摘要信息,它在运行设计命令时动态地更新。
• 用于显示和编辑基于文本的文件和报告的 Text Editor。
• 原理图(Schematic)窗口。
• 器件(Device)窗口。
• 封装(Package)窗口。
(5)结果窗口区域:
在 Vivado IDE 中所运行的命令的状态和结果,显示在结果窗口区域中,这是一 组子窗口的集合。在运行命令、生成消息、创建日志文件和报告文件时,相关信息将显示在此区域。默认 情况下,此区域包括以下窗口:
• Tcl Console:允许您输入 Tcl 命令,并查看以前的命令和输出的历史记录。
• Messages:显示当前设计的所有消息,按进程和严重性分类,包括“Error”、“Critical Warning”、“Warning”等等
• Log:显示由综合、实现和仿真 run 创建的日志文件。
• Reports:提供对整个设计流程中的活动 run 所生成的报告的快速访问。
• Designs Runs:管理当前工程的 runs。
(6)主工具栏:
主工具栏提供了对 Vivado IDE 中最常用命令的单击访问。
(7)主菜单:
主菜单栏提供对 Vivado IDE 命令的访问。
(8)窗口布局(Layout)选择器:
Vivado IDE 提供预定义的窗口布局,以方便设计过程中的各种任 务。布局选择器使您能够轻松地更改窗口布局。或者,可以使用菜单栏中的“Layout”菜单来更改窗口布 局。
下面我们就来创建工程顶层文件,我们点击“Sources”窗口中的“+”号,如下图所示:
弹出下图所示界面,我们选择添加设计源文件(注意,Vivado 不支持使用原理图的方式来输入设 计),然后点击“Next”按钮,如下图所示:
接下来在弹出的页面中添加或者创建一个文件。
-
果事先有编写好的代码,可以点击“Add Files”按 钮来添加文件;
-
如果没有,则点击“Create File”创建一个新的设计文件。
接下来会弹出一个对话框,对创建的设计文件进行命名。
接下来会弹出一个定义模块的页面,用于设置源文件的模块名称和端口列表,Vivado 会根据在此窗口 中的设置,自动地在 HDL 源文件中写入相应的 verilog 语句。我们会手动输入代码,所以这里不作任何设 置,直接点击“OK”按钮即可,如下图所示。
这时工程主界面的“Sources”窗口中就出现了我们刚刚创建的源文件,如下图所示:
我们双击打开“led_twinkle”文件,删除文件中默认的代码,然后替换成 LED 灯闪烁代码,代码如 下:
代码编写完成后,软件中显示的界面如下图所示:
另外,如果读者认为 Vivado 的 Text Editor 默认的字体比较小,也可以依次点击“Settings”→“Text Editor” →“Fonts and Colors”,在窗口中的“Size”选项中来修改字体大小,默认是 12,我们修改为 20。
单击工作空间中的保存按钮或者按下键盘的“Ctrl+S”,来保存编辑完成后的代码:
另 外,在大多数情况下,Vivado IDE 会自动识别设计的顶层模块,当然,用户也可以手动指定顶层模块。从 “Sources”窗口的右击菜单中选择“Set as Top”来手动定义顶级模块。
代码输入完毕之后,就可以对设计进行分析(Elaborated)了。
点击“Flow Navigator”窗口中的 “Open Elaborated Design”按钮,如下图所示:
此时,Vivado 会编译 RTL 源文件并进行全面的语法检查,并在 Messages 窗口中给出相应的“Error” 和“Warning”。
-
如果出现“Error”,则分析失败,用户必须修改设计文件,并重新编译源文件来取消 “Error”。
-
如果出现“Warning”,用户也可逐一查看,以确定哪些是设计缺陷,哪些是可以忽略的。
开分析后(Elaborated)的设计,Vivado 会生成顶层原理图视图,并在默认 view layout 中显示设计,如下 图所示:
可以看到,此时窗口布局已经发生了变化,新增了 Schematic(原理图)、Netlist(网表)等窗口。
此时,我们也可以进行 I/O 引脚分配,在右上角的窗口布局(Layout)选择器中选择“I/O Planing”:
现在,我们可以做下管脚约束:
此时,窗口布局会打开 IO 相关的子窗口,如下图所示:
在下方的“I/O Ports”窗口中,就可以进行 IO 的分配了:
手动指定的方式:
如何管脚分配(约束),我们需要查看原理图
A.时钟
B.复位
找核心板位置:
C.LED的,为方便,可以看隐射表:
led分配如下:
改完后保存:
点击OK,保存完,然后关闭:
生成的约束文件如下:
如果需要添加时序约束的话,可以在这里继续添加:
这里我们暂时不分配,先对设计进行综合, 综合之后再统一输入时序约束和 IO 引脚的物理约束。
我们关闭分析后的界面。在工作区域的顶部标题栏处,用鼠标右击,在弹出的命令列表中选择 “close”,如下图所示:
接下来点击“Flow Navigator”窗口中的“Run Synthesis”按钮,来对代码进行综合,如下图所示:
在弹出的窗口中我们直接点击 OK,如下图所示:
这时可以看到在“Design Runs”窗口中显示正在综合,如下图所示:
综合完成后,弹出如下窗口:
我们关闭该窗口。接下来进行约束的输入。
首先,我们需要先创建一个约束文件。
点击“Sources”窗口中的“+”号,在弹出的窗口选择“Add or create constraints”,点击“NEXT”按钮,如下图所示:
在弹出的对话框中输入约束文件的名称“led_twinkle”,然后点击“OK”按钮
接下来点击“Finish”按钮,完成约束文件的创建
这时我们就可以在“Sources”窗口中看到添加的这个约束文件了,如下图所示:
注意:
Vivado 的约束文件是以“.xdc”为后缀的文本文件,其中存储的是一条条的 xdc 约束命令。
编辑方式:
我们双击打开 led_twinkle.xdc 文件,开始对工程进行约束。
约束一般分为两种
-
一种是 IO 管脚的约束
-
另外一种是对时序进行约束。
A.IO管脚的约束
我们先来看下 IO 管脚的约束,约束语句如下:
命令的第一个关键字代表该命令的名称,其后的所有字段都是该命令的参数列表。
IO 管脚约束是对端口的 引脚位置和电平标准进行约束,例如:
第二行命令是对系统时钟的管脚进行约束:
-
“set_property”是命令的名称;
-
“PACKAGE_PIN U18”是引脚位置参数,代表引脚位置是 U18;
-
“[get_ports sys_clk]”代表该 束所要附加的对象是 sys_clk 引脚;
-
“IOSTANDARD LVCMOS33”代表该引脚所使用的电平标准是 LVCMOS33。
B.时序约束
IO 管脚约束比较好理解,就是我们的程序所驱动的 IO 和 ZYNQ 芯片的 IO 对应起来。
而时序约束 (Timing Constraints)用来描述设计人员对时序的要求,比如时钟频率,输入输出的延时等,以满足设计 的时序要求。
约束语句如下:
“create_clock”是该命令的名称,它会创建一个时钟;
其后的“-name clk”、“-period 20”、 “[get_ports sys_clk ]”都是该命令的各个参数,分别表示所创建时钟的名称是“clk”、时钟周期是 20ns、 时钟源是 sys_clk 端口,一般只对输入的时钟做周期的约束。
对时钟的约束最简单的理解就是,设计者需要告诉 EDA 工具设计中所使用的时钟的频率是多少;然 后工具才能按照所要求的时钟频率去优化布局布线,使设计能够在要求的时钟频率下正常工作。本次实验 sys_clk 的时钟频率为 50MHz,周期为 20ns,在做约束时可以等于这个值或者略低于这个值,不建议周期 设置的太小,否则软件在布局布线时很难满足这个要求。
其实对于比较简单的设计,可以不对工程做时序约束,即使不进行时序约束,也不影响最终的功能。而当设计变得复杂起来,或者输入的时钟频率比较高的时候,如果不添加时序约束,那么就有可能在验证 设计结果的时候出现一些意料之外的情况。由于本次实验较为简单,这里只对工程对 IO 管脚约束,不进 行时序约束,led_twinkle.xdc 文件输入 IO 管脚约束语句后,点击“保持”的图标或者按下键盘的 “Ctrl+S”进行保存。输入 IO 管脚约束语句后如下图所示:
保存按钮后,就完成了约束的输入。
注意:每个bank提供一个电压,每个提供了,都是这个电压!
约束输入完毕之后,就可以开始实现设计了。我们点击“Flow Navigator”窗口中的“Run Implementation”按钮,如下图所示:
在弹出的界面中直接点击 OK 即可
这时可以看到“Design Runs”窗口中显示正在进行实现,如下图所示:
实现完成后会弹出提示窗口,我们直接点击取消来关闭窗口,如下图所示:
这时我们再次查看“Design Runs”窗口中的实现结果,如下图所示:
在下载程序之前,首先要先生成用于下载到器件中的比特流文件,该文件的后缀为“.bit”。
点击 “Flow Navigator”窗口中的“Generate Bitstream”按钮,如下图所示:
在弹出的窗口中直接点击 OK,如下图所示
此时我们可以看到在“Design Runs”窗口中显示正在生成比特流,如下图所示:
比特流生成完毕之后,Vivado 会弹出提示窗口,我们点击取消关闭该窗口:
接下来我们开始下载比特流,点击“Flow Navigator”窗口中的“Open Hardware Manager”按钮,如 下图所示:
接着 Vivado 就会打开 Hardware Manager,同时窗口布局也跟着发生了变化,如下图所示:
接下来我们就要用到开发板和 Xilinx 下载器了。
首先将 Xilinx 下载器一端连接电脑,另一端与开发板 上的 JTAG 接口相连接;然后连接开发板电源线,并打开电源开关。
开发板连接完成并打开电源开关后,点击“Hardware”子窗口中的“Auto Connect”按钮,如下图所 示:
在“Hardware”子窗口中出现如下界面就表示 Vivado 就已经和下载器连接成功了,如下图所示:
我们点击上图中的“Program Device”,弹出的界面如下图所示:
此时 Bitstream File 一栏会自动识别到工程的比特流文件,我们直接点击“Program”按钮下载程序。
需要说明的是:
-
下载完比特流后,如果开发板断电,程序会丢失。
-
如果想要程序断电不丢失的话,需要将程序固化至开发板中,这个需要在嵌入式 SDK 软件中完成,ZYNQ 芯片无法单独固化比特流文件 (PL 的配置文件)。这是由于 ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分 的专用引脚,这些非易失性存储器由 PS 的 ARM 处理器进行驱动,需要将 bit 流文件和 elf 文件(软件程 序的下载文件)合成一个 BOOT.BIN,才能进行固化。详细见 ZYNQ 嵌入式 SDK 的开发流程。未来将在ZYNQ 之嵌入式开发指南的“程序固化”再讲解!
没有回复内容