本节将分几个部分来介绍Vivado工程模式设计流程。
下面给出启动Vivado集成开发环境的四种方法,主要包括:
(1)在Windows 7操作系统主界面下,选择开始→所有程序→Xilinx Design Tools→Vivado 2013.3→Vivado 2013.3。
(2)在Windows 7操作系统桌面上,单击如图2.1所示的图标。
图2.1 Vivado桌面图标
(3)如图2.2所示,在Window主界面左下角的命令行中,输入Vivado。然后,按Enter键。
图2.2 命令行输入
注: 当输入Vivado命令后,系统自动运行Vivado–mode gui,启动Vivado集成开发环境。如果设计者需要帮助,则输入Vivado–help命令。
(4)在Windows 7操作系统主界面下,选择开始→所有程序→Xilinx Design Tools→Vivado 2013.3→Vivado 2013.3 Tcl Shell。
①出现如图2.3所示的Vivado 2013.3 Tcl Shell对话框界面。
图2.3 启动Vivado 2013.2 Tcl Shell
②在Vivado%命令提示符的后面,输入
start_gui
然后,按回车键。系统将启动Vivado集成开发环境。
建立新的设计工程的步骤主要包括:
(1)进入到Vivado 2013.3主界面。如图2.4所示,该界面分为Getting Started和Document两个主要的入口。
图2.4 Vivado 2013.3主界面
①在Getting Started入口下,提供了以下功能:
Create New Project(创建新的工程):该选项将打开创建新工程向导,指导设计者创建不同类型的工程。设计者也可以通过使用该向导,导入通过PlanAhead工具所创建的工程(.ppr扩展名)或者通过ISE设计套件所创建的工程(.xise扩展名)。
Open Project(打开工程):打开浏览器,设计者可以打开Vivado集成环境工程文件(.xpr扩展名)。它也显示最后10个以前打开的工程。
注: 10个是默认值。如果设计者想改变这个数字,需要在Vivado主界面主菜单下,选择Tools→Options。出现如图2.5所示的界面,选择General标签。在Number of recent projects to list(列出最近的工程的个数)右侧的下拉框中,修改数字。
图2.5 修改默认的打开工程个数
Open Example Project(打开实例工程),打开下面的例子工程:
BFT Core——小的RTL工程。
CPU(HDL)——大的,混合语言RTL工程。
CPU(综合的)——大的,综合的网表工程。
Wave(HDL)——小的工程,包括三个嵌入的IP核;设计者可以通过这个设计,学习如何使用集成的IP核。
Zynq System——基于ZC702评估板的Vivado IP集成器Zynq器件。使设计者在Vivado集成开发环境下完成设计,生成比特流。然后,在软件开发工具SDK中,开发软件应用程序代码。
Microblaze System——基于KC705评估板的小Vivado IP集成器Microblaze处理器设计。在SDK中开发应用程序代码。在Vivado设计套件中,使用SDK产生的ELF文件,对设计进行仿真。
Manage IP(管理IP)——在一个已存在的工程外,打开IP目录。IP目录显示了Xilinx、第三方和用户定制的IP。设计者可以查看或者重新定制已经存在的IP核。
②在Documentation入口下,提供了以下的功能:
Documentation and Tutorials(文档和教程):打开Xilinx的教程和支持设计数据。
User Guide(用户指南):打开Vivado Design Suite User Guide。
Quick Take Videos(快速打开视频):打开Xilinx视频教程。
Release Note Guide(发布注释向导):打开Vivado Design Suite User Guide:Release Notes,Installtion,and Licensing。
(2)在图2.4的界面内,单击Create New Project(创建新工程)选项。出现Create a New Vivado Project(创建一个新的Vivado工程)对话框界面。
(3)单击Next按钮。
(4)如图2.6所示,出现New Project-Project Name对话框界面,要求设计者给出工程的名字和工程路径,在该设计中按如下参数设置:
①Project name(工程名字):gate_VHDL。
注: 对于Verilog的读者,名字为gate_Verilog。这样,是为了方便使用不同HDL语言的读者。
②Project location(工程路径):E:/vivado_example
注: 读者可以根据自己的需要命明工程名字和指定工程路径,但是不能起中文名字和将设计文件保存在中文路径下。这样,可能会导致进行后续处理时,产生错误。
图2.6 给出工程路径和工程名字
(5)单击Next按钮。
(6)如图2.7所示,出现New Project-Project Type(新工程-工程类型)对话框界面。在该界面内提供了下面可选的工程类型:
①RTL Project:选择该选项,设计者可以添加源文件、生成IP、运行寄存器传输级(RTL)分析、综合、实现、设计规划和分析。
②Post-synthesis Project:选择该选项,设计者可以添加源文件、查看器件资源、运行设计分析、规划和实现。
③I/O Planning Project:选择该选项,不能指定设计源文件,但是可以查看器件/封装资源。
④Imported Project:从symplify、xst或者ISE工程文件中,创建一个vivado工程。
图2.7 指定工程的类型
在该设计中,按如下参数设置:
①选中RTL Project;
②选中Do not specify sources at this time(此次不指定源文件,表示在生成工程后,再添加设计源文件到工程中)。
(7)单击Next按钮。
注: 如图2.8所示,设计者也可以在Vivado主界面下面的Tcl Console(Tcl控制台)窗口下,输入Tcl命令,来创建工程。
图2.8 Tcl控制台界面
①下面给出用于创建工程的Tcl命令格式模板(读者可以根据情况进行修改):
create_project project_Name/exampleDesigns/project_8 -part xc7vx485tffg1157-1
默认工程类型是RTL。
②如果读者想创建一个网表工程,按照下面Tcl模板格式输入命令:
set_property design_mode GateLvl [current_fileset]
③可以输入下面的Tcl命令,在工程中添加设计源文件:
add_files -norecurse -scan_for_includes ./designs/oneFlop.v
④可以输入下面的Tcl命令,将这些文件放到当前工程路径下:
import_files -norecurse ./designs/oneFlop.v
(8)如图2.9所示,出现New Project-Default Part(新工程-默认器件)对话框界面。
图2.9 器件类型选择界面
注: 该设计基于Xilinx大学计划开发板卡Nexys4进行设计。设计参考资料见下:
https://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1184&Prod=NEXYS4
为了加快寻找器件的速度,如图2.9所示,选择下面的参数:
①Product category:All;
②Package:csg324;
③Family:Aritx-7;
④Speed grade:-1;
⑤Sub-Family:All Remaining;
⑥Temp grade:C。
可以看到,所选择器件的型号是xc7a100tcsg324-1。
(9)单击Next按钮。
(10)出现New Project-New Project Summary(新工程-新工程总结)对话框界面。该对话框给出了工程类型、工程名字和器件信息说明。
(11)单击Finish按钮。
本节介绍Vivado设计主界面及功能。内容包括:流程处理主界面及功能、工程管理器主界面及功能、工作区窗口和设计运行窗口。
1.流程处理主界面及功能
图2.10 Flow Navigator管理器界面
如图2.10所示,在Vivado左侧的Flow Navigator(流程向导)界面中给出了处理的主要流程,包括:
(1)Project Manager(工程管理器):
①Project Settings(工程设置);
②Add Sources(添加源文件);
③IP Catalog(IP目录)。
(2)IP Integrator(IP集成器):
①Create Block Design(创建块设计);
②Open Block Design(打开块设计);
③Generator Block Design:生成模块设计。
(3)Simulation(仿真):
①Simulation Settings(仿真设置);
②Run Simulation(运行仿真)。
(4)RTL Analysis(RTL分析):
①Open Elaborated Design(打开详细的设计)。
(5)Synthesis(综合)
①Synthesis Settings(综合设置);
②Run Synthesis(运行综合);
③Open Synthesized Design(打开综合后的设计)。
(6)Implementation(实现):
①Implementation Settings(实现设置);
②Run Implementation(运行实现);
③Open Implemented Design(打开实现后的设计)。
(7)Program and Debug(编程和调试):
①Bitstream Settings(比特流设置);
②Generate Bitstream(生成比特流);
③Open Hardware Manager(打开硬件管理器);
④Launch iMpact(启动iMPACT工具)。
2.工程管理器主界面及功能
如图2.11所示,该窗口为Project Manager(工程管理器窗口界面),所有的设计文件及类型,以及这些设计文件之间的关系均显示在该界面窗口下。
图2.11 Project Manager窗口界面
(1)Sources(源窗口)——该窗口允许设计者管理工程源文件,包括:添加、删除和对源文件重新排序,用于满足指定的设计要求。当下面作为工程的一部分时,显示它们:
①Design Source(设计源文件)——显示源文件类型,这些源文件类型包括:Verilog、VHDL、NGC/NGO、EDIF、IP核、数字信号处理(DSP)模块、嵌入式处理器和XDC/SDC约束文件。
②Constraint file(约束文件)——显示用于对设计进行约束的约束文件。
③Simulation Sources(仿真源文件)——显示用于仿真的测试源文件。
④IP Core(IP核)。
(2)在Source窗口下,使用下面的图标:
①本地源文件:
表示文件存在于本地工程路径下。
②远地源文件:
表示使用的文件并不在当前的本地工程路径下。
③缺失的源文件:
表示找不到工程设计中所使用的设计源文件。当在工程中遇到这种情况时,设计者需要人工添加缺失的源文件。
④只读源文件:
表示该文件在Vivado集成开发环境下为只读文件,不可以进行修改。
(3)源文件窗口视图:如图2.11所示,源文件窗口提供了下面的视图,用于显示不同的源文件。
①Hierarchy(层次):层次视图显示了设计模块和例化的层次。顶层模块定义了用于编译、综合和实现的设计层次。Vivdao集成开发环境自动地检测顶层的模块,但是设计者可以使用Set as Top命令手工定义顶层模块。
②IP Source(IP源):IP源文件显示了由IP核所定义的所有文件。
③Libarary(库):库视图显示了保存到各种库的源文件。
④Compile Order(编译顺序):该视图从最开始到结束,显示了所有需要编译的源文件顺序。通常地,顶层模块是编译的最后文件。基于定义的顶层模块和精细的设计,设计者可以允许Vivado集成环境自动确定编译顺序。此外,通过使用Hierarchy Update浮动菜单命令,设计者可以人工控制设计的编译顺序,即重新安排源文件的顺序。
(4)源窗口工具栏命令
① 图标:单击该图标,将打开查找工具条,允许快速的定位源文件窗口内的对象。
② 图标:单击该图标,将在源窗口中展开层次设计中所有设计文件。
③ 图标:单击该图标,将所有的设计源文件都缩回去,只显示顶层对象。
④ 图标:单击该图标,更新源文件窗口,将其聚焦在当前所选择的对象上。在包含很多源文件的大的设计中,这非常有用。
⑤ 图标:单击该图标,将添加或者创建RTL源文件、仿真源文件、约束文件、DSP模块、嵌入式处理器或者已经存在的IP。
3.工作区窗口
如图2.12所示,该窗口下,给出了设计报告总结,并且可以实现设计输入和设计查看。
图2.12 工作区窗口界面
4.设计运行窗口
如图2.13所示,给出了Design Runs(设计运行)对话框界面。该界面提供了下面的标签窗口。
图2.13 设计运行窗口界面
(1)Tcl Console:Tcl控制台界面,可以在该界面下输入Tcl命令,来控制设计流程的每一步。
(2)Message:消息窗口显示了设计和报告消息。通过不同的头部,对消息进行分组,以便设计者可以从不同的工具或者处理过程中快速地定位消息。所显示的消息有一个到相关文件的链接。设计者可以单击链接,在文本编辑器内打开RTL源文件。
注: 设计者可以在Vivado设计主界面主菜单下,选择Windows→Messages,打开消息窗口。
(3)Log:显示对设计进行编译命令活动的输出状态。这些命令用于综合、实现和仿真。输出显示连续滚动格式,当新的命令运行时,就会覆盖输出显示。当在一个活动的运行中,启动一个命令时,自动打开这个窗口。
注: 如果隐藏了该窗口,则可以在Vivado设计主界面主菜单下,选择Windows→Log,打开日志窗口。
(4)Reports:该窗口显示了用于当前活动运行的报告。当不同的步骤完成后,对报告进行更新。当执行完不同的步骤时,用不同的头部对报告进行分组,以便进行快速的定位。双击报告,将在文本编辑器中打开文件。
注: 设计者可以在Vivado设计主界面主菜单下,选择Windows→Reports,打开报告窗口。
本节将为该设计创建一个VHDL/Verilog设计文件。创建HDL设计文件的步骤主要包括:
(1)在Sources窗口下,单击 按钮;或者单击右键,出现浮动菜单,选择Add Source…;或者在Vivado主界面主菜单下,选择File→Add Source…。
(2)出现如图2.14所示的Add Sources(添加源文件)对话框界面。该对话框界面提供了下面的选项:
①Add or Create Constraints(添加或者创建约束);
②Add or Create Design Sources(添加或者创建设计源文件);
③Add or Create Simulation Sources(添加或者创建仿真文件);
④Add or Create DSP Sources(添加或者创建DSP源文件);
⑤Add or Create Embedded Sources(添加或者创建嵌入式源文件);
⑥Add Existing Block Design Sources(添加已经存在的块设计源文件);
⑦Add Existing IP(添加已经存在的IP)。
图2.14 创建新的设计文件
在此选中Add or Create Design Sources前面的复选框。
(3)单击Next按钮。
(4)出现如图2.15所示的Add or Create Design Source(添加或者创建源文件)对话框界面。在该界面中单击Create File…按钮。
图2.15 添加或者创建新文件选择对话框
(5)如图2.16所示,出现Create Source File(创建源文件)对话框界面。在该界面内选择添加文件的类型和输入文件的名字。按下面参数进行设置:
图2.16 创建文件对话框界面
注: 在本书中将VHDL和Verilog两种语言进行对照。这样,方便使用不同HDL语言的读者进行学习。
①File type:VHDL(对于使用Verilog HDL的读者选择Verilog);
②File name:top;
③File loacation:Local to Project。
(6)单击OK按钮。
(7)在图2.15所示的对话框中,添加了top.vhd文件。
注: 前面选择了Verilog文件,则生成了top.v文件。
(8)单击图2.15界面中的Finish按钮。
(9)出现Define Module(定义模块对话框界面),下面分VHDL和Verilog两个设计界面说明。
①VHDL定义模块对话框界面。
出现如图2.17所示的Define Module(定义模块)对话框界面,按下面参数设置:
添加三个端口:a,b,z;
对于端口a,Direction:in;
对于端口b,Direction:in;
对于端口z,Direction:out,选中Bus(总线)复选框,MSB:5,LSB:0。
图2.17 定义VHDL模块对话框界面
注: 该声明和VHDL的实体部分对应。
②Verilog HDL定义模块对话框界面。
出现如图2.18所示的Define Module(定义模块)对话框界面,按下面参数设置:
添加三个端口:a,b,z;
对于端口a,Direction:input;
对于端口b,Direction:input;
对于端口z,Direction:output,选中Bus(总线)复选框,MSB:5,LSB:0。
图2.18 定义Verilog模块对话框界面
注: 该声明和Verilog HDL模块内的端口声明相对应。
(10)单击OK按钮。
(11)如图2.19所示,在源文件窗口中,添加了top.vhd或者top.v文件。
(a)添加了top.vhd文件 |
(b)添加了top.v文件 |
图2.19 新添加了top.vhd/top.v文件
(12)双击源文件窗口的top.vhd文件或者top.v文件。打开设计模板,修改设计模板,并添加设计代码。该设计中,两个逻辑量a和b,进行6种逻辑运算,产生6种输出到z(5)~z(0)。
设计代码清单2-1 top.vhd
--entity top is entity top is Port(a:in STD_LOGIC: b:in STD_LOGIC: z:out STD_LOGIC_VECTOR(5 downto 0); end top: architecture Behavioral of top is begin z(0)<=a and b; z(1)<=a and b; z(2)<=a or b; z(3)<=a nor b; z(4)<=a xor b; z(5)<=a xnor b; end Behavioral;
设计清单代码2-2 top.v
module top( input a, input b, output [5:0] z ); ssign z[0]=a & b; ssign z[1]=~(a & b); ssign z[2]=a |b|; ssign z[3]=~(a|b); ssign z[4]=a^b; ssign z[5]=a~^b; ndmodule
(13)添加完设计代码后,保存设计文件。
当设计者打开一个详细描述的RTL设计时,Vivado集成环境编译RTL源文件,并且加载RTL网表,用于交互式分析。设计者可以查看RTL结构、语法和逻辑定义。分析和报告能力包括:
(1)RTL编译有效性和语法检查;
(2)网表和原理图研究;
(3)设计规则检查;
(4)使用一个RTL端口列表的早期I/O引脚规划;
(5)可以在一个视图中,选择一个对象,并且交叉检测其他视图中的一个对象。
RTL描述和分析的步骤主要包括:
(1)在源窗口下,选择top.vhd或者top.v文件。
(2)如图2.20所示,在Vivado左侧的流程管理窗口,找到RTL Analysis(RTL分析),并展开。
图2.20 执行RTL分析
(3)看到Elaborated Design,并展开。在展开项中,选择并双击Open Elaborated Design。
(4)Vivado开始运行Elaborated Design。如图2.21所示,当运行完后,可以看到Open Elaborated Design标题变成了Elaborated Design。
图2.21 执行完RTL分析
(5)如图2.22所示,自动打开RTL Schematic。可以看到对HDL描述翻译进行后,得到的RTL级连接结构。
图2.22 打开RTL原理图符号
注: 如果设计者重新运行Elaborated Design,则在如图2.21所示的界面内,选择Elaborated Design,单击右键,出现浮动菜单。在浮动菜单内,选择Reload Design。
(6)查看RTL级网表。如图2.23所示,在源窗口内,选择RTL Netlist标签。可以看到网表逻辑结构。
图2.23 查看RTL级网表
下面对图标含义进行说明:
① :表示总线;
② :表示IO总线;
③ :表示网络;
④ :表示IO网络;
⑤ :表示层次化单元(逻辑);
⑥ :表示层次化单元(黑盒)。
注: 对于那些不包含网表或者逻辑内容的层次化单元,Vivado将理解为黑盒。一个层次化的单元可能是一个设计的黑盒,也可能是编码错误或者丢失文件。
⑦ :表示层次化单元(分配到Pblock)。
⑧ :表示层次化单元(黑盒分配到Pblock)。
⑨ :表示原语单元(分配到Pblock)。
⑩ :表示原语单元(放置并且分配到Pblock)。
⑪ :表示原语单元(没有分配的布局约束)。
⑫ :表示原语单元(已经分配了布局约束)。
本节将对设计进行综合。综合就是将RTL级的设计描述转换成门级的描述。Vivado集成环境下的综合工具基于时间驱动机制,专门为存储器的利用率和性能进行了优化。综合工具支持SystemVerilog,以及VHDL和Verilog混合语言描述。该综合工具支持Xilinx设计约束XDC(该约束是基于工业标准的Synopsys设计约束SDC格式)。
1.执行设计综合
实现设计综合的步骤主要包括:
(1)如图2.24所示,在流程处理窗口下,找到Synthesis并展开。
图2.24 查找Synthesis
或者在Tcl命令行中,输入launch_runs synth_1脚本命令,运行综合。
注: 如果前面已经运行过综合,需要重新运行综合前,必须执行reset_run synth_1脚本命令,然后再执行launch_runs synth_1脚本命令。
(2)在展开项中,单击Run Synthesis。开始对设计进行综合。
(3)当对设计综合完成后,弹出2.25所示的Synthesis Completed(综合完成)对话框界面。该界面提供了三个选项:
①Run Implementation(运行实现过程);
②Open Synthesized Design(打开综合后的设计);
③View Reports(查看报告)。
图2.25 综合完成提示对话框界面
选择Open Synthesized Design选项。
(4)单击OK按钮。
(5)如图2.26所示,出现对话框,提示关闭前面执行Elaborated Design所打开的原理图界面,单击Yes按钮。Vivado开始执行综合过程。
图2.26 提示关闭前面界面对话框界面
图2.27 展开Synthesis Design
(6)当执行完综合后,如图2.27所示,可以展开Synthesis Design。提供了下面的选项:
①Edit Timing Constraints(编辑时序约束);
②Report Timing Summary(报告时序总结);
③Report Clock Networks(报告时钟网络);
④Report Clock Interaction(报告时钟相互作用);
⑤Report DRC(报告DRC);
⑥Report Noise(报告噪声);
⑦Report Utilization(报告利用率);
⑧Report Power(报告功耗);
⑨Schematic(原理图)。
下面给出综合后的报告利用率和原理图。
(7)在图2.27所示的界面内,单击Schematic选项。
(8)如图2.28所示,显示了该设计的综合后的网表结构。
图2.28 该设计的完整网表结构
思考题2.1:为什么是这种结构(提示:FPGA是基于查找表结构)。
思考题2.2:观察输入缓冲区和输出缓冲区的结构并分析该设计的结构。
(9)查看每个LUT的内部映射关系。在图2.28内分别选择相应的LUT,总共6个LUT。先选择最上面的一个LUT。如图2.29所示,在Vivado源窗口下方的Cell Properties窗口中,选择ROM Values标签,可以看到逻辑表达式0=I0&I1。图2.29给出真值表映射关系。
图2.29 LUT的内部映射关系
思考题2.3:LUT内部如何实现逻辑关系?(提示:在每个查找表内实现了该设计的每种逻辑运算关系。)
思考题2.4:在前面的设计中,可以看到Verilog的描述方法,类似于C语言。C语言通过按位逻辑运算符,实现逻辑运算。用FPGA实现和C语言在CPU上实现有什么本质的区别?(C语言在CPU上实现,靠程序计数器,串行执行;而FPGA上的数字逻辑的实现是并行实现,是由逻辑流推动。)其处理数据的能力在同样的频率下,要比CPU快若干倍。所以,这也是FPGA在进行海量数据处理的巨大优势。因此,请读者认真体会。
(10)单击图2.27内的Report Utilization选项。Vivado开始计算该设计的资源消耗量。
(11)如图2.30所示,出现Report Utilization(报告利用率)对话框界面。默认地,报告名字是utilization_1。
图2.30 报告利用率对话框界面
(12)单击OK按钮。
(13)在Vivado下方打开Utilization-utilization_1标签窗口。如图2.31所示,给出了该设计的资源利用率:
①Slice Logic(切片逻辑)使用了3个,总共64300,利用率1%;
②IO and GIX Specific(IO和指定的GIX)使用了8个,总共有212个,利用率4%。
图2.31 设计利用率报告
2.设计综合选项
本节将介绍设置综合选项参数的含义。便于后面在修改综合选项参数时,理解这些参数的含义。在如图2.24所示的界面中,选择Systhesis Settings。如图2.32所示,出现综合属性设置对话框界面。
图2.32 综合属性设置界面
(1)在Default constraint set右侧通过下拉框,可以选择用于综合的多个不同设计约束集合。一个约束集合是多个文件的集合,它包含XDC文件中用于该设计的设计约束条件。有两种类型的设计约束:
①物理约束:
定义了引脚的位置和内部单元的绝对/相对位置。内部单元包括:块RAM、LUT、触发器和器件配置设置。
②时序约束:
定义了设计要求的频率。如果没有时序约束,Vivado集成设计环境仅对布线长度和布局阻塞进行优化。
通过选择不同的约束,得到不同的综合结果。在后面章节中,会详细说明不同约束对设计性能的影响。
(2)在Options区域下的Strategy(策略)右侧的下拉框中,选择用于运行综合的预定义综合策略。设计者也可以定义自己的策略。后面会介绍如何创建一个新的策略。表2.1给出了运行策略选项、默认设置和其他选项。
表2.1 运行策略选项,默认设置和其他选项
(a)添加了top.vhd文件 | (b)添加了top.v文件 | ||
运行策略选项 | Vivado Synthesis-Defaults默认设置 | Flow_RuntimeOptimized默认设置 | 其他选项 |
-flatten_hierarchy | rebuilt | none | full |
-gated_clock_conversion | off | off | on |
-bufg | 12 | 12 | User-selectable |
-fanout_limit | 10000 | 10000 | User-selectable |
-directive | default | Run TimeOptimized | N/A |
-fsm_extraction | auto | off | one_hot,sequential, Johnson, gray |
-keep_equivalent_registers | unchecked | unchecked | checked |
-resource_sharing | checked(on) | auto | off |
-control_set_opt_threshold | 1 | 1 | User-selectable |
-no_lc | unchecked | unchecked | checked |
①-flatten_hierarchy:
none:告诉综合工具不要将层次设计平坦化(展开)。综合的输出和最初的RTL描述有相同的层次。
full:告诉综合工具将层次化设计充分地展开,只留下顶层。
rebuilt:当选择该设置的时候,rebuilt允许综合工具展开层次,执行综合,然后基于最初的RTL,重新建立层次。这个值允许跨越边界进行优化。最终的层次类似于RTL,这主要是为了方便分析。
②-gate_clock_conversion:该选项打开或者关闭综合工具的能力。该能力提供了对带有使能时钟逻辑的转换。使用门控时钟转换也要求使用RTL属性。
③-bufg:该选项控制综合工具推断设计中需要BUFG的个数。在网表内,当设计中使用的其他BUFG对综合过程不可见时,使用这个选项。
由-bufg后面的数字所定,工具所能推断出的BUFG个数。例如,如果-bufg选项设置为最多12个,在RTL内例化了3个BUFG,则工具还能推断出9个BUFG。
④-fanout_limit:指定在开始复制逻辑前,信号必须驱动的负载个数。这个目标限制,通常是引导性的。当工具确定必须复制逻辑时,就会忽略该选项。
注: 该选项不影响控制信号,例如置位、复位和时钟使能。如果需要的话,则使用MAX_FANOUT来复制这些信号。
⑤-directive:代替effort_level选项。当指定时,这个选项用不同的优化运行Vivado综合过程。它的值是Default和RuntimeOptimized时,更快地运行综合,进行较少的优化。
⑥-fsm_extraction:该选项控制如何提取和映射有限自动状态机。当该选项为off时,将状态机综合为逻辑。此外,设计者也可以从下面的选项中指定状态机的编码类型。即:one_hot、sequential、johnson、gray或者auto。
⑦-keep_equivalent_registers:该选项将阻止合并带有相同逻辑输入的寄存器。
⑧-resource_sharing:该选项用于在不同的信号间共享算术操作符。可选的值为auto、on和off。
注: 选择auto时,取决于设计要求的时序,决定是否采用资源共享;on表示总是进行资源共享,off表示总是关闭资源共享。
⑨-control_set_opt_threshold:该选项设置用于时钟使能优化的门限,目的在于降低控制设置的个数。默认地,该值设置为1。给定的值是扇出的个数,Vivado工具将把这些控制设置移动到一个D触发器的逻辑中。如果扇出比这个值多,则工具尝试让信号驱动寄存器上的control_set_pin。
⑩-no-lc:当选中的时候,这个选项将关闭LUT的组合。
注: 可以使用KEEP属性,阻止对寄存器地合并。
(3)tcl.pre和tcl.post,这两个选项和tcl文件关联,用于综合前和综合后地立即运行。
注:
①tcl.pre和tcl.post脚本中的路径是相对于当前工程的路径:
<project>/<project.runs>/<run_name>
②可以使用当前工程或者当前运行的DIRECTORY属性来定义脚本中的相对路径:
get_property DIRECTOTY [current_project] get_property DIRECTOTY[current_run]
本节将执行对设计的行为级仿真。执行对设计进行行为级仿真的步骤主要包含:
(1)按照前面的操作方法,启动添加新文件命令。也可以在源文件窗口内选择Simulation Sources,单击右键,出现浮动菜单。在浮动菜单内,选择Edit Simulation Sets…。
(2)如图2.14所示,出现Add Source(添加源文件)对话框界面。在该界面内选择Add or Create Simulation Source(添加或者创建仿真源文件)选项。
(3)单击Next按钮。
(4)出现Add or Create Simulation Sources(添加或者创建仿真源文件)对话框界面。在该界面内,单击Create File按钮。
(5)下面分VHDL/Verilog两种设计语言介绍:
①对于VHDL设计流程,如图2.33所示,按下面参数设置:
File type:VHDL; File name:test; File location:Local to Project。
图2.33 添加VHDL类型的仿真文件
②对于Verilog设计流程,如图2.34所示,按下面参数设置:
File type:Verilog; File name:test; File location:Local to Project。
图2.34 添加Verilog类型的仿真文件
(6)单击OK按钮。
(7)在Add Souces对话框界面中,新添加了名字为test.vhd/test.v的仿真源文件。
(8)在Add Sources对话框界面中,单击Finish按钮。
(9)出现Define Module(定义模块)对话框界面。直接单击OK按钮。
(10)出现Define Module(定义模块)提示对话框界面。直接单击Yes按钮。
(11)如图2.35所示,在源文件窗口的simulation Sources下添加了test.vhd或者test.v文件,它们下面包含设计文件top.vhd或者top.v,它们分别作为仿真测试文件的设计源文件。
(a)添加vhdl仿真文件后的源窗口 |
(b)添加Verilog仿真文件后的源窗口 |
图2.35 添加HDL仿真文件后的源窗口
(12)按照VHDL/Verilog语法添加测试代码。
①对于使用VHDL的读者,打开test.vhd文件。在test.vhd中添加下面的设计代码,作为仿真源文件。
代码清单2-3 test.vhd
entity test is end test; architecture Behavioral of test is component top Port ( a : in STD_LOGIC; b : in STD_LOGIC; z : out STD_LOGIC_VECTOR (5 downto 0) ); end component; signal a : std_logic:='0'; signal b : std_logic:='0'; signal z : std_logic_vector(5 downto 0); begin uut : top port map( a=>a, b=>b, z=>z ); process begin a<='0'; b<='0'; wait for 200 ns; a<='0'; b<='1'; wait for 200 ns; a<='1'; b<='0'; wait for 200 ns; a<='1'; b<='1'; wait for 200 ns; end process; end;
②对于使用Verilog的读者,打开test.v文件。在test.v中添加下面的设计代码。作为仿真源文件。
代码清单2-4 test.v
'timescale 1ns / 1ps module test; reg a; reg b; wire [5:0] z; top uut( .a(a), .b(b), .z(z) ); initial begin while(1) begin a=0; b=0; #100; a=0; b=1; #100; a=1; b=0; #100; a=1; b=1; #100; end end endmodule
(13)保存test.vhd或者test.v文件。
(14)在源文件窗口选择test.vhd或者test.v文件(取决于读者所选择的设计语言)。
(15)如图2.36所示,在Vivado设计界面左侧的流程向导窗口内,找到并展开Simulation。
图2.36 选择运行行为仿真
(16)单击Run Simulation(运行仿真)。出现浮动菜单,选择Run Behavioral Simulation(运行行为仿真选项)。此后,Vivado开始运行行为仿真。
(17)如图2.37所示,出现行为仿真波形界面。
图2.37 行为仿真波形图
注:
①单击图2.37左侧一列工具栏中的 (放大)或者 (缩小)按钮,将波形调整到合适的显示大小。
②单击工具栏中的 按钮,添加若干标尺,使得可以测量某两个逻辑信号跳变之间的时间间隔。
③如图2.38所示,单击Vivado上方的工具栏内的按钮,可以控制仿真的运行时间。
图2.38 控制仿真运行时间
(18)退出行为仿真界面。
本节将为设计指定引脚约束,该引脚约束参考Nexys4板子的设计图纸和相关资料。使用Nexys4的两个开关作为a和b的逻辑输入量,6个LED灯作为z0~z5的逻辑输出量。添加约束条件的步骤包括:
(1)在Vivado源文件窗口下,单击右键,如图2.39所示,出现浮动菜单。选择Add Sources…,或者Edit Constraints Sets…(当选择该选项的时候,跳过下面第2步的对话框界面,直接进入第3步)。
图2.39 添加约束文件选项
(2)出现Add Sources对话框界面。在该界面下,选择Add or Create Constraints。
(3)单击Next按钮。
(4)出现Add or Create Constraints(添加或者创建约束)对话框界面。在该界面下,单击Create File…按钮。
(5)如图2.40所示,出现Create Constraints File(创建约束文件)对话框界面。按下面参数设置:
①File type:XDC;
②File name:top;
③File location:Local to Project。
图2.40 添加约束文件对话框界面
(6)单击OK按钮,返回到添加或者创建约束对话框界面。可以看到添加了名字为top.XDC的约束文件。
注: 在Vivado中,约束文件的后缀名是.xdc,该文件取代ISE集成设计环境中的.ucf文件。
(7)单击Finish按钮。如图2.41所示,可以看到添加了top.xdc文件。
图2.41 添加约束文件后的源文件窗口
(8)如图2.42所示,在下拉框中选择I/O Planning(I/O规划)。
注: 需要执行完前面的综合,并且在综合完后,选择Open Synthesized Design。
图2.42 选择I/O Planning
(9)如图2.43所示,在Vivado下方出现I/O Ports(I/O端口)对话框界面。按表2.2所示,在Site下输入设计中所定义的每个逻辑端口在FPGA上引脚的位置。此外,在I/O Std(I/O标准)下,为每个逻辑端口定义其I/O电气标准。
图2.43 进行I/O规划
表2.2 逻辑端口的I/O约束
逻辑端口 | FPGA引脚位置 | I/O标准 |
Z[5] | T8 | LVCMOS33 |
Z[4] | V9 | LVCMOS33 |
Z[3] | R8 | LVCMOS33 |
Z[2] | T6 | LVCMOS33 |
Z[1] | T5 | LVCMOS33 |
Z[0] | T4 | LVCMOS33 |
a | U8 | LVCMOS33 |
b | U9 | LVCMOS33 |
(10)完成输入后,在如图2.43所示的界面内,单击右键出现浮动菜单,选择Export I/O Ports…。
(11)如图2.44所示,出现Export I/O Ports(导出I/O端口)对话框界面。选中XDC,并将导出路径指向当前工程路径。
图2.44 导出I/O规划
①对于VHDL语言的设计流程,路径指向:
E:\vivado_example\gate_vhdl\gate.srcs\constrs_1\new\top.xdc
②对于Verilog语言的设计流程,路径指向:
E:\vivado_example\gate_verilog\gate_verilog.srcs\constrs_1\new\top.xdc
(12)单击OK按钮。
(13)在源文件窗口,双击top.xdc文件。打开约束文件。下面给出了约束代码清单。
代码清单2.5 top.xdc
set_property PACKAGE_PIN T8 [get_ports {z[5]}] set_property PACKAGE_PIN V9 [get_ports {z[4]}] set_property PACKAGE_PIN R8 [get_ports {z[3]}] set_property PACKAGE_PIN T6 [get_ports {z[2]}] set_property PACKAGE_PIN T5 [get_ports {z[1]}] set_property PACKAGE_PIN T4 [get_ports {z[0]}] set_property PACKAGE_PIN U8 [get_ports a] set_property PACKAGE_PIN U9 [get_ports b] set_property DIRECTION OUT [get_ports {z[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[5]}] set_property DRIVE 12 [get_ports {z[5]}] set_property SLEW SLOW [get_ports {z[5]}] set_property DIRECTION OUT [get_ports {z[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[4]}] set_property DRIVE 12 [get_ports {z[4]}] set_property SLEW SLOW [get_ports {z[4]}] set_property DIRECTION OUT [get_ports {z[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[3]}] set_property DRIVE 12 [get_ports {z[3]}] set_property SLEW SLOW [get_ports {z[3]}] set_property DIRECTION OUT [get_ports {z[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[2]}] set_property DRIVE 12 [get_ports {z[2]}] set_property SLEW SLOW [get_ports {z[2]}] set_property DIRECTION OUT [get_ports {z[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[1]}] set_property DRIVE 12 [get_ports {z[1]}] set_property SLEW SLOW [get_ports {z[1]}] set_property DIRECTION OUT [get_ports {z[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {z[0]}] set_property DRIVE 12 [get_ports {z[0]}] set_property SLEW SLOW [get_ports {z[0]}] set_property DIRECTION IN [get_ports a] set_property IOSTANDARD LVCMOS33 [get_ports a] set_property DIRECTION IN [get_ports b] set_property IOSTANDARD LVCMOS33 [get_ports b]
注: 下面一节将对XDC的语法规则进行简单的说明。
(14)如图2.43所示,将选项再次切换到Default Layout。
本节将介绍XDC约束相关的语法规则。内容包括XDC和UCF的区别、UCF到XDC映射、约束顺序。
1.XDC和UCF的区别
XDC和UCF约束的区别主要包括:
(1)XDC是顺序语言,它是一个带有明确优先级的规则。
(2)一般来说,UCF应用于网络,而XDC可以应用到引脚、端口和单元对象(Cell Object)。
(3)UCF的PERIOD约束和XDC的create_clock命令并不等效,这将导致不同的时序结果。
(4)默认地,对于UCF来说,在异步时钟组之间无时序关系;但是,对于XDC来说,所有时钟之间都存在联系,也就是存在时序关系(除非有其他约束)(set_clock_groups)。
(5)在XDC中,相同的对象中存在多个时钟。
2.UCF到XDC映射
表2.3给出UCF约束到XDC命令之间的映射。
表2.3 UCF约束到XDC命令之间的映射
UCF | XDC |
TIMESPEC PERIOD | create_clock |
create_generated_clock | |
OFFSET = IN <x> BEFORE <clk> | set_input_delay |
OFFSET = OUT <x> BEFORE <clk> | set_output_delay |
FROM: TO “TS_”*2 | set_multicycle_path |
FROM: TO | set_max_delay |
TIG | set_false_path |
NET “clk_p” LOC = AD12 | set_property LOC AD12 [get_ports clk_p] |
NET “clk_p” IOSTANDARD = LVDS | set_property IOSTANDARD LVDS [get_ports clk_p] |
注: 不管设计者在设计中,使用了一个还是多个XDC文件,Xilinx推荐设计者使用下面的顺序来组织约束:
## Timing Assertions Section # Primary clocks # Virtual clocks # Generated clocks # Clock Groups # Input and output delay constraints ## Timing Exceptions Section (sorted by precedence) # False Paths # Max Delay / Min Delay # Multicycle Paths # Case Analysis # Disable Timing ## Physical Constraints Section # located anywhere in the file, preferably before or after the timing constraints # or stored in a separate XDC file
Vivado集成设计环境的实现处理过程,包括:对设计的逻辑和物理转换。该实现过程包含下面子过程:
(1)优化设计(Opt Design):对逻辑设计进行优化,使其容易适配到目标Xilinx器件。
(2)功耗优化设计(Power Opt Design):对设计元素进行优化,以降低目标Xilinx器件的功耗要求。
注: 该步是可选的。
(3)布局设计(Place Design):在目标Xilinx器件上,对设计进行布局。
(4)物理优化设计(Phys Opt Design):对高扇出网络驱动器进行复制,对其负载进行分配(即降低将高扇出负载量),以优化设计时序。
(5)布线设计(Route Design):在目标Xilinx器件上对设计进行布线。
(6)写比特流(Write Bitstream):生成用于配置Xilinx器件的比特流。
1.运行设计实现
本节将执行设计实现过程。设计实现的步骤主要包括:
(1)在源窗口中,选择top.vhd/top.v文件(读者根据自己设计所使用的HDL语言选择)。
图2.45 执行实现处理过程
(2)如图2.45所示,在Vivado左侧的流程处理窗口下,找到并展开Implementation。
(3)在展开项里,单击Run Implementation选项。Vivado开始执行设计实现过程;或者在Tcl命令行中,输入launch_runs impl_1脚本命令,运行实现。
注: 如果前面已经运行过实现,需要重新运行实现之前,必须执行reset_run impl_1脚本命令,然后再执行launch_runs impl_1脚本命令。
(4)如图2.46所示,出现Bitstream Generation Completed(比特流生成完成)对话框界面。在该界面内提供了三个选项:
①Open Implemented Design(打开实现后的设计);
②View Reports(查看报告);
③Launch iMPACT(启动iMPACT)。
图2.46 实现处理完成后的对话框界面
在该设计中,选择Open Implemented Design选项。
(5)单击OK按钮。
(6)出现Critical Messages(危险消息)对话框界面。在该设计中不用考虑。
(7)单击OK按钮。
(8)如图2.47所示,在Vivado右上角出现器件的结构图。
图2.47 Artix FPGA器件内部结构图
(9)单击图2.47界面左侧一列工具栏内的 (放大视图)按钮,放大该器件视图。并调整视图在窗口的位置。
(10)如图2.48所示,在器件右下角视图上,看到标有橙色颜色方块的引脚。表示该设计中已经使用。
图2.48 Artix FPGA器件所用IO引脚
(11)单击图2.47界面左侧一列工具栏内的 (显示布线资源)按钮和 (缩小视图)按钮。并调整视图在窗口的位置。
(12)如图2.49所示,显示了该设计的布线。
图2.49 该设计的布线关系
注: 其中绿色的线表示设计中使用的互连线资源。
(13)放大视图,并调整该视图在窗口的位置。如图2.49所示,给出了该设计所使用的逻辑设计资源。在该视图中,可以看到其内部的结构,包括:查找表LUT、多路复用器MUX、快速进位链、触发器资源。
思考题2.5:结合作者《Xilinx FPGA设计权威指南》一书中,对Xilinx 7系列FPGA内部结构的介绍。仔细查找时钟管理单元、块存储器、数字信号处理模块,以及其他设计资源在FPGA硅片上的布局。
图2.50 该设计使用的逻辑资源
思考题2.6:把鼠标放到每个逻辑资源上,查看Xilinx对每个逻辑资源的位置定义。这对于读者进行相应的位置约束也至关重要。
(14)关闭器件视图界面。
2.设计实现选项
本节将介绍设计实现选项参数,以便在后面对设计实现选项进行修改时,能理解这些参数的含义。如图2.45所示,单击Implementation Settings选项。打开图2.51所示的实现选项对话框界面。
图2.51 实现设计设置对话框界面
由图2.51中可以看出,Vivado集成设计套件包含预定义的策略集。此外,设计者也可以创建自己的策略(后面章节会详细介绍)。
根据策略的目的,将其分解为不同的类。类的名字作为策略的前缀。表2.4给出了类及其用途。表2.5给出了实现策略的种类和功能描述。
表2.4 类及其用途
类别 | 目的 |
Performance | 提高设计性能 |
Area | 减少LUT个数 |
Power | 添加整体功耗优化 |
Flow | 修改流程步骤 |
Congestion | 减少阻塞和相关的问题 |
表2.5 实现策略(Implementation Strategies)
实现策略名字 | 描述 |
Vivado Implementation Defaults | 平衡运行时间,努力实现时序收敛 |
Performance_Explore | 使用多个算法进行优化、布局和布线,这是为了得到潜在较好的优化结果 |
Performance_RefinePlacement | 在布局后的优化阶段内,提高布局器的努力程度,防止在布线器内出现时序发散(时序的不收敛) |
Performance_WLBlockPlacement | 忽略用于布局BRAM和DSP的时序约束,取而代之的是使用线长 |
Performance_WLBlockPlacementFanoutOpt | 忽略用于布局BRAM和DSP的时序约束,取而代之的是使用线长。并且,执行对高扇出驱动器的复制 |
Performance_LateBlockPlacement | 使用大概的BRAM和DSP的布局,直到布局的后期阶段。因此可能产生更好的整体布局 |
Performance_NetDelay_high | 补偿乐观的延迟估计。为长距离和高扇出的连接,添加额外的延迟代价(high设置,最悲观的) |
Performance_NetDelay_medium | 补偿乐观的延迟估计。为长距离和高扇出的连接,添加额外的延迟代价(medium设置) |
Performance_NetDelay_low | 补偿乐观的延迟估计。为长距离和高扇出的连接,添加额外的延迟代价(low设置,最不悲观的) |
Performance_ExploreSLLs | 探索SLR的重新分配,以改善整体的时序余量 |
Area_Explore | 使用多个优化算法,以使用更少的LUT |
Area_DefalutOpt | 添加功耗优化(power_opt_design),以降低功耗 |
Area_RunPhysOpt | 类似于Implementation Run Defaults,但是使能物理优化步骤(phys_opt_design) |
Flow_RuntimeOptimized | 每个实现步骤用设计性能换取了更好的设计时间,禁止物理优化(phys_opt_design) |
Flow_Quick | 只运行布局和布线,禁止所有的优化和时间驱动的行为 |
Congestion_SpreadLogic_high | 将逻辑分散到整个器件,以避免创建阻塞区域。High表示最高程度的分散 |
Congestion_SpreadLogic_medium | 将逻辑分散到整个器件,以避免创建阻塞区域。Medium表示中等程度的分散 |
Congestion_SpreadLogic_low | 将逻辑分散到整个器件,以避免创建阻塞区域。low表示最低程度的分散 |
Congestion_SpreadLogicSLLs | 分配SLL,这样所有逻辑能分配到所有的SLR,以避免在SLR内创建阻塞区域 |
Congestion_BalanceSLLs | 分配SLL,这样没有两个SLR要求一个不成比例的较多的SLL,因此减少了那些SLR内的阻塞。 |
Congestion_BalanceSLRs | 分区,这样每个SLR有相似的区域,以避免在一个SLR内创建阻塞区域 |
Congestion_CompressSLRs | 用较高SLR利用率分区,以降低整体SLL的数量 |
注: 包含SLL或者SLR的策略,只用于SSI器件。
本节将对设计执行时序仿真。时序仿真和行为级仿真最大的不同点在于,时序仿真带有标准延迟格式(Standard Delay Format,SDF)信息,而行为级仿真不带有时序信息。毛刺、竞争冒险等时序问题都会表现在设计时序仿真中。执行时序仿真的步骤主要包含:
(1)在源文件窗口选择test.vhd/test.v文件(取决于读者所选择的设计语言)。
(2)在Vivado设计界面左侧的Flow Explorer内,找到Simulation并展开。
(3)如图2.52所示,单击Run Simulation(运行仿真)。出现浮动菜单,选择Run Post-Implementation Timing Simulation(运行实现后时序仿真选项)。在浮动菜单内,Vivado开始运行实现后仿真程序。
图2.52 选择实现后时序仿真
(4)如图2.53所示,出现仿真后的波形界面。在其左侧一列的工具栏中,单击 (放大)按钮,对仿真波形局部放大,并且调整仿真波形在窗口中的位置。在进行适当调整后,出现实现后的仿真波形界面。
图2.53 实现后时序仿真波形图
思考题2.7:请读者仔细观察图中白色椭圆圈内的信号变化情况。说明毛刺的产生机理。
(提示:不同的逻辑量从输入到输出经过芯片内互连线传输延迟和逻辑门的翻转延迟。这些延迟时间是不一样的,从图中看到延迟是ps。所以,可以看到z[5:0]逻辑信号上有一个很小的过渡区域,也就是毛刺)。
思考题2.8:查阅相关资料,说明在FPGA内关键路径的定义,以及为什么关键路径对设计性能有很大的影响。在设计中,采取何种措施缩短关键路径,以提高设计性能。
(5)退出实现后仿真界面。
编程文件用于对FPGA进行配置。通过调试主机和目标FPGA之间的JTAG通道,将编程文件下载到目标FPGA中。
1.执行生成可编程文件
生成编程文件的步骤主要包括:
(1)在Vivado源文件窗口中,选择顶层设计文件top.vhd/top.v(取决于读者使用的设计流程)。
图2.54 生成编程文件选项
(2)如图2.54所示,在Vivado左侧的Flow Navigator窗口下方,找到Program and Debug(编程和调试)选项并展开。
(3)在展开项中,单击Generate Bitstream(生成比特流)选项。开始生成编程文件。
(4)当生成编程文件后,准备将生成的编程文件下载到硬件中,对设计进行验证。
2.生成编程文件选项
本节将介绍生成编程文件的选项的功能,以便读者在后续对比特流设置进行修改。如图2.54所示,在该界面内选择并单击Bitstream Settings选项。打开如图2.55所示的比特流配置界面。默认地,write_bitstream Tcl命令只生成一个二进制比特流(.bit)文件。通过使用下面的命令开关来改变产生的文件格式。
图2.55 生成编程文件选项
(1)-raw_bitfile:该选项产生原始比特文件,该文件包含和二进制比特流相同的信息,但它是ASCII格式。输出文件名字为文件名.rbt。
(2)-mask_file:该选项产生一个掩码文件,有掩码数据,其配置数据在比特文件中。这个文件定义了比特流文件中的哪一位应该和回读数据进行比较,用于验证目的。如果掩码为0,需要验证比特流中的该位,否则,不需要验证。输出文件的名字是文件名.msk。
(3)-no_binary_bitfile:不产生二进制比特流文件。当需要生成ASCII格式比特流或者掩码文件时,或者生成一个比特流文件时,使用该选项。
(4)-logic_location_file:创建一个ASCII逻辑定位文件(.ll),该文件给出了锁存器、LUT、BRAM和I/O块输入和输出的比特流位置。帧参考比特,位置文件中的比特个数,用于帮助设计者观察FPGA寄存器的内容。
(5)-bin_file:创建一个二进制文件(.bin),只包含器件编程数据,而没有标准比特流文件中的头部信息。
(6)-reference_bitfile<arg>:读一个参考比特文件,输出一个增量比特流文件。该文件只包含与指定参考文件不同之处。这个部分比特流文件用于增量编程一个已经存在编程文件的器件,也就是更新。
当生成用于编程FPGA的比特流数据后,就可以将比特流数据下载到目标FPGA器件中。Vivado工具提供了两种不同的方法,用于将比特流下载到目标FPGA中,即:
(1)打开Vivado集成环境内构建的系统内器件编程功能-hardware session(硬件会话);
(2)打开Vivado集成环境内提供的iMPACT器件编程器工具。
注: iMPACT作为ISE环境下的下载工具,本书不建议在Vivado集成环境下使用。
Vivado集成工具,允许设计者对一个或多个FPGA进行编程,同时和这些FPGA进行交互。可以通过Vivado集成环境用户接口或者使用Tcl命令,连接FPGA硬件系统。在这两种方式下,连接目标FPGA器件的步骤都相同。包括:
①打开硬件会话(Open hardware session);
②通过运行在主机上的硬件服务器(hardware server),打开硬件目标器件;
③给需要编程的目标FPGA器件分配相应的比特流编程文件;
④将文件编程或者下载到目标器件中。
使用Vivado硬件会话编程FPGA的步骤主要包括:
图2.56 下载编程文件选项
(1)如图2.56所示,在Vivado左侧的Flow Navigator窗口下方,找到Program and Debug(编程和调试)选项并展开。在展开项中,选择Hardware Manager。
(2)如图2.57所示,在Vivado界面上方出现Hardware Session(硬件会话)界面。在该界面的上方单击Open a new hardware target打开一个新的目标。
图2.57 启动硬件目标入口
注: 使用USB下载线,将其插入到Nexy4板卡上的J6 USB插座上,建立FPGA和主机之间的连接。
(3)出现Open New Hardware Target(打开新硬件目标)对话框界面。
(4)单击Next按钮。
(5)如图2.58所示,出现Open New Hardware Target(打开新硬件目标)-Vivado CSE Server Name(Vivado CSE服务器名字)对话框界面。
图2.58 输入端口号界面
(6)单击Next按钮。
(7)如图2.59所示,出现Open Server(打开服务器)对话框界面,表示正在打开服务器。
图2.59 正在打开服务器界面
(8)成功打开服务器后,如图2.60所示,在Hardware Targets下面给出了如下信息:
①Type:xilinx_tcf;
②ESN:Digilent/210274482939A。
在Hardware Devices下面给出了如下信息:
①Name:XC7A100T_0;
②ID Code:03631093;
③IR Length:6。
图2.60 打开新硬件目标对话框界面
(9)单击Next按钮。
(10)如图2.61所示,出现Open New Hardware Target(打开新硬件目标)-Set Hardware Target Properties(设置硬件目标属性)对话框界面。设计者可以设置下载频率(注:使用默认设置)。
图2.61 出现设置频率窗口
(11)单击Next按钮。
(12)出现Open New Hardware Target(打开新硬件目标)-Open Hardware Target Summary(打开硬件目标总结)对话框界面。
(13)单击Finish按钮。
(14)出现如图2.62所示的Hardware Session(硬件会话)对话框界面。在该界面中,选中XC7A100T器件,单击右键,出现浮动菜单,选择Assign Programming File…(分配编程文件)选项。
图2.62 选择分配可编程文件选项
(15)如图2.63所示,出现Assign Programming File(分配编程文件)对话框界面。在该界面中,单击 按钮。出现Open File对话框界面,在该界面中,将分配文件指向当前生成的bit文件目录下(读者根据自己的情况进行修改):
E:\vivado_example\gate_verilog\gate_verilog.runs\impl_1
图2.63 分配可编程文件对话框
注: 此处需要仔细确认所分配的编程文件是否为当前设计所生成的比特流文件。
(16)如图2.63所示,单击Apply按钮。
(17)在如图2.61所示的界面下,再次选中XC7A100T器件。然后,单击右键,出现浮动菜单。在浮动菜单内,选择Program Device…(编程器件)。
(18)如图2.64所示,出现Program Device(编程器件)-Select Bitstream file for device XC7A100T(选择用于XC7A100T的比特流文件)对话框界面。
图2.64 确认选择的编程文件对话框界面
(19)单击Program按钮。
(20)如图2.65所示,出现Program Xilinx FPGA Device(编程Xilinx FPGA器件)对话框界面。
图2.65 编程FPGA对话框界面
(21)编程成功后,在Nexys4板卡上,验证该设计的正确性。