打开软甲------>新建工程------->设计输入------->分析与综合------->约束输入------->设计实现-------->生成和下载比特流
1、这里使用的是Vivado 2020.2版本,打开软件,点击“create Project”创建一个新的工程。
2、点击下一步
3、输入工程的名称和路径,名称可以贴近这次工程的功能,例如这次的”led_twinkle“
路径地址不包含中文、空格或者其他一些特殊符号。
这里会默认勾选了“Create project subdirectory”选项,Vivado会在所选工程目录下自动创建一个与工程名同名的文件夹,用于存放工程内的各种文件。Vivado 会自动管理工程文件夹内的各种工程文件,并创建相应的子目录,这为大家的开发工作带来了很大的便捷。
继续点击“Next”,接下来是工程类型的选择,这里选择“RTL Project”,如下图所示:
4、选择RTL Project。
各个选项的含义:
“RTLProject”是指按照正常设计流程所选择的类型,这也是常用的一种类型,“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提供的工程模板。
5、选择了“RTL Project”后,点击“Next”,进入添加源文件页面。
如果勾选“RTL Project”下的“Do not specify sources at this time”,则不会出现添加源文件的界面。
在弹出添加源文件的界面后,可以在此处创建/添加源文件,当然也可以直接点击“Next”,创建完工程后再创建/添加源文件。
这里先不添加,直接点击“Next”,如下图所示:
6、接下来是添加约束文件,直接点击“Next”,在创建完工程后创建/添加约束文件.
7、接下来是选择器件型号,“Family”一栏选择“Artix-7”、“Package”一栏选择“fgg484”(A7_200T时选择"fbg484”) 、“Speed”一栏选择“-2”,此时下面的器件列表就会自动筛选出符合以上设置条件的器件。
(也可根据实际进行选择)
8、检查一下,finish
9、进入工程主界面
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”菜单来更改窗口布局。
1、创建顶层文件,如图点“+”。
2、如图选择第二个添加设计文件,next。
3、如图点创建文件
4、填写源文件名称“led_twinkle”,可根据实际文件更改,然后ok。
这时可以看到创建的源文件,finish。
5、然后“OK”
这个窗口用于设置源文件的模块名称和端口列表,Vivado 会根据在此窗口中的设置,自动地在 HDL 源文
件中写入相应的 verilog 语句。我们会手动输入代码,所以这里不作任何设置,直接点击 OK 即可。
若出现此窗口“YES”
6、这时“Sources”窗口就出现了源文件。
7、双击打开源文件,将其中的代码替换为如下Led登闪烁代码。
module led_twinkle(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output [1:0] led //LED 灯
);
//reg define
reg [25:0] cnt ;
//*****************************************************
//** main code
//*****************************************************
//对计数器的值进行判断,以输出 LED 的状态
assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
//assign led = (cnt < 26'd5) ? 2'b01 : 2'b10 ; //仅用于仿真
//计数器在 0~5000_000 之间进行计数
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 26'd0;
else if(cnt < 26'd5000_0000)
// else if(cnt < 26'd10) //仅用于仿真
cnt <= cnt + 1'b1;
else
cnt <= 26'd0;
end
endmodule
9、写完代码记得保存,如图按钮。保存后vivado会进行语法检查。在大多数情况下,Vivado IDE 会自动识别设计的顶层模块,当然,用户也可以手动指定顶层模块。从“Sources”窗口的右击菜单中选择“Set as Top”来手动定义顶级模块
1、我们开始在 Vivado IDE 中进行仿真,首先创建一个 TestBench。我们点击“Sources”窗口中的
“+”号(Add Sources 命令),在弹出的窗口中选择“Add or Create Simulation Sources”,next.
2、直接"create file"
3、输入TestBench的文件名称“tb_led_twinkle”,一般测试文件会在源文件名称前加tb_。这个文件只用于仿真,不能用于设计的综合和实现。然后“OK”
“finish”
“OK”完成TestBench源文件的创建。
如果弹出窗口直接Yes.
这里就可以看到创建的文件了。
4、双击替换成下面的代码。
`timescale 1ns / 1ps
module tb_led_twinkle();
//输入
reg sys_clk;
reg sys_rst_n;
//输出
wire [1:0] led;
//信号初始化
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#200
sys_rst_n = 1'b1;
end
//生成时钟
always #10 sys_clk = ~sys_clk;
//例化待测设计
led_twinkle u_led_twinkle(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led (led)
);
endmodule
为了让读者能够更好的理解,这里我们就简单介绍一下 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,如下图所示:
到led_twinkle.v文件改一下注释位置即可。
待仿真结束后进行分析和综合时,再将标记为“仅用于仿真的”的语句注释掉或者直接删除。
5、如图点击进行仿真。
6、到了仿真界面
1、下面分别介绍仿真界面中的各个子窗口:
(1)Scope 窗口:Scope(范围)是 HDL 设计的层次划分。在 Scope 窗口中,您可以看到设计层次结
构。当大家选择了一个 Scope 层次结构中的作用域时,该作用域内的所有 HDL 对象,包括 reg、wire 等都会出现在“Objects”窗口中。大家可以在“Objects”窗口中选择 HDL 对象,并将它们添加到波形查看器中。
(2)Object 窗口:“Objects”窗口会显示在“Scopes”窗口中选择的范围内的所有 HDL 仿真对象。例
如,我们在 Scope 窗口中选择顶层模块“led_twinkle”,在“Objects”窗口中就会自动显示出 led_twinkle
模块中所有的对象。可以看出,在 led_twinkle 顶层模块中除了顶层端口 sys_clk、sys_rst_n 和 led 之外,还包括在内部定义的计数器 cnt。如下图所示:
右击cnt,添加到波形窗口中的“cnt”计数器如下图所示:
图中可以放大缩小波形图。
2、一般来说,每当我们进行一次仿真时,都会把当前波形的配置信息保存下来,包括波形窗口中具有哪
些信号等等,以便在下一次打开仿真器进行仿真时,继续使用上一次仿真的配置信息。我们点击波形窗口中的保存按钮,如下图所示:
之后会弹出“Save Waveform”对话框,提示用户将当前波形配置信息保存为“.wcfg”后缀的文件,且工具
已经自动地输入了文件名“tb_led_twinkle _behav”,文件的保存目录也被工具自动设置为了当前的工程目录,所以我们保持其默认状态即可,直接点击“Save”。如下图所示:
这里有个地方需要大家注意下,wcfg 文件只是包含波形窗口的配置信息,并不包含波形的数据文件,
波形的数据文件被存储在另外的文件中。
在点击保存后会弹出一个消息框,询问用户是否将刚刚创建的波形配置信息文件 tb_led_twinkle
_behav.wcfg 添加到当前工程中,我们直接点击“Yes” 即可。如下图所示:
(4)仿真工具栏:仿真工具栏包含运行各个仿真动作的命令按钮。从左至右依次是:
• Restart:将仿真时间重置为零,此时波形窗口中原有的波形都会被清除。下次执行仿真时,会从 0
时刻重新开始。
• Run all:运行仿真,直到其完成所有事件或遇到 HDL 语句中的 s t o p 或 stop 或 stop或finish 命令为止。注意,如
果没有在 TestBench 语句中加入 s t o p 或 stop 或 stop或finish 命令,当点击 Run all 命令时,仿真器会无休止地一直仿真下
去,除非用户点击仿真工具栏中的“Break”按钮来手动地结束仿真。但是这里有个地方需要注意,如果此
时需要仿真的设计比较复杂,则仿真器在运行仿真时会耗费电脑大量的 CPU 和内存资源,此时有可能会造
成电脑卡顿甚至死机的情况。所以,如果设计比较复杂,且没有在 TestBench 语句中加入 s t o p 或 stop 或 stop或finish 命
令,最好不要轻易点击 Run all 命令。
• Run For:运行特定的一段时间。紧随在后面的两个文本框用于设定仿真时长的数值大小和时间单位。
• Step:按步运行仿真,每一步仿真一个 HDL 语句。
• Break:暂停当前仿真。
• Relaunch:重新编译仿真源并重新启动仿真。在使用 Vivado 仿真器来调试 HDL 设计时,您可能会根据仿真结果来对您的 HDL 源代码进行修改。在修改完 HDL 源代码后,可以点击 Relaunch 按钮来重新加载UUT 设计和 TestBench,以重新对修改后的 HDL 源代码进行仿真。此时就不需要再关闭并重新打开仿真器了。
介绍完各个窗口和命令按钮的使用后,我们就可以开始仿真了。
在刚打开仿真器时,仿真器会首先将 TestBench 中的信号加入到波形窗口中,并执行一段时长的仿真,
仿真的时长由 Settings 设置窗口中的参数值指定,如下图所示:
可以看到,仿真器启动后默认立即执行的仿真时长是 1000ns。由于我们是在默认立即执行仿真结束之
后,才加入了“cnt”计数器信号,所以新加入的 cnt 信号并没有波形。此时我们需要将仿真时刻重置为 0,
重新开始仿真。点击 Restart 按钮,波形窗口中的当前仿真时刻点(黄色标尺)就会回归到 0ns,且原先的所有波形都被清除,如下图所示:
此时点击仿真工具栏中的 Run For 按钮,默认仿真时长是 10us,如下图所示:
此时就可以看到波形窗口中就出现了波形,我们点击波形窗口中的显示工具栏中的“Zoom Fit”按钮,波
形就会自动缩放到整个窗口,如下图所示:
cnt 信号默认显示为 16 进制,为了方便观察,我们将其设置为 10 进制。对 cnt 信号右键,如图。
修改显示后的波形如下图所示:
这里可以看出,cnt 每计数到 10,led 就翻转一次。证明我们的 HDL 设计达到了我们想要的功能。
至此,仿真结束。
功能仿真通过之后,就可以对设计进行分析(Elaborated)了。我们首先将源代码中为仿真而修改的部
分恢复成原来的代码,如下图所示:
点击“Flow Navigator”窗口中的“Open Elaborated Design”按钮,如下图所示:
此时,Vivado 会编译 RTL 源文件进行全面的语法检查,并在 Messages 窗口中给出相应的“Error”和
“Warning”。打开分析后(Elaborated)的设计后,Vivado 会生成顶层原理图视图,并在默认 view layout
中显示设计,如下图所示:
可以看到,此时窗口布局已经发生了变化,新增了 Schematic(原理图)、Netlist(网表)等窗口。此
时,底部的 Messages 窗口会显示出现在分析阶段产生的消息,如下图所示:
可以看出,我们的 led_twinkle 源代码并没有产生警告或者错误。
此时,我们也可以进行 I/O 引脚分配,在右上角的窗口布局(Layout)选择器中选择“I/O Planing”,如
下图所示:
此时,窗口布局会打开一些与 IO 规划相关的子窗口,如下图所示:
在下方的“I/O Ports”窗口中,就可以进行 IO 的分配了。这里我们暂时不分配,先对设计进行综合,
综合之后再统一输入时序约束和 IO 引脚的物理约束。
我们首先将打开的分析后的设计关闭。在工作区域的顶部标题栏处,用鼠标右击,在弹出的命令列表
中选择“close”,如下图所示:
我们点击“Flow Navigator”窗口中的“Run Synthesis”按钮,如下图所示:
在弹出的窗口中我们直接点击 OK,如下图所示:
这时可以看到在“Design Runs”窗口中显示正在综合,如下图所示:
综合完成后,弹出如下窗口:
我们关闭该窗口。接下来进行约束的输入。
大家首先需要创建一个用于存储约束语句的约束文件。点击“Sources”窗口中的“+”号,在弹出的窗
口选择“Add or create constraints”,如下图所示:
点击 next,在接下来的界面中点击“Create File”,如下图所示:
点击 next,在接下来的界面中点击“Create File”,如下图所示:
在弹出的对话框中输入约束文件的名称“led_twinkle”,然后点击 OK。
然后直接点击 Finish 即可。
这时我们就可以在“Sources”窗口中看到添加的这个约束文件了,如下图所示:
这里有个地方需要大家注意下,Vivado 的约束文件是以“.xdc”为文件后缀的 ASCII 文本文件,其中
存储的是一条条的 xdc 约束命令。
我们双击打开 led_twinkle.xdc,输入如下内容:
#时钟周期约束
create_clock -name clk -period 20 [get_ports sys_clk ]
#IO 管脚约束
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS15} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U7 IOSTANDARD LVCMOS15} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN V9 IOSTANDARD LVCMOS15} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN Y8 IOSTANDARD LVCMOS15} [get_ports {led[1]}]
下面我们以 sys_clk 时钟引脚为例,简要介绍 xdc 文件的语法。第一行以“#”号开头,表示这是一条
注释语句。第二行是有效的约束命令。每一个约束命令单独占用一行,命令的结尾没有如 verilog 中的分号“;”一样的语句结束符号。每一条注释也单独占用一行。命令的第一个关键字代表该命令的名称,其后的所有字段都是该命令的参数列表。例如,在第二行的时钟周期约束命令中,“create_clock”是该命令的名称,它会创建一个时钟;其后的“-name clk”、“-period 20”、“[get_ports sys_clk ]”都是该命令的各个参数,分别表示所创见的时钟的的名称是“clk”、时钟周期是 20ns、时钟源是 sys_clk 引脚。
第 5 行至第 8 行是对 IO 管脚的引脚位置约束和电平标准约束。例如,在第 5 行中,“set_property”是
命令的名称;“PACKAGE_PIN R4”是引脚位置参数,代表引脚位置是 R4;“[get_ports sys_clk]”代表
该约束所要附加的对象是 sys_clk 引脚, “IOSTANDARD LVCMOS15”代表该引脚所使用的电平标准是LVCMOS15。
其他 IO 引脚的约束命令的语法与 sys_clk 引脚是相同的,这里就不再重复了。但是要注意,create_clock约束命令只能在 sys_clk 时钟引脚上使用,其他普通 IO 上不能使用 create_clock 约束命令。
点击 Text Editor 中的保存按钮后,就完成了约束的输入。
另外,为了便于大家的查看,我们整理出了包含开发板上所有引脚分配的表格,该表格位于资料盘/3_
正点原子达芬奇 Pro FPGA 开发板原理图/达芬奇 Pro FPGA 开发板 IO 引脚分配表。
记得保存
约束输入完毕之后,就可以开始实现设计了。我们点击点击“Flow Navigator”窗口中的“Run
Implementation”按钮,如下图所示:
如果出现窗口直接yes
在弹出的界面中直接点击 OK 即可,如下图所示:
这时可以看到“Design Runs”窗口中显示实现正在进行,如下图所示:
实现完成后会弹出提示窗口,我们直接点击取消来关闭窗口,如下图所示:
这时我们再次查看“Design Runs”窗口中的实现结果,如下图所示:
要下载设计,首先要生成用于下载到器件中的比特流文件。我们点击“Flow Navigator”窗口中的
“Generate Bitstream”按钮,如下图所示:
在弹出的窗口中直接点击 OK,如下图所示:
此时我们可以看到在“Design Runs”窗口中显示正在生成比特流,如下图所示:
比特流生成完毕之后,Vivado 会弹出提示窗口,我们点击取消关闭该窗口:
接下来我们开始下载比特流,点击“Flow Navigator”窗口中的“Open Hardware Manager”按钮,如下
图所示:
接着 Vivado 就会打开 Hardware Manager,同时窗口布局也跟着发生了变化,如下图所示:
首先我们将下载器一端连接电脑,另一端与开发板上的 JTAG 接口相连接,然后连接开发板电源线。
下面是上板子调试阶段。
这里省略。
此文章为过程记录,学习交流,后期回顾使用,部分文字内容来源于原子哥文档。