第3章Vivado使用指南

Vivado设计套件是Xilinx公司于2012年发布的集成设计环境,是一个基于AMBA AXI4互联规范、IPXACT IP封装元数据、工具命令语言(TCL)、Synopsys系统约束(SDC)符合业界标准的开放式环境,能够支持多达1亿个等效ASIC门的设计。
基于Vivado的FPGA设计开发流程如图3.1所示,主要包括以下步骤。


图3.1Vivado设计的流程


(1) 创建工程。
(2) 编辑源设计文件,包括HDL文本、IP核、模块文件、网表输入等方式。
(3) 行为仿真(Behavioral Simulation),在别的软件中也被称为功能仿真、前仿真,即不包含延时信息的仿真; Vivado自带仿真器,也可以选择采用第三方仿真工具ModelSim等工具进行仿真。
(4) 添加引脚约束。
① 综合(Synthesis): 根据设定的编译策略,对工程进行综合,生成网表文件。
② 引脚约束: 通过I/O Planing或者直接编辑.xdc文件添加引脚约束信息。
③ 实现(Implimentation): 指针对某一具体的目标器件经布局布线(Place & Route),或者称为适配(Fitting),产生延时信息文件、报告文件(.rpt),以供时序分析、时序仿真使用。
(5) 生成Bitstream文件,产生.bit和.bin等编程文件。
(6) 将生成的Bitstream文件下载至FPGA芯片。

设计步骤的次序并非一成不变,可根据个人习惯及实际情况进行调整和修改; 同时,在设计过程中,如果出现错误(Error),需改正错误或调整电路后重复相应的步骤; 如果出现严重警告信息(Critical Warning),也需引起注意,要不断调整和优化,直至达成设计目标。
3.1Vivado流水灯设计
本节以使用Verilog语言设计流水灯为例,介绍在Vivado环境下运行Verilog程序的流程,包括源程序的编写、编译、仿真及下载。本例基于Vivado 18.2版本,其他不同版本的Vivado使用方法与此类似。
3.1.1流水灯设计输入
1. 创建新工程

首先建立一个工作目录,本例的工作目录为D:/exam。
(1) 双击启动Vivado 2018.2,出现如图3.2所示的Vivado启动界面,单击Quick Start栏中的Create Project(或者选择菜单File→New Project...命令),启动工程向导,创建一个新工程。


图3.2Vivado启动界面


(2) 在工程向导(如图3.3所示)界面中单击Next按钮。


图3.3启动工程向导


(3) 在图3.4所示的界面中命名工程名和存储路径,此处项目命名为led,其存放位置为D:/exam,勾选Create project subdirectory复选框,可为此工程在指定路径下建立独立的文件夹,最终整个项目存在D:/exam/led文件夹中。设置完成后,单击Next按钮。
注意: 工程名称和存储路径中不能出现中文和空格,建议工程名称以字母、数字、下画线来组成。


图3.4工程名称、路径设定界面


(4) 选择项目类型(如图3.5所示)界面,选择RTL Project类型,单击Next按钮。
注意: 如果在图3.5中勾选Do not specify sources at this time复选框,则跳过后面的(5)和(6),表示当前工程无须添加源文件和约束文件。

(5) 在图3.6所示的Add Sources界面中添加源文件并选择设计语言,其中Target language和Simulator language均选择Verilog,单击Next按钮。
(6) 不添加约束文件,所以在Add Constraints界面直接单击Next按钮。
(7) 在图3.7所示的器件选择界面中,根据使用的FPGA开发板,选择相应的FPGA目标器件。本例中,以Xilinx EGO1为目标板,故FPGA选择xc7a35tcsg3241,即Family选择Artix7,封装形式(Package)为csg324,单击Next按钮。



图3.5选择工程类型




图3.6添加源文件并选择设计语言





图3.7器件选择界面



(8) 最终出现图3.8所示的界面,对工程信息进行汇总,确认相关信息正确与否,包括工程类别、源文件、所用的FPGA器件等。如果没有问题,则单击Finish按钮完成工程的创建; 如果有问题,则返回前面界面进行修改。



图3.8工程信息汇总


2. 输入源设计文件
(1) 如图3.9所示,选择Flow Navigator下PROJECT MANAGER中的Add Sources选项,打开设计文件导入窗口。


图3.9工程管理窗口


(2) 在Add Sources界面(如图3.10所示)中选中Add or create design sources单选按钮,表示添加或创建Verilog(或VHDL)源文件,单击Next按钮。


图3.10添加或创建源文件


(3) 在图3.11中单击Create File按钮,在弹出的Create Source File对话框中输入File name为flow_led,单击OK按钮。


图3.11创建源文件


注意: 文件名中不可出现中文和空格; 如果有现成的.v或.VHD文件,可单击Add Files或者Add Directories按钮进行添加。

(4) 单击图3.12中的Finish按钮,完成源文件的创建。


图3.12完成源文件创建


(5) 在弹出的Define Module对话框中填写模块名称,此处模块命名为flow_led,如图3.13所示。还可以在I/O Port Definitions栏中填写模块的端口并设置端口方向,如果端口为总线型,勾选Bus选项,并通过MSB和LSB确定总线宽度。完成后单击OK按钮。


图3.13Define Module对话框


(6) 当前Vivado界面如图3.14所示,在中间的Sources窗格的Design Sources中出现新建的设计文件flow_led.v,双击打开该文件,利用Vivado自带的文本编辑器(Text Editor)输入设计代码。本例LED流水灯的代码如例3.1所示。



图3.14Verilog代码编辑窗口


【例3.1】8位流水灯源代码。



module flow_led(clk,clr,led);

input  clk,clr;






output reg [7:0] led;

reg [28:0] counter;



always @(posedge clk)

begin

if(!clr)  begin  counter <= 0;led <= 8'h01; end

else

if( counter < 50000000)//2Hz

counter <= counter + 1;

else

begin

counter <=0;

led <= {led[6:0],led[7]};

end

end

endmodule




3.1.2行为仿真
至此,已完成源文件输入,此时可对源文件进行行为(功能)仿真,以测试其功能。
(1) 创建激励测试文件,在Sources中右击选择Add Sources,在出现的Add Sources界面中(见图3.10)选择第三项Add or create simulation sources单选按钮,单击Next按钮。
(2) 在如图3.15所示的界面中单击Create File按钮,创建一个仿真激励文件,在弹出的Create Source File对话框中输入激励文件名称为tb_led,文件类型为Verilog,单击OK按钮,确认添加完成后单击Finish按钮。



图3.15创建仿真激励文件



(3) 在如图3.16所示的仿真模块定义界面中填写仿真模块的名字为tb_led,因为是激励文件不需要对外端口,所以I/O Port Definitions部分无须填写,单击OK按钮。


图3.16仿真模块定义界面


(4) Vivado界面如图3.17所示,在Sources窗格的Simulation Sources中出现新建的仿真文件tb_led.v,双击打开该文件,利用Vivado的文本编辑器输入激励代码。本例LED流水灯的Test Bench激励代码如例3.2所示。



图3.17Vivado工程管理界面


【例3.2】LED流水灯的Test Bench激励代码。



`timescale 1ns/1ns

module tb_led( );

parameter DELY=20;






reg clk;

reg clr;

wire [7:0] led;

flow_led i1(

.clk (clk),

.clr (clr),

.led (led));

initial  begin

clk=1'b0;  clr=1'b0;

#(DELY*2)  clr=1'b1;

end

always

begin

#(DELY/2)clk=~clk;

end

endmodule




(5) 在Flow Navigator中选择SIMULATION下的Run Simulation选项,并选择Run Behavioral Simulation,启动仿真界面,如图3.18所示。


图3.18仿真界面


端口信号自动出现在波形图中,此外,可通过左侧Scope一栏中的目录结构定位到想要查看的Module内部寄存器,在Objects对应的信号名称上右击选择Add To Wave Window,将信号加入波形图中查看。
(6) 可通过仿真工具条来对仿真进行设置和操作。仿真工具条如图3.19所示,包括复位波形(即清空现有波形)、运行仿真、运行特定时长的仿真、仿真时长设置、仿真时长单位、单步运行、暂停等操作。本例中仿真时长设置为500ms。


图3.19仿真工具条


(7) 最终得到的仿真波形如图3.20所示,检查此波形是否与预想的功能一致,以验证源设计文件的正确性。


图3.20行为仿真波形图


3.1.3综合与引脚的约束
1. 综合编译

(1) 如图3.21所示,在Flow Navigator中选择SYNTHESIS下的Run Synthesis选项,对当前工程进行综合,弹出Launch Runs对话框,在Options中选中Launch runs on local host单选按钮,在Number of jobs下拉列表中选择最大值,以缩短编译时间,此处选择8。


图3.21Synthesis综合编译


(2) 编译成功后,在Flow Navigator中选择Synthesis下的Schematic选项,可以查看综合后的电路图。本例的综合后的电路如图3.22所示。


图3.22综合后的电路图


2. 添加引脚约束文件
有两种方法可以添加引脚约束,第一种是利用Vivado中的I/O Planning功能(需先对工程进行综合,在综合后选择打开Open Synthesis Design,然后在右下方的选项卡中切换到I/O Ports栏,在对应的信号后输入对应的FPGA引脚号); 第二种是直接新建XDC约束文件。本例采用方法二。XDC(Xilinx Design Constraints)是Vivado采用的约束文件格式,它是在业界广泛采用的SDC(Synopsys Design Constraints)格式的基础上,加入Xilinx自身的一些物理约束来实现的。

(1) 在Flow Navigator中选择PROJECT MANAGER下的Add Sources选项(或右击约束子目录下的文件夹,选择Add Sourses...),打开如图3.23所示的Add Sources界面,选中第一项Add or create constraints单选按钮,单击Next按钮。


图3.23创建约束文件


(2) 在图3.24所示的界面中,单击Create File,在弹出的Create Constraints File对话框中输入XDC文件名,本例填写flow_led,单击 OK按钮,再单击Finish按钮。


图3.24输入约束文件名


(3) 如图3.25所示,在Sources窗格中双击flow_led.xdc文件名,打开该文件,填写引脚约束文件的内容。本例的引脚约束文件内容如例3.3所示。


图3.25编辑引脚约束文件


注意: 具体的FPGA约束引脚号和I/O电平标准,应参考目标板卡的用户手册或原理图。


【例3.3】LED流水灯的.XDC引脚约束文件。



#/////////////////////////////时钟和复位//////////////////////////////////

set_property -dict {PACKAGE_PIN P17 IOSTANDARD LVCMOS33} [get_ports clk]

set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports clr]

#/////////////////////////////LED0~LED7/////////////////////////////////

set_property -dict {PACKAGE_PIN K1 IOSTANDARD LVCMOS33} [get_ports {led[7]}]

set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {led[6]}]

set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33} [get_ports {led[5]}]

set_property -dict {PACKAGE_PIN J5 IOSTANDARD LVCMOS33} [get_ports {led[4]}]

set_property -dict {PACKAGE_PIN K6 IOSTANDARD LVCMOS33} [get_ports {led[3]}]

set_property -dict {PACKAGE_PIN L1 IOSTANDARD LVCMOS33} [get_ports {led[2]}]

set_property -dict {PACKAGE_PIN M1 IOSTANDARD LVCMOS33} [get_ports {led[1]}]

set_property -dict {PACKAGE_PIN K3 IOSTANDARD LVCMOS33} [get_ports {led[0]}]




3.1.4生成比特流文件并下载
(1) 如图3.26所示,在Flow Navigator中选择PROGRAM AND DEBUG下的Generate Bitstream选项,工程会自动完成综合、实现比特流文件的生成过程。完成后,选中Open Hardware Manager单选按钮,进入硬件编程管理界面。


图3.26生成比特流文件


(2) 进入如图3.27所示的HARDWARE MANAGER对话框,将目标板通过USB连接至计算机,打开电源开关,单击图3.27中的Open target,选择Auto Connect选项,使软件连接到目标板。


图3.27连接到目标板


(3) 软件和目标板连接成功后,软件界面如图3.28所示。
在目标芯片上右击,选择Program device,在弹出的Program Device对话框中,Bitstream file一栏已经自动加载本工程生成的比特流文件flow_led.bit,单击Program按钮对FPGA芯片进行编程下载。



图3.28芯片编程下载


(4) 下载完成后,在目标板上观察实际运行效果。
3.1.5将配置数据烧写至Flash中
如果将程序烧写到Flash(ROM)中,则程序会固化到板卡中,可脱机独立运行且掉电不丢失。
(1) 生成烧录至Flash中的.bin文件,选择菜单Tools中的Settings命令,在弹出的Settings对话框(如图3.29所示)中选择Bitstream,在右面勾选bin_file,单击OK按钮。



图3.29勾选_bin_file


(2) 在Flow Navigator中选择PROGRAM AND DEBUG下的Generate Bitstream选项(见图3.26),启动编译并自动生成.bit文件和用于固化的.bin文件。
(3) 将目标板连接至计算机,打开电源,进入HARDWARE MANAGER对话框,如图3.30所示,选中芯片xc7a35t,右击选择Add Configuration Memory Device。


图3.30添加Flash芯片


(4) 在Add Configuration Memory Device对话框(如图3.31所示)的搜索框中输入n25q64,选择n25q643.3v(根据所用的目标板,选择相应的Flash芯片型号),单击OK按钮。


图3.31选择Flash芯片型号


(5) 在HARDWARE MANAGER对话框中(如图3.32所示),选中Flash芯片n25q643.3v,右击选择Program Configuration Memory Device,弹出如图3.33所示的对话框,确认配置文件为flow_led.bin,单击OK按钮,完成对Flash芯片的编程。



图3.32选中Flash芯片




图3.33对Flash芯片编程



(6) 编程完成后,将开发板断电再重新上电,开发板会从Flash中启动,观察开发板的实际运行效果。
3.2IP核的创建和封装
基于IP核的设计对提高设计的复用具有优越性。Vivado本身自带了丰富的IP核,还允许设计者自己定义和封装IP核。本节以设计和封装功能类似74LS161和74LS00的IP核为例,介绍基于Vivado的IP核封装流程。
1. 创建工程
启动Vivado 2018.2,单击Quick Start栏中的Create Project,启动工程向导,创建一个新工程,将其命名为ip_161,存于D:/exam/ip_161文件夹中,如图3.34和图3.35所示。工程创建的过程可参考3.1节,此处不再赘述。


图3.34工程名称、路径设定




图3.35工程信息汇总


2. 输入源设计文件
在Flow Navigator中选择PROJECT MANAGER下的Add Sources选项,在弹出的界面中选中Add or Create Design Sources单选按钮(参见图3.10),创建一个名为ls161.v的源文件,其代码如例3.4所示,输入源文件后的Vivado界面如图3.36所示。


图3.36输入源设计文件


【例3.4】ls161核的源代码。



module ls161

#(parameter DELAY=3)(

input wire CLK,CLR,

input wire CET,CEP,LD,

input wire D0,D1,D2,D3,

output wire CO,

output wireQ0,Q1,Q2,Q3);



reg [3:0] Q = 0;

always@(posedge CLK or negedge CLR)

if(!CLR)

Q <= 4'h0;

else if(~LD)

Q <= {D3,D2,D1,D0};

else if(CET & CEP)

Q <= Q + 1'b1;

else Q <= Q;



assign #DELAY Q0 = Q[0];

assign #DELAY Q1 = Q[1];

assign #DELAY Q2 = Q[2];







assign #DELAY Q3 = Q[3];

assign CO=((Q==4'b1111)&&(CET==1'b1))? 1 : 0;



endmodule




在Flow Navigator中选择SYNTHESIS下的Run Synthesis选项,对当前工程进行综合。综合完成后在弹出的Synthesis Completed对话框中单击Cancel按钮,表示不再继续进行后续操作。
3. 创建IP核
(1) 在Flow Navigator中选择PROJECT MANAGER下的Settings选项,弹出Settings对话框,如图3.37所示,在左侧选中IP下面的Packager,在右侧的Packager标签页中定制IP核的库名和目录。


图3.37定制IP核属性


在Library(库名)处填写UIP,Category处填写74IP,勾选After Packaging下的Create archive of IP、Add IP to the IP Catalog of the current project复选框,其他按默认设置。
设置完成后单击Apply按钮,再单击OK按钮。
(2) 在Vivado主界面中,选择菜单Tools中的Create and Package New IP命令,如图3.38所示,启动创建和封装新IP的过程。此过程的启动界面如图3.39所示。


图3.38创建和封装新的IP





图3.39创建和封装新IP的启动界面


(3) 单击Next按钮,弹出如图3.40所示的封装选项界面,选中Packaging Options下的Package your current project单选按钮,表示将当前的工程封装为IP核,单击Next按钮。



图3.40封装选项界面


(4) 如图3.41所示,此界面中的IP location指示IP核的路径,以便设计者到此路径下将IP核导入别的工程中,也可通过单击右侧带省略号的按钮来给IP核指定新的位置,单击Next按钮。



图3.41IP核的路径


(5) 单击Finish按钮,完成IP核的创建,如图3.42所示。


图3.42IP核创建完成


4. 封装IP核
(1) 完成IP核的创建后,在Vivado主界面中,选择Sources窗格下的Hierarchy标签页,此时在Design Sources下方出现一个名为IPXACT的图标,其下有一个component.xml的文件,其中保存了封装IP核的信息,如图3.43所示。
(2) 在Vivado主界面右侧窗格中的Package IP标签页下,单击Identification可查看并修改IP核的相关信息,如图3.44所示。


图3.43IP核封装信息文件




图3.44封装IP核的Identification界面


(3) Compatibility界面显示IP核支持的FPGA系列,可以继续添加IP核支持的FPGA器件,单击右侧的加号,选择第一项Add Family Explicitly...,如图3.45所示。
(4) 在弹出的Add Family对话框中可添加除已支持的artix7(Artix7)外的其他器件系列,如图3.46所示,勾选完毕单击OK按钮。


图3.45IP核的Compatibility界面




图3.46添加IP核支持的器件系列


(5) 单击Customization GUI界面,在右侧可以预览IP核的信号接口,同时可以在Component Name文本框中修改IP核的名称,如图3.47所示。


图3.47Customization GUI界面


(6) 单击Review and Package界面,可查看IP核的最终信息,其中,Root directory表示IP核的存储目录,信息确认无误后单击下方的Package IP按钮,完成ls161核的封装,如图3.48所示。


图3.48Review and Package界面


(7) 回到Vivado主界面,选择PROJECT MANAGER中的IP Catalog选项,出现IP Catalog窗格,在其中的User Repository下可找到刚创建的ls 161_v1_0,说明该IP核已创建和封装成功,可以调用了,如图3.49所示。


图3.49查看IP核


5. 创建和封装另一IP核74ls00
采用与上面74ls161核相同的步骤,创建和封装功能类似74ls00(2输入与非门)的IP核,以供调用。ls00核的源代码如例3.5所示。
【例3.5】ls00核(2输入与非门)的源代码。



module ls00 

#(parameter DELAY = 3)(

input a,b,

output y

);



nand #DELAY (y,a,b);

endmodule




ls00核创建后,对其进行封装,其中Identification界面信息如图3.50所示。


图3.50ls00核的Identification界面


单击Review and Package界面,可查看ls00核的最终信息,信息确认无误后单击下方的Package IP按钮,完成ls00核的封装,如图3.51所示。


图3.51ls00核的Review and Package界面


3.3基于IP集成的计数器设计
本节利用3.2节创建和封装的ls161和ls00两个IP核,采用原理图设计的方式实现一个模9计数器,以说明基于IP集成的Vivado设计的流程。
1. 创建工程
启动Vivado 2018.2,单击Quick Start栏中的Create Project,启动工程向导,创建一个新工程,将其命名为count_bd,存于D:/exam/count_bd文件夹中。此过程不再详述。
2. 添加IP核
(1) 将3.2节中生成的IP封装目录中的压缩包“xilinx.com_UIP_ls161_1.0.zip”和“xilinx. com_UIP_ls00_1.0.zip”复制到当前工程目录中,并解压到新建的UIP目录下,解压后的文件目录如图3.52所示。



图3.52将IP核文件夹放至UIP目录下


(2) 在Flow Navigator中选择PROJECT MANAGER下的Settings选项,在弹出的Settings对话框的左侧选中IP,单击Repository,出现Repository标签页,单击+,进入当前工程目录,选中UIP文件夹(其中放置ls161、ls00两个IP核封装文件),单击Select按钮,在弹出的窗口中单击OK按钮,上述过程如图3.53所示。


图3.53将IP核封装文件加入IP库


(3) 如图3.54所示,D:/exam/count_bd/UIP文件夹已出现在IP Repositories下,单击Apply按钮,再单击OK按钮。


图3.54指定IP库


(4) 在PROJECT MANAGER下选择IP Catalog选项,在右侧的IP Catalog标签页中,展开User Repository,可以看到用户自定义的IP核ls161_v1_0和ls00_v1_0已经出现在IP库中,可以调用了,如图3.55所示。


图3.55将ls161和ls00核添加到IP库


3. 基于IP集成的原理图设计
(1) 进入Vivado主界面,在左侧的Flow Navigator中选择IP INTEGRATOR下的Create Block Design选项,在弹出的Create Block Design对话框的Design name栏中输入设计名count_bd,表示新建一个名为count_bd的原理图文件,如图3.56所示。



图3.56新建原理图并输入文件名


(2) 单击OK按钮,进入BLOCK DESIGN设计界面。在原理图中添加IP核,可采用如下方式: 
①  单击原理图中间区域的+按钮。
②  在Diagram图形界面上侧工具栏中单击+按钮。
③  在原理图空白区域右击,在弹出的快捷菜单中选择Add IP命令。
在弹出窗口的Search搜索栏中输入ls,在列表中选择ls161_v1_0,如图3.57所示。


图3.57在原理图中添加IP核


(3) 双击ls161_v1_0,或者按Enter键,将其添加到原理图中。采用同样的方法将IP核ls00_v1_0也调入原理图中,左击选中ls00_v1_0模块,右击,选择菜单Orientation中的Rotate Clockwise命令,连续执行两次,使其旋转180°,并将其移动到原理图上合适的位置,如图3.58所示。



图3.58添加IP核并合理布局


(4) 连线: 将鼠标指针移至ls161模块的Q0接口处,待其变成铅笔形状后,按下鼠标左键并拖曳到ls00模块的a接口处,释放鼠标左键后可看到两个接口信号已被连接起来。采用同样的方式进行其他连线。
(5) 创建端口。创建端口有以下两种方式。
①  在原理图空白处右击,在弹出的快捷菜单中选择Create Port...命令,在弹出的Create Port对话框中设置端口的名称、方向和类型。图3.59所示是创建了一个名为PT的输入端口; 图3.60所示是创建了一个名为Q0的输出端口。



图3.59创建一个名为PT的输入端口


②  单击选中模块的某一引脚,右击,在弹出的快捷菜单中选择Make External命令,可自动创建与引脚同名、同方向的端口。


图3.60创建一个名为Q0的输出端口


(6) 连线完成后的原理图如图3.61所示,单击原理图工具栏中的Regenerate Layout,自动对模块和连线进行优化布局。执行Regenerate Layout后的原理图如图3.62所示。在完成后将对原理图存盘。



图3.61完成后的原理图




图3.62执行Regenerate Layout后的原理图


(7) 完成原理图后,生成顶层文件。
①  在BLOCK DESIGN对话框的Hierarchy标签页中,在Design Sources下的count_bd.bd图标上右击,在弹出的快捷菜单中选择Generate Output Products命令,如图3.63所示。


图3.63选择Generate Output Products命令



②  弹出Generate Output Products对话框,如图3.64所示。Synthesis Options选项组中有如下选项。


图3.64Generate Output Products对话框


Global: 表示全局综合,选择此选项,则IP核生成的文件将会和其他文件一起进行综合,即每一次设计文件被修改后,IP核文件都会跟着一起综合一遍。
Out of context per IP: 即OOC选项,此选项是Vivado的默认选项,选择此选项,Vivado将会把生成的IP核当作一个单独的模块来综合,生成.dcp(design checkpoint)文件; 在运行实现(Implementation)时,Vivado会将OOC模块的综合网表插入到顶层网表中,从而完成设计。此选项还会生成一个以stub为扩展名的存根文件,类似黑盒子,即文件中只有输入输出端口。
Out of context per Block Design(此处略)。
本例选择Out for context per IP单选按钮,然后单击Generate按钮,如图3.64所示,完成后单击OK按钮。


③  输出文件生成后,再次在BLOCK DESIGN对话框中的count_bd.bd图标上右击,在弹出的快捷菜单中选择Create HDL Wrapper命令,如图3.65所示。



图3.65选择Create HDL Wrapper命令


④  在弹出的Create HDL Wrapper对话框中选中Let Vivado manage wrapper and autoupdate单选按钮,单击OK按钮,如图3.66所示。


图3.66Create HDL Wrapper对话框


至此,已完成原理图设计。从图3.67可看到原理图源文件层次结构图,在Design Sources的count_bd.bd图标之上已生成count_bd_wrapper.v顶层文件。


图3.67原理图源文件层次结构图


4. 添加引脚约束文件
添加引脚约束有两种方法: 第一种是利用Vivado中的I/O Planning功能; 第二种是直接新建XDC约束文件。3.2节中采用了方法二,本例采用方法一来完成此任务。
(1) 在Vivado主界面中,在Flow Navigator中选择SYNTHESIS下的Run Synthesis选项,单击OK按钮,完成后在弹出的Synthesis Completed对话框中选中Open Synthesized Design单选按钮,并单击OK按钮,如图3.68所示。


图3.68选中Open Synthesized Design单选按钮


(2) 如图3.69所示,选择菜单Window中的I/O Ports命令,使I/O Ports标签页出现在主窗口下方。



图3.69使能I/O Ports标签页


(3) 在I/O Ports标签页中对输入输出端口添加引脚约束,首先在Package Pin栏中输入各端口对应的FPGA芯片的引脚号(对应关系可查看目标板说明文档或原理图),本例的Q0~Q3锁至EGO1开发板的4个LED灯,CLK锁至按键S1,PT锁至拨码开关SW0; 然后在I/O Std栏中通过下拉菜单选择LVCMOS33,将所有信号的电平标准设置为3.3V,如图3.70所示。


图3.70对输入输出端口添加引脚约束


(4) 引脚约束完成后单击保存按钮,如图3.71所示,可看到Sources标签页中已出现引脚约束文件count_bd_wrapper.xdc,双击该文件,其内容如图中所示。


图3.71引脚约束文件


5. 生成比特流文件并下载
(1) 在Vivado主界面的Flow Navigator中选项PROGRAM AND DEBUG下选择Generate Bitstream选项,此时会弹出No Implementation Results Available对话框,提示工程还没有经过Run Implementation等过程,如图3.72所示,单击Yes按钮,再单击OK按钮,软件会自动执行Run Implementation并生成比特流文件。


图3.72生成比特流文件


(2) 生成比特流文件后,选择Open Hardware Manager并单击OK按钮,用Micro USB线连接计算机与板卡,并打开电源开关。在HARDWARE MANAGER界面单击Open Target,选择Auto Connect,连接成功后,在目标芯片上右击,选择Program device,在弹出的Program Device对话框中单击Program按钮,对FPGA芯片进行编程,上述过程如图3.73所示。



图3.73对FPGA芯片进行编程


(3) 下载完成后,观察开发板实际运行效果。
3.4Vivado的综合策略与优化设置
1. 设计的调试和可视化

在Vivado设计流程中,一般可查看三个阶段的网络表(如图3.74所示),实现设计的可视化: 
 详细设计(Elaborated Design)。
 综合后的设计(Synthesized Design)。
 实现后的设计(Implemented Design)。


图3.74查看不同设计阶段的网络表


所谓的网络表(Netlist),是对设计的一种描述,用部件、端口和连线等来表达设计。
(1) 选择Open Elaborated Design(打开详细设计),该网表是在综合之前表述设计,一般由复用器、加法器、比较器、寄存器组等较大的部件来表述设计,也称为RTL级设计。
(2) 选择Open Synthesized Design(打开综合设计),该网表是在综合之后表达设计,由LUT、缓冲器、触发器、进位链等基础元件(BEL)构成的网络表来实现设计。
(3) 选择Open Implemented Design(打开实现设计),该网表是在布局布线之后具体实现设计的网表。
2. Language Template(语言模板)
Vivado提供多种语言模板代码供用户参考,选择菜单Tools中的Language Templates命令,便会出现Language Templates对话框,如图3.75所示。从图中可以看出,Vivado提供Verilog、VHDL、SystemVerilog语言模板,还提供XDC约束文件模板和Debug调试模板,选择Verilog模板,可看到包括可综合模板、激励代码模板和IP集成器模板等。


图3.75Language Templates对话框


模板代码实现的设计不仅规范,而且更优化,可有效节省FPGA资源。图3.76所示是一个固定深度的移位寄存器(SRL)LUT的可综合模板的参考代码。
建议在设计时尽可能参考语言模板。
3. 综合设置选项
在Vivado主界面的Flow Navigator中,选择PROJECT MANAGER下的Settings选项,在弹出的Settings对话框中选中Synthesis标签页,如图3.77所示。以下介绍Synthesis标签页中的各项设置。



图3.76固定深度的SRL可综合模板代码





图3.77Synthesis设置页面


(1) Constraints栏: 选择用于综合的约束集。约束集是一组XDC约束文件,默认选择active约束集。约束集包括时序约束和物理约束。
 时序约束(Timing Constraints): 定义设计的时序需求。如果没有时序约束,Vivado会根据布线长度和布局拥挤度优化设计。
 物理约束(Physical Constraints): 包括引脚约束,物理单元(如块RAM、查找表、触发器)布局的位置等。
(2) Options栏: 用于选择综合运行时使用的策略(Strategy)。Vivado提供了几种预定义的策略,也可以自定义策略,这需要对策略中每个选项单独设置,这些选项如图3.78所示。以下给出各选项的含义。



图3.78综合策略中的Options设置选项


flatten_hierarchy: 定义综合工具如何控制层次结构,选择将所有层次融为一体进行综合,还是独立综合再连接到一起。具体选项如下。
 none: 不展开层次结构。
 full: 全部展开层次结构。
 rebuilt: 让综合工具展开层次结构,综合之后再重建层次结构。
gated_clock_conversion: 门控时钟转换使能。设计中应避免使用门控时钟,时钟信号应尽可能由混合模式时钟管理器(MixedMode Clock Manager,MMCM)或者锁相环(PhaseLocked Loop,PLL)产生。
fanout_limit: 信号最大驱动负载数量,如果超出了该数值,会复制一个相同的信号来驱动超出的负载。
directive: 设置Vivado综合的优化策略,包括以下选项。
 AreaOptimized_high: 面积最省选项。
 AreaOptimized_medium: 面积优化中等,在面积和速度间平衡处理。
 AreaMultThresholdDSP: 更多地使用DSP模块资源实现设计。
 AlternateRoutability: 提高布线能力,减少MUXF和CARRY的使用。
 PerfOptimized_high: 性能最优,即速度最快,但耗用的资源会高一些。
 RuntimeOptimized: 综合运行时间最短,会忽略一些优化以减少综合运行时间。
retiming: 启用该功能,可通过在逻辑门和LUT之间的移动寄存器,降低最大路径时延,以提高电路时序性能。
fsm_extraction: 设定状态机的编码方式,默认值为auto。
 onehot: 一位热码编码方式。
 gray: 格雷编码。
 johnson: 约翰逊编码。
 sequential: 顺序编码。
 auto: 此时Vivado会自动推断最佳的编码方式。
注意: fsm_extraction设定的编码方式优先级高于HDL代码中自定义的编码方式。
keep_equivalent_registers: 保留或合并等效寄存器。勾选该选项,等效寄存器保留。
resource_sharing: 资源共享。
no_lc: 勾选该选项,表示不允许LUT整合。当两个或多个逻辑函数的输入变量总数不超过6时,这些函数均可放置在一个LUT中实现,称为LUT整合。LUT整合可以降低LUT的资源消耗,但也可能导致布线拥塞。因此,Xilinx建议,当整合的LUT超过LUT总量的15%时,应考虑勾选no_lc,关掉LUT整合。
no_srlextract: 勾选该选项时,SRL会用FPGA内的触发器实现,而不用LUT资源去实现(Xilinx的LUT可用于实现SRL)。
shreg_min_size: 当SRL的深度小于或等于shreg_min_size时,其实现方式采用触发器级联的方式; 当其深度大于shreg_min_size时,实现方式则为“触发器+LUT+触发器”的形式。上面的no_srlextract选项,如果勾选,则是阻止将移位寄存器用LUT实现,其优先级高于shreg_min_size。
max_bram: 块RAM(BRAM)的最大使用数量。默认值为-1,表示允许使用FPGA中所有的块RAM。
max_uram: 设置UltraRAM最大使用数量(对于UltraScale架构FPGA而言)。默认值为-1,表示允许使用所有的UltraRAM。
max_dsp: 设置DSP模块的最大使用数量。默认值为-1,表示允许使用该FPGA中所有的DSP模块。
max_bram_cascade_height: 设置可以将BRAM级联在一起的最大数量。
max_uram_cascade_height: 设置可以将UltraRAM级联在一起的最大数量。
assert: 将VHDL中的assert状态纳入评估。
(3) 自定义综合策略: 除了Vivado提供的配置好的综合策略,还可以自定义综合策略。在Settings对话框中设置好各选项后,单击Options栏右侧的存盘按钮,弹出Save Strategy As窗口,在其中填写名称和描述,即可保存为用户自定义的综合策略,单击Apply按钮,综合策略列表中就会出现自定义的策略,可在后面的综合中使用该策略。
在Settings对话框的Tool Settings中,选择Strategies下的Run Strategies选项,在右侧的页面中也可以设置综合策略,单击+按钮可新建策略,如图3.79所示。如果想在已有策略的基础上修改,可选中一个策略,单击上方的Copy Strategy按钮,User Defined Strategies中会出现该策略的备份以供修改(Vivado提供的策略是不能修改的)。


图3.79自定义综合策略


4. 控制文件编译次序
Vivado可以自动识别和设置顶层模块,同时自动更新编译次序。
如图3.80所示,在Vivado主界面的Sources窗格中右击Design Sources,在弹出的
Hierarchy Update级联菜单中选择Automatic Update and Compile Order选项,则设定当源文件发生改动时,Vivado会自动管理层次结构和编译次序,Hierarchy标签页中会自动调整各模块的层级,Compile Order标签页中将显示编译顺序。



图3.80设置自动更新编译顺序


如果选择Automatic Update中的Manual Compile Order选项,则表示Vivado自动调整各模块层级,但允许人工设定编译顺序,在Compile Order标签页中拖曳文件所处位置即可完成设定。
习题3
3.1用Verilog语言编写一个功能类似74ls90的程序,并用Vivado软件进行综合和仿真。
3.2在3.1题的基础上,将74ls90的Verilog程序封装成一个IP核,并采用IP核集成的方式设计一个模12计数器,进行引脚锁定和下载。
3.3在3.2题的基础上,调用两个74ls90的IP核,采用IP核集成的方式设计一个模60计数器,个位和十位均采用8421BCD码的编码方式,进行引脚锁定和下载。
3.4基于Vivado软件,设计功能类似74163的IP核,并采用IP核集成的方式设计一个模24计数器,进行引脚约束和下载。
3.5用数字锁相环(PLL)实现分频,输入时钟频率为100MHz,用数字锁相环得到6MHz的时钟信号,用Vivado中自带的IP核(Clocking Wizard核)实现该设计。