时间:2026-04-28 来源:FPGA_UCY 关于我们 0
在点灯之前,我们先来看下标准的 FPGA 开发流程,标准的 FPGA 开发流程主要有以下几个步骤:
![]()
1)需求分析:做一个项目之前,我们首先需要对项目需求进行详细分析,提取项目需求需要实现什么功能;
2)系统设计:根据项目需求我们就可以进行系统架构设计,架构设计主要是将系统分为哪些模块,数
据流怎么走,控制流怎么走,以及计算系统运行的带宽和评估系统的工作频率;
3)硬件选型:根据系统架构分析结果, 我们就可以来选择合适规模和性能的 FPGA 芯片,这个工作称
为 FPGA 器件选型,然后根据 FPGA 型号选择合适的 FPGA 板卡。 FPGA 器件选型是一个综合性的工作,
和项目成本、 FPGA 容量和性能、 FPGA 器件熟悉程度等都有关系,等大家成为大牛后可能才会有一些切身体验;
4)绘制系统框图:确定系统内各个子模块的结构层次,梳理系统对外的输入输出信号和子模块之间的交互信号;
5)绘制波形图:根据该模块的功能并且结合芯片的数据手册或者接口协议,确定模块接口信号的时序
关系,然后使用绘图软件绘制各个模块的时序波形图;
6)编写 RTL 代码:使用代码编辑软件严格按照上面的波形图编写各模块的代码;
7)软件仿真:首先按照 RTL 代码的输入激励需求,编写对应的仿真代码,然后使用仿真工具对编写的
RTL 代码进行仿真。仿真过程中如果 RTL 代码有语法错误,仿真工具下面的提示框会显示语法报错详细信
息,可以对照该信息修改 RTL 代码,直至 RTL 代码语法错误修改完毕,才能出现仿真波形。然后观察仿真
的波形图是否与我们绘制的时序波形一致,如果两者一致,接下来就可以新建工程,如果不一致,则需要通过修改代码使仿真波形与我们绘制的时序波形一致。
8)新建工程:使用 FPGA 开发平台新建工程并添加我们前面编写的 RTL 代码;
9)分析与综合:对工程进行综合编译,通过观察综合编译生成的报告可以帮助避免最常见的设计错误,
以便对设计进行分析和改进;
10)约束输入:在 FPGA 开发平台对工程引脚进行约束,引脚约束完成后就可以进行布局布线与生成
下载文件;
11)设计实现:就是工程布局和布线的过程。它的作用是将综合生成的逻辑网表配置到具体的 FPGA
芯片上。布局布线完成后,就可以生成下载文件了,下载文件生成成功就可以进行下一步的上板验证。
12) 上板验证及调试:连接好开发板与下载器,将生成的下载文件通过下载器下载到开发板, 然后观
察开发板的实物运行是否正常,如果上板实验现象正常,则说明前期设计与代码编写都正常;如果上板实
验现象不正常,可以通过迭代前面设计的每一步来查找问题,如果发现前面的步骤都没有问题,那么这时
候可以通过在线调试来查找问题,直到解决问题,上板验证现象正常。
二. FPGA 工程管理
从上面的 FPGA 的开发流程可知,在 FPGA 开发的过程中会产生很多不同功能的文件,为了方便随时
查找到对应文件,所以在开始开发设计之前,我们第一个需要考虑的问题是工程内部各种文件的管理。 如
果不进行文件分类,而是将所有文件存放在一起,非常不易于后期文件的查找、管理和移植。下面我们就
开始讲解我们所有工程文件的统一管理模式。
我们的工程文件管理模式是根据各个文件的功能划分, FPGA 工程内部文件主要分为以下四类:
1)开发过程中使用的辅助文档文件(如绘图软件绘制的波形图文件等),该类文件存放的文件夹我们
命名为 doc;
2)新建工程及产生的文件,该类文件存放的文件夹我们命名为 prj;
3)开发过程中的 RTL 代码文件,该类文件存放的文件夹我们命名为 rtl;
4)仿真工程与仿真文件,该类文件存放的文件夹我们命名为 sim;
下面我们以点亮 led 灯为例,新建的工程文件管理模板截图如下所示。因为我们使用的 FPGA 开发工具
对工程的路径比较敏感,所以工程路径除了英文、数字以及下划线等,不要出现中文或者其它特殊字符,
否则 FPGA 开发工具无法识别工程路径。
![]()
三. 点亮LED
点亮 LED实验的工程路径新建完成,接下来我们就可以开始开发实验了。第一步是进行实验的功能分析。
1. 功能分析
“点亮 LED”实验是使用领航者开发板底板上的 PL_KEY0 按键来控制底板上的 PL_LED0 灯亮灭。按键没有被按下时, PL_LED0灯保持常灭;当按键PL_KEY0被按下时, PL_LED0灯被点亮;当按键PL_KEY0被松开时,PL_LED0 灯被被熄灭。
2. 硬件介绍
“点亮 LED”实验使用的 PL_KEY0 按键与 PL_LED0 灯都位于领航者底板上的右下角,实物如下图所示:
![]()
领航者底板上的 PL_LED0 灯与 PL_KEY0 按键电路原理图如图
![]()
![]()
由图 可知, PL_LED0 灯的阴极通过 470 欧姆的电阻连到地(GND)上,起到限流的作用,以防止电流过大烧坏 LED 灯; PL_LED0 灯的阳极由 ZYNQ PL 的 IO 管脚控制,当 ZYNQ PL 端的 IO 输出高电平 1 时,点亮 LED 灯;当 ZYNQ PL 端的 IO 输出低电平 0 时, LED 灯熄灭。
由图 可知, PL_KEY0 按键一端接地,一端通过一个 10K 的电阻连接到+3.3V 电源引脚,所以
PL_KEY0 按键未被按下时为高电平,被按下时为低电平。 图中 PL_KEY0 按键连接一个 10K 电阻,
主要起到限流的作用,防止按键被按下时电源直接接地造成电路短路。
3. 系统设计
了解完按键与 LED 灯的工作原理后,接下来我们就可以开始实验的系统结构和层次设计, 即为了实现
实验功能我们需要设计哪些模块,以及各个模块的输入输出端口有哪些。 “点亮 LED”实验通过功能分析
可知,只需要一个按键输入和一个 LED 灯输出,所以一个模块就可以实现“点亮 LED”的功能。 系统结构
和层次设计是非常重要的,因为一般开发的项目都是需要多个模块配合才能工作的,所以在开始实验设置
之前,我们需要搭建系统架构,细化各个功能模块,这样操作不仅可以实现多人协同操作,还能够提高工
作效率,也能使整个系统更加调理清晰,方便管理与移植。
因为“点亮 LED”非常简单,只需要一个模块就可以实现功能,所以本实验不需要进行模块划分和梳
理模块间交互信号,可以直接进行下一步的细化子模块。
4. 模块设计
模块设计主要是想通过图形更加直观的展示出输入与输出之间的关系。我们模块框图是vscode中的drawio插件。
![]()
模块框图绘制只需要使用 Visio 工具自带的基本形状,如下图所示
![]()
“点亮 LED”实验的模块框图如下图所示:
![]()
模块端口与功能描述如下表所示:
![]()
5. 绘制波形图
从前面的功能分析可知我们是使用按键控制 LED 灯的亮灭,结合硬件介绍,按键默认是高电平,按键被按下是低电平; LED 灯是高电平点亮,低电平熄灭。实际效果图如下图所示:
![]()
上面效果图也是使用 Visio 工具绘制的。根据效果图可以绘制如下真值表:
![]()
接下来就可以根据上面的真值表绘制点亮 LED 灯的波形图了。
为了使波形图看起来更加直观,所以在绘制波形图之前,我们需要将波形图的信号大致分为三大类,即输入信号,输出信号与中间变量信号。点亮 LED 灯实验的波形图如下图所示:
对应的waveform render的json代码如下:
{ signal: [
{ name: "KEY", wave: "1.01.0." },
{ name: "LED", wave: "0.10.1." },
]}
波形图绘制完成,接下来就需要严格按照波形图来编写点亮 LED 灯实验的 RTL 代码了。
6. 编写 RTL 代码
接下来我们使用代码编辑工具来编写代码,我们采用vscode+Verilog插件来进行编写代码,我们先来看看led.v的代码:
module led (
input key,
output led
);
/**********************************************************************/
/***************************** Main Code ******************************/
/**********************************************************************/
assign led = ~key;
endmodule
第 2 行代码我们定义了一个一位按键输入信号 key;
第 3 行代码我们定义了一个一位的输出信号 led。
第 9行代码是通过 assign 赋值语句将输入信号 key 的值取反后赋值给输出信号 led。
至此 RTL 代码编写完成,接下来我们可以对我们编写的代码进行仿真。
7. 新建工程
其实新建工程跟仿真严格来说没有特别顺序关系,因为公司的限制,所以不能使用modelsim,所以我就默认使用vivado的仿真了,所以我先介绍下创建工程
领航者开发板使用的 FPGA 开发工具是 Vivado。在开始使用 Vivado 软件之前,我们先来了解一下Vivado软件的使用流程。
首先打开 Vivado 软件,新建一个工程,在新建工程的时候,我们可以通过新建工程向导的方式来创建
工程。工程建立完成后,我们需要新建一个 Verilog 顶层文件, 然后我们将设计的代码输入到新建的 Verilog顶层文件中。 HDL 源代码输入完毕之后,就是对设计文件进行分析与综合了。
在代码输入以及设计分析阶段, Vivado 软件会检查代码,如果代码出现语法错误,那么 Vivado 软件将
会给出相关错误提示。在 FPGA 设计中,综合(Synthesis)就是将 RTL 设计转变为由 FPGA 器件中的查找表(LUT)、触发器(FF)等各种底层电路单元所组成的网表,在这个过程中综合器也会对设计进行优化,例如删除多余的逻辑等等。
综合完成后,我们需要进行约束的输入。约束表达了设计者期望满足的时序要求,规范了设计的时序
行为,并在综合、实现阶段来指导工具进行布局、布线,工具会按照你的约束尽量去努力实现以满足时序
要求,并在时序报告中给出结果。常用的约束包括时序约束、引脚约束等等。
接下来就可以实现整个设计了,包括布局和布线等。如果实现成功,则 Vivado 会给出提示结果。此时,
就可以生成用于下载到器件中的比特流文件了。最后,我们会通过下载器来将这个比特流文件下载到 FPGA中,完成整个开发流程。
在这里,我们只是简单的介绍了一下上述的流程图,让大家对 Vivado 软件的开发流程有个大致的了解。
接下来我们就开始使用 Vivado 软件新建点亮 LED 实验的 FPGA 工程。
我们直接双击桌面上的 Vivado 软件图标,打开 Vivado 软件, Vivado 软件启动界面如下图所示,我们点
击“Create Project 来创建一个新的工程 。
![]()
![]()
![]()
接下来输入工程的名称和路径。名称要能反应出工程所实现的功能,本次工程实现了点亮 LED 的功能,
因此项目名称命名为“led”。工程路径是我们在 7.2 小结中新建的 led/prj 文件夹,取消默认勾选了“Createproject subdirectory”选项。需要说明的是,工程路径不能包含中文、空格或者其它一些特殊的符号,尽量使用英文、数字和下划线,否则工程会创建失败。工程名和路径的设置如下图所示。
![]()
注意,取消默认勾选了“Create project subdirectory”选项是因为如果勾选了该选项, Vivado 会在所选工程目录下自动创建一个与工程名同名的文件夹,用于存放工程内的各种文件。并且 Vivado 会自动管理工程文件夹内的各种工程文件,并创建相应的子目录,但是我们在 7.2 小结已经做了统一的工程管理,不需要“Create project subdirectory”选项的功能,所以我们需要取消该选项的默认勾选状态。
我们继续点击“Next”按钮,接下来是工程类型的选择,我们选择“RTL Project”,如下图所示:
![]()
这里简单介绍下各个工程类型的含义。
1)“RTL Project”是指按照正常设计流程所选择的类型,这也是常用的一种类型。
a)“Do not specify sources at this time”:用于设置是否在创建工程向导的过程中添加设计文件,如
果勾选后,则不创建或者添加设计文件,我们后续需要添加设计文件,所以不勾选该选项。
b)“Project is an extensible Vitis platform”:创建的工程是否需要扩展 Vitis 开发平台,点亮 LED 等
实验不需要 Vitis 开发平台。所以这个选项我们也不需要勾选。
2)“Post-synthesis Project”在导入第三方工具所产生的综合后网表时才选择;
3)“I/O Planning Project”一般用于在开始 RTL 设计之前,创建一个用于早期 IO 规划和器件开发的空
工程;
4)“Imported Project” 用于从 ISE、 XST 或 Synopsys Synplify 导入现有的工程源文件;
5)“Example Project”是指创建一个 Vivado 提供的工程模板。
选择了“RTL Project”后,我们点击“Next”,进入添加源文件页面。注意,如果勾选中图 7.3.53 中
“RTL Project”下的“Do not specify sources at this time”,则不会出现添加源文件的界面。
在弹出添加源文件的界面后,可以在此处创建/添加源文件(RTL 代码):
![]()
点击①Target language 后面的下拉框如下图所示
![]()
源文件编程语言有“VHDL”与“Verilog”两种,我们所有工程的编程语言都选择“Verilog”语言。
点击②Simulator language 后面的下拉框如下图所示:
![]()
仿真文件的编程语言选择有“VHDL”、“Verilog”与“Mixed”三种选择。这里选择默认的混合编程
语言“Mixed”
仿真文件的编程语言选择有“VHDL”、“Verilog”与“Mixed”三种选择。这里选择默认的混合编程
语言“Mixed”。
单击上图③处中的“+”按钮如下图所示
![]()
点击上图中“+”后会下拉三个选项,分别是添加源文件(Add Source Files)、添加源文件夹(Add Source Directories)以及新建源文件(Create Source File),与④处三个选项的功能是一样的。
因为我们已经编写好了源文件,所以这里我们选择添加源文件。可以选择上面的“+”进行添加,也可
以直接点击下图的“Add Files”按钮都能弹出添加源文件提示框,我们这里直接选择“Add Files”按钮添加,如下图所示
![]()
点击“Add Files”按钮跳出如下弹框:
![]()
源文件添加完成,点击“OK”,源文件添加完成如下图所示:
![]()
如果文件添加过程中出错,可以选中添加错的文件点击上图中的“—”进行删除。源文件添加完成,
我们点击“Next”进入下一步添加约束文件,这里直接点击“Next”,创建完工程后再创建/添加约束文件,如下图所示:
![]()
接下来选择开发板的芯片型号,我们可以直接在搜索框中输入完整的芯片型号,大家根据自己所使用
的 ZYNQ 核心板型号进行选择。如果使用的是 ZYNQ-7020 核心板,则输入“xc7z020clg400-2”,如下图所示:
![]()
芯片型号选择完成,点击“Next”进入下一个界面的设置,如下图所示:
![]()
工程概览页面是将之前几个步骤中的设置全部列了出来,供用户检查,选择不同的芯片型号,概览页
面列举的芯片型号也不一样,我们直接点击“Finish”按钮完成工程的创建。工程创建完成后,就进入了
Vivado 的工程主界面,如下图所示:
![]()
创建OK就行了
下面介绍 Vivado 工程主界面中的几个主要子窗口:
(1) Flow Navigator。 Flow Navigator 提供对命令和工具的访问,其包含从设计输入到生成比特流的整个过程。 在点击了相应的命令时,整个 Vivado 工程主界面的各个子窗口可能会作出相应的更改。
(2)数据窗口区域。默认情况下, Vivado IDE 的这个区域显示的是设计源文件和数据相关的信息。
• Sources 窗口: 显示层次结构(Hierarchy)、 IP 源文件(IP Sources)、库(Libraries)和编译顺序(CompileOrder)的视图。
• 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”菜单来更改窗口布局。
8. 手动仿真
对 RTL 代码进行仿真之前,我们首先需要编写实验对应的仿真文件(TestBench)。 TestBench 是用于
验证功能模块的设计是否符合预期,其内容主要分为以下三个步骤:
接下来在前面 led\sim 中新建一个 tb 文件夹,如下图所示:
![]()
通过上面新建“led.v”文件一样的方法,在 sim 文件夹下面新建一个“tb_led.v”文件 ,我们新建一个tb_led.v的文件,这个我们用vscode插件Verilog_Testbench生成,代码如下:
`timescale 1ns / 1ns //仿真单位/仿真精度
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 u_led(
.key (key),
.led (led)
);
endmodule
代码解析如下:
1)定义仿真单位:第 1 行代码定义的是仿真单位是 1ns,例如 TB 模块中第 16、 18、 20、 22 行代码使
用了延迟语句,第 16 行代码“#200”就是延迟 200ns;第 18 行代码就是延迟 1000ns 等。
2)定义输入与输出:一般输入信号定义为寄存器类型(reg),一般输出信号定义为线型(wire)。第
6 行代码是定义了一位寄存器类型 key 输入,第 9 行代码是定义了一位线型 led 输出。
3)输入信号初始化:第 13 行代码是一位按键输入的初始化。因为板载按键默认为高电平,所以初始
化时我们给按键赋值高电平。
4)给输入信号赋值:第 16 行到第 23 行的代码是结合延迟语句给输入按键赋不同的值。第 16 行到第
23 行的代码的功能是模拟按键被按下和被释放。
5)例化 led 模块:第 27 行到第 30 行代码是例化点亮 LED 模块。通过例化 led 模块,我们 TB 模块编
写的激励就可以传递到待测模块进行仿真
我们在vivado中添加仿真文件
![]()
![]()
弄完结构就是这个样子了
![]()
然后按这里仿真
![]()
![]()
![]()
可以通过仿真可以看到是符合我们预期的
9. 分析与综合
代码输入完毕之后,就可以对设计进行分析(Elaborated)了。点击“Flow Navigator”窗口中的“Open Elaborated Design”按钮,如下图所示。
![]()
点击“Open Elaborated Design”按钮弹出的提示框直接点击“OK”,如下图所示。
![]()
此时, Vivado 会编译 RTL 源文件并进行全面的语法检查,并在 Messages 窗口中给出相应的“Error”
和“Warning”。如果出现“Error”,则分析失败,用户必须修改设计文件,并重新编译源文件来取消“Error”。如果出现“Warning”,用户也可逐一查看,以确定哪些是设计缺陷,哪些是可以忽略的。打开分析后(Elaborated)的设计, Vivado 会生成顶层原理图视图,并在默认 view layout 中显示设计,如下图所示:
![]()
可以看到,此时窗口布局已经发生了变化,新增了 Schematic(原理图)、 Netlist(网表)等窗口。此时,底部的 Messages 窗口会显示分析阶段产生的消息,如下图所示
![]()
可以看出,我们点亮 LED 实验的代码并没有产生错误提示,
此时,我们也可以进行 I/O 引脚分配,在右上角的窗口布局(Layout)选择器中选择“I/O Planing”,如下图所示:
![]()
此时,窗口布局会打开 IO 相关的子窗口,如下图所示:
![]()
在上图的“I/O Ports”窗口中,就可以进行 IO 的分配了。
接下来我们先介绍下 IO 分配的配置选项:
![]()
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 的串联电阻。
我们提供了领航者开发板的 IO 引脚总表,在如下图所示位置
![]()
在领航者开发板的底板的原理图中直接搜索“PL_KEY0”与“PL_LED0”,
如图所示:
![]()
由上图可知, PL_KEY0 的管脚名称是“L14”, PL_LED0 的管脚名称是“H15”,这两个管脚都位于
开发板的“Bank 35,接下来我们打 ZYNQ 核心板原理图,查找“Bank 35”的供电电压,如下图所示:
![]()
由上图我们可知,本实验使用的按键与 LED 灯所在的“Bank 35”的供电电压是 3.3V。根据上面查到
的信息我们整理出如下表格:
![]()
接下来就可以根据上表的信息进行管脚约束了。管脚约束完成如下图所示:
![]()
引脚约束完成后,我们使用快捷键“Ctrl+S”进行保存设置,在弹出的界面输入管脚约束文件的名称,
如下图所示:
![]()
上图点击“OK”后,管脚约束文件保存成功,在下图中可以打开“led.xdc”进行查看
![]()
管脚约束完成后,我们关闭分析后的界面。在下图红框中的工作区域用鼠标右击:
![]()
我们双击打开 led.xdc 文件,开始对工程进行约束。约束一般分为两种,一种是 IO 管脚的约束,另外
一种是对时序进行约束。我们先来看下 IO 管脚的约束,约束语句如下:
set_property PACKAGE_PIN L14 [get_ports key]
set_property IOSTANDARD LVCMOS33 [get_ports key]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property PACKAGE_PIN H15 [get_ports led]
每一个约束命令单独占用一行,命令的结尾不需要像 verilog 代码一样,添加分号“;”结束符号。 命令
的第一个关键字代表该命令的名称,其后的所有字段都是该命令的参数列表。 IO 管脚约束是对端口的引脚
位置和电平标准进行约束,例如第二行命令是对输入按键的管脚进行约束,“set_property”是命令的名称;“PACKAGE_PIN L14”是引脚位置参数,代表引脚位置是 L14;“
get_ports key
”代表该约束所要附加的对象是 key 引脚;“IOSTANDARD LVCMOS33”代表该引脚所使用的电平标准是 LVCMOS33。
IO管脚约束比较好理解,就是我们的程序所驱动的IO和ZYNQ芯片的IO对应起来。而时序约束(Timing
Constraints) 用来描述设计人员对时序的要求,比如时钟频率,输入输出的延时等,以满足设计的时序要求。这里举例约束语句如下:
管脚约束完成后,接下来点击“Flow Navigator”窗口中的“Run Synthesis”按钮,来对代码进行综合,如下图所示:
![]()
在弹出的窗口中我们直接点击 OK,如下图所示:
![]()
这时可以看到在“Project Summary”窗口中显示正在综合,如下图所示:
![]()
综合完成后,弹出如下窗口:
![]()
该窗口有三个选项,从上到下分别是设计实现、打开综合设计与查看报告。
“Run lmplementation”选项直接进行设计实现,该选项下一小结会详细讲述。
“Open Synthesized Design”选项打开综合设计。选中“Open Synthesized Design”后点“OK”。
![]()
点击“OK”之后会出现一个弹框,这个弹框中选择“YES”就会打开综合后的原理图,如下图所示:
![]()
10. 设计实现
约束输入完毕之后,就可以开始实现设计了。我们点击“Flow Navigator”窗口中的“Run Implementation”按钮,如下图所示:
![]()
在弹出的界面中直接点击 OK 即可,如下图所示:
![]()
这时可以看到“Project Summary”窗口中显示正在进行实现,如下图所示
![]()
实现完成后会弹出如下提示窗口
![]()
该窗口有三个选项,从上到下分别是打开实现设计、生成下载文件与查看报告。这里我们打开实现设 计看下,如上图所示选择,然后点击“OK”,点击“OK”后出现的弹窗选择“YES”,就会进入实现设计界面,如下图所示:
![]()
上图左边的“Netlist”窗口中有“Nets”与“Leaf Cells”,点击“Nets”与“Leaf Cells”下面的选项,
右边的器件图会高亮对应模块,所以实现设计将代码映射到了 FPGA 底层资源上。
这时我们再次查看“Design Runs”窗口中的实现结果,如下图所示:
![]()
11. 下载验证
在下载程序之前,首先要先生成用于下载到器件中的比特流文件,该文件的后缀为“.bit”。我们点击
“Flow Navigator”窗口中的“Generate Bitstream”按钮,如下图所示:
![]()
在弹出的窗口中直接点击 OK,如下图所示:
![]()
![]()
![]()
比特流生成完毕之后, Vivado 会弹出提示窗口,如下图所示:
![]()
上图中有四个选项,分别是打开实现设计、查看报告、打开硬件管理和生成固化文件。我们可以直接
选择上图的“Open Hardware Manager”进入硬件管理界面,也可以如上图所示,选择“Cancel”关闭该页面,按照下面的描述进入硬件管理页面。
接下来我们开始下载比特流,点击“Flow Navigator”窗口中的“Open Hardware Manager”按钮,如下图所示
![]()
接着 Vivado 就会打开 Hardware Manager,同时窗口布局也跟着发生了变化,如下图所示:
![]()
接下来我们就要用到开发板和 Xilinx 下载器了。首先将 Xilinx 下载器一端连接电脑, 另一端与开发板
上的 JTAG 接口相连接;然后连接开发板电源线,并打开电源开关。下图为领航者开发板的实物连接图:
![]()
开发板连接完成并打开电源开关后,点击“Hardware”子窗口中的“Auto Connect”按钮,如下图示:
![]()
在“Hardware”子窗口中出现如下界面就表示 Vivado 就已经和下载器连接成功了,如下图所示:
![]()
我们点击上图中的“Program Device”,弹出的界面如下图所示:
![]()
此时 Bitstream File 一栏会自动识别到工程的比特流文件,我们直接点击“Program”按钮下载程序。
上图中勾选“Enable end of startup check”的作用可以通过点击左下角的“?”进行查看。点击“?”
后弹框如下图所示:
![]()
“Enable end of startup check”勾选就是使用下载完成校验,如果下载失败就会返回一个错误提示,一
般这里我们都是默认勾选的。
程序下载完成后,我们可以看到位于底板上的 PL_LED0 灯是常灭状态,此时按下 PL_KEY0 按键, PL_LED0 灯会被点亮,松开按键, LED 灯被熄灭,如下图所示:
![]()
需要说明的是,下载完比特流后,如果开发板断电,程序会丢失。如果想要程序断电不丢失的话,需
要将程序固化至开发板中,这个需要在嵌入式 Vitis 软件中完成, ZYNQ 芯片无法单独固化比特流文件(PL的配置文件) 。 这是由于 ZYNQ 非易失性存储器的引脚(如 SD 卡、 QSPI Flash)是 ZYNQ PS 部分的专用引脚,这些非易失性存储器由 PS 的 ARM 处理器进行驱动,需要将 bit 流文件和 elf 文件(软件程序的下载文件)合成一个 BOOT.BIN,才能进行固化,因此需要学习 ZYNQ 嵌入式 VITIS 的开发流程。 在《领航者ZYNQ 之嵌入式开发指南.pdf》文档中“第七章 程序固化实验”,会有一个单独的章节向大家介绍程序固化的方法。