Vivado工具使用规则 参考手册: 1. Vivado Design Suite User Guide:System-Level Design Entry (UG895)。 2. Vivado Design Suite User Guide: DesignAnalysis and Closure Techniques(UG906)。
一、FPGA 开发流程

二、FPGA 工程管理
主要分为以下四类:
- 开发过程中使用的辅助文档文件(如绘图软件绘制的波形图文件等),该类文件存放的文件夹我们命名为 doc;
- 新建工程及产生的文件,该类文件存放的文件夹我们命名为 prj;
- 开发过程中的 RTL 代码文件,该类文件存放的文件夹我们命名为 rtl;
- 仿真工程与仿真文件,该类文件存放的文件夹我们命名为 sim;

三、点亮 LED 灯
3.1 功能分析
PL_KEY0 按键来控制底板上的 PL_LED0 灯亮灭。 按下点亮、松开熄灭。
3.2 硬件介绍


3.3 系统设计
进行模块划分和梳理模块间交互信号
3.4 硬件介绍
使用Viso绘制,绘制文件放在doc文件下 


正点原子提供了Viso模具
复制到我的形状里 

3.5 绘制波形图
实际效果图
根据效果图绘制真值表
波形图绘制技巧:
- 输入信号的颜色定义为绿色,
- 输出的信号定义为红色,
- 中间变量信号定义为蓝色。
绘制波形完成后按照波形编写RTL代码。
3.6 编写RTL代码
采用Notepad++工具来编写代码 好用
3.7 Modelsim手动仿真
编写仿真文件(TestBench)
- 向被测功能模块的输入接口添加激励;
- 对被测功能模块的顶层接口进行信号例化;
- 判断被测功能模块的输出是否满足设计预期。
在前面 led\sim 中新建一个 tb 文件夹,
在 tb 文件夹下面新建一个“tb_led.v” 
- 定义仿真单位:仿真单位是 1ns,用于延迟语句,“#200”就是延迟 200ns;
`timescale 1ns / 1ns //仿真单位/仿真精度- 定义输入与输出:一般输入信号定义为寄存器类型(reg),一般输出信号定义为线型(wire)。
module tb_led();
//reg define
reg key;
//wire define
wire led;- 输入信号初始化:一位按键输入的初始化。因为板载按键默认为高电平,所以初始化时我们给按键赋值高电平。
//信号初始化
initial begin
key <= 1'b1; //按键上电默认高电平- 给输入信号赋值:结合延迟语句给输入按键赋不同的值。模拟按键被按下和被释放。
//key 信号变化
#200 //延迟 200ns
key <= 1'b1; //按键没有被按下
#1000
key <= 1'b0; //按键被按下
#600
key <= 1'b1;
#1000
key <= 1'b0;
end- 例化 led 模块:例化点亮 LED 模块。通过例化 led 模块,我们 TB 模块编写的激励就可以传递到待测模块进行仿真
//例化 led 模块
led u_led(
.key (key),
.led (led)
);
endmodule在 modelsim中仿真建立project


- Create New File(创建新文件)
- Add Existing File (添加已有文件)
- Create Simulation(创建仿真)
- Create New Folder(创建新文件夹)
这里我们先选择“Add Existing File”(添加已有文件)
添加仿真文件
文件添加完成
编译:
- Compile Selected(编译所选)
- Compile All(编译全部)

- Compile Order:文件编译顺序,可以调整编译的.v 文件的编译顺序。
- Compile Report:编译报告,内容为当次编译的详细报告。
- Compile Summary:编译摘要,执行过的编译操作都在编译摘要有记录。
编译完成:
- “√”表示编译通过状态
- “×”表示编译错误
- 黄色的三角符表示包含警告的编译通过
开始配置仿真环境:【Simulate】→【Start Simulation...】
- Design Optimization:优化设计设置页面。
- Runtime Options:运行选项配置,例如波形格式配置、仿真时间设置等。
- Restart:重启仿真。
- Break/End Simulation:终止仿真运行。
配置仿真功能:
- Design:标签内居中的部分是 Modelsim 中当前包含的全部库,展开看到库中包含的设计单元,这些库和单元是为仿真服务的,使用者可以选择需要进行仿真的设计单元开始仿真,此时被选中的仿真单元的名字就会出现在下方的 Design Unit(s)位置。支持同时对多个文件进行仿真。右侧是 ==Resolution 选项,这里可以选择仿真的时间精度。==

- VHDL
- Verilog
- Libraries:可以设置搜索库。 Search Libraries 和 Search Libraries First 的功能基本一致,唯一不同的是 Search Libraries First 中指定的库会在指定的用户库之前被搜索。

- SDF:Standard Delay Format(标准延迟格式)的缩写,内部包含了各种延迟信息,也是用于时序仿真的重要文件。 SDF Files 区域用来添加 SDF 文件。 第一个“Disable SDF warning”是禁用 SDF 警告, 第二个“Reduce SDF errors to warnings”是把所有的 SDF 错误信息变成警告信息。 Multi-Source delay 中可以控制多个目标对同一端口的驱动,如果有多个控制信号同时控制同一个端口或互连,且每个信号的延迟值不同,可以使用此选项统一延迟。 latest、 min 和 max。 latest选项选择最后的延迟作为统一值, max 选项选择所有信号中延迟最大的值作为统一值, min 选项选择所有信号中延迟最小的值作为统一值

- Others
勾选“Enable optimization”
优化选项进行如下图设置
如果不进行上面的优化选项配置, Modelsim SE-64 2020.4 仿真会报如下截图所示错误
点击“OK” 就可以开始进行功能仿真
添加查看的信号
仿真按钮,如下图
Restart:复位仿真,点击该按钮会有一个弹框如下图所示 
- Run Length:设置仿真时间,配合运行仿真按钮使用;
- Run:运行仿真,配合设置仿真时间一起使用,会按照设置仿真时长进行仿真;
- ContinueRun:继续仿真,在停止仿真后需要继续运行仿真,可以使用继续仿真按钮;
- Run -All:一直仿真,点击仿真复位后,再点击一直仿真,仿真会一直运行,直到点击 Stop 停止仿真;
- Break:中断当前编译或者仿真;
- Stop:在下一步或者下一时间之前停止仿真。
- 注意:使用“Run -All”与“ContinueRun”时,如果仿真工程是只有组合电路,没有使用时钟,工程仿真使用“Run -All”与“ ContinueRun”时,就只能跑到仿真文件的激励的节点,不能一直运行仿真。此时如果在仿真文件添加持续的时钟输入,点击“ Run -All”与“ContinueRun”时就会一直仿真。
选择仿真时间为 10us
仿真结果
ModelSim 软件中几个常用小工具 放大、缩小和全局显示功能,有快捷键
黄色图标是用来在波形图上添加用来标志的黄色竖线,紧跟着的是将添加的黄色竖线对齐到信号的下降沿和上升沿
当我们需要对 IP 核进行仿真时一定要事先将 IP 核的库文件加载到Modelsim 库中去。 RTL 代码仿真验证完成
3.8 新建工程



工程类型选择:
- “RTL Project”是指按照正常设计流程所选择的类型,这也是常用的一种类型。
- “Do not specify sources at this time”:用于设置是否在创建工程向导的过程中添加设计文件,如果勾选后,则不创建或者添加设计文件,我们后续需要添加设计文件,所以不勾选该选项。
- “Project is an extensible Vitis platform”:创建的工程是否需要扩展 Vitis 开发平台,点亮 LED等实验不需要 Vitis 开发平台。所以这个选项我们也不需要勾选。
- “Post-synthesis Project”在导入第三方工具所产生的综合后网表时才选择;
- “I/O Planning Project”一般用于在开始 RTL 设计之前,创建一个用于早期 IO 规划和器件开发的空工程;
- “Imported Project” 用于从 ISE、 XST 或 Synopsys Synplify 导入现有的工程源文件; 5)“Example Project”是指创建一个 Vivado 提供的工程模板。
选择开发板的芯片型号
Category:种类,如下图所示按照芯片用途有四个类别
- Automotive :车用芯片;
- General Purpose:一般用途的芯片;
- Military/Hi-Reliability:军用/高可靠性的芯片;
- Radition Tolerant:辐射耐受性的芯片;

工程界面:
- Flow Navigator。 Flow Navigator 提供对命令和工具的访问,其包含从设计输入到生成比特流的整个过程。 在点击了相应的命令时,整个 Vivado 工程主界面的各个子窗口可能会作出相应的更改。
- 数据窗口区域。默认情况下, Vivado IDE 的这个区域显示的是设计源文件和数据相关的信息。
- Sources 窗口: 显示层次结构(Hierarchy)、 IP 源文件(IP Sources)、库(Libraries)和编译顺序(Compile Order)的视图。
- Netlist 窗口: 提供分析后的(elaborated)或综合后的(synthesized)逻辑设计的分层视图。
- Properties 窗口: 显示有关所选逻辑对象或器件资源的特性信息。
- 工作空间(Workspace): 工作区显示了具有图形界面的窗口和需要更多屏幕空间的窗口,包括:
- Project Summary。提供了当前工程的摘要信息,它在运行设计命令时动态地更新。
- 用于显示和编辑基于文本的文件和报告的 Text Editor。
- 原理图(Schematic)窗口。
- 器件(Device)窗口。
- 封装(Package)窗口。
- 结果窗口区域:在 Vivado IDE 中所运行的命令的状态和结果,显示在结果窗口区域中,这是一组子窗口的集合。在运行命令、生成消息、创建日志文件和报告文件时,相关信息将显示在此区域。默认情况下,此区域包括以下窗口:
- Tcl Console: 允许您输入 Tcl 命令,并查看以前的命令和输出的历史记录。
- Messages: 显示当前设计的所有消息,按进程和严重性分类,包括“Error”、“Critical Warning”、“Warning”等等
- Log: 显示由综合、实现和仿真 run 创建的日志文件。
- Reports: 提供对整个设计流程中的活动 run 所生成的报告的快速访问。
- Designs Runs: 管理当前工程的 runs。
- 主工具栏: 主工具栏提供了对 Vivado IDE 中最常用命令的单击访问。
- 主菜单: 主菜单栏提供对 Vivado IDE 命令的访问。
- 窗口布局(Layout)选择器: Vivado IDE 提供预定义的窗口布局,以方便调用设计过程中的各种窗口。布局选择器使您能够轻松地更改窗口布局。或者,可以使用菜单栏中的“Layout”菜单来更改窗口布局
3.9 设计输入
3.9.1 设置字体
“Settings”→“Text Editor”→“Fonts and Colors” 
3.9.2 手动设置顶层
从“Sources”窗口的右击菜单中选择“Set as Top”
3.10 分析与综合
3.10.1 分析(Elaborated)
Vivado 会编译 RTL 源文件并进行全面的语法检查,
Vivado 会生成顶层原理图视图,并在默认 view layout 中显示设计。此页面可分配I/O 
- Name:工程中顶层端口的名称。
- Direction:说明管脚是输入还是输出。
- Neg Diff Pair:负差分对, 差分信号在 I/O Ports 窗口中只显示在一行里中(只会显示 P 端信号, N 端信号显示在 Neg Diff Pair 属性栏中)。
- Package Pin:配置管脚封装。
- Fixed: 每一个端口都有 Fixed 属性,表明该逻辑端口是由用户赋值的。端口必须保持锁定状态,才能避免生成比特流时不会发生错误。
- Bank, I/O Std, Vcco, Slew Type,
- Drive Strength:显示 I/O 端口的参数值。
- Bank:显示管脚所在的 Bank。
- I/O Std:配置管脚的电平标准,常用电平标准有 LVTTL 和 LVCMOS、 SSTL、 LVDS 与 HSTL 等。Vcco:选择的管脚的电压值。
- Vref: 在我们的设计中,硬件上 VREF 引脚悬空。
- Drive Strength: 驱动强度,默认 12mA。
- Slew Type: 指上升下降沿的快慢,设置快功耗会高一点,默认设置慢( slow)。
- Pull Type:管脚上下拉设置,有上拉、下拉、保持与不设置。
- Off-Chip Termination: 终端阻抗,默认 50Ω。
- IN-TERM: 是用于 input 的串联电阻
引脚配置在硬件原理图 ==供电电压在原理图的bank供电电压==
管脚约束 
“Ctrl+S”保存 管脚约束也可以手敲
I/O约束语句 set_property”是命令的名称; “PACKAGE_PIN L14”是引脚位置参数,代表引脚位置是 L14; “[get_ports key]”代表该约束所要附加的对象是 key 引脚; “IOSTANDARD LVCMOS33”代表该引脚所使用的电平标准是LVCMOS33。
#IO 管脚约束
set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports key] set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports led]时钟周期约束语句 “create_clock”是该命令的名称,它会创建一个时钟; 其后的“-name clk”、“-period 20”、“[get_ports sys_clk ]”都是该命令的各个参数, 分别表示所创建时钟的名称是“ clk”、 时钟周期是 20ns、 时钟源是 sys_clk 端口, ==一般只对输入的时钟做周期的约束==
#时钟周期约束
create_clock -name clk -period 20 [get_ports sys_clk ]3.10.2 对代码进行综合
“Open Synthesized Design”选项打开综合设计。
综合后原理图
- IBUF 是输入缓存
- OBUF 是输出缓存
- 取反通过一个 LUT1实现
综合后设计其他选项
- Constraints Wizard:约束向导。
- Edit Timing Constraints:编辑时间约束。
- Set Up Debug:引导创建在线调试。
- Report Timing Summary:报告时序摘要并运行时序分析。
- Report Clock Networks:时钟网络报告。
- Report Clock Interaction:时钟交互报告。
- Report Methodology: 检查符合 UltraFast 设计方法的设计。
- Report DRC: 设计规则检查。
- Report Noise: 噪声分析报告。
- Report Utilization:资源利用率报告。
- Report Power:电源报告。
- Schematic:打开综合后的原理图设计。

3.11 设计实现
“Run Implementation”
打开实现设计
Netlist”窗口中有“Nets”与“Leaf Cells”,点击“Nets”与“Leaf Cells”下面的选项,右边的器件图会高亮对应模块,所以实现设计将代码映射到了 FPGA 底层资源上。 查看“ Design Runs”窗口中的实现结果
与综合的选项类似 
3.12 下载验证
生成bit流
打开硬件管理
连接硬件
“Auto Connect”
“ Program Device”
下载程序
“Enable end of startup check” 勾选就是使用下载完成校验,如果下载失败就会返回一个错误提示 一般这里我们都是默认勾选的。
开发板断电,程序会丢失 ZYNQ 芯片无法单独固化比特流文件( PL 的配置文件) ==这是由于 ZYNQ 非易失性存储器的引脚(如 SD 卡、 QSPI Flash)是 ZYNQ PS 部分的专用引脚,这些非易失性存储器由 PS 的 ARM 处理器进行驱动,需要将 bit 流文件和 elf 文件(软件程序的下载文件)合成一个 BOOT.BIN,才能进行固化,因此需要学习 ZYNQ 嵌入式 VITIS 的开发流程。==
参考笔记:16_程序固化实验&

绘制波形完成后按照波形编写RTL代码。




工程界面:
引脚配置在硬件原理图 ==供电电压在原理图的bank供电电压==
管脚约束 
“Ctrl+S”保存 管脚约束也可以手敲