FPGA系统性学习笔记连载_Day5 Xilinx ZYNQ7000系列 PS、PL、PS-PL基本开发流程之PL端篇
本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。
连载《叁芯智能fpga设计与研发-第5天》 Xilinx ZYNQ7000系列 PS、PL、PS-PL基本开发流程之《PL端》
原创作者:紫枫术河 转载请联系群主授权,否则追究责任
这篇文章记录《xilinx ZYNQ7020 》 PL端的基本开发流程,关于PS、PL、PS-PL 端的概念,请查看 Day4 篇。
一、ZYNQ的基本开发流程
ZYNQ 的开发也是先硬件后软件的方法。具体流程如下:
- 在 Vivado 上新建工程,增加一个嵌入式的源文件。
- 在 Vivado 里添加和配置 PS 和 PL 部分基本的外设,或需要添加自定义的外设。
- 在 Vivado 里生成顶层 HDL 文件,并添加约束文件。再编译生成比特流文件(*.bit)。
- 导出硬件信息到 SDK 软件开发环境,在 SDK 环境里可以编写一些调试软件验证硬件和软件,结合比特流文件单独调试 ZYNQ 系统。
- 在 SDK 里生成 FSBL 文件。
- 在 VMware 虚拟机里生成 u-boot.elf、 bootloader 镜像。
- 在 SDK 里通过 FSBL 文件, 比特流文件 system.bit 和 u-boot.elf 文件生成一个BOOT.bin文件。
- 在 VMware 里生成 Ubuntu 的内核镜像文件 Zimage 和 Ubuntu 的根文件系统。另外还需要要对 FPGA 自定义的 IP 编写驱动。
- 把 BOOT、内核、设备树、根文件系统文件放入到 SD 卡中,启动开发板电源, Linux操作系统会从 SD 卡里启动。
以上是典型的 ZYNQ 开发流程,但是 ZYNQ 也可以单独做为 ARM 来使用,这样就不需要关心PL 端资源,和传统的 ARM 开发没有太大区别。
ZYNQ 也可以只使用 PL 部分,但是 PL 的配置还是要 PS 来完成的,就是无法通过传统的固化 Flash 方式把只要 PL 的固件固化起来。
二、安装驱动
2.1、因为我电脑同时安装了ISE14.7,他的驱动和vivado会导致冲突的,所以需要在设备管理器先卸载之前的jtag驱动,红色的一定要勾选,否则不成功
2.2、安装前先关闭 vivado 软件,不能同时打开多个版本的 vivado、 ise,如果 vivado 识别不到下载器,请尝试关闭防火墙,杀毒软件
2.3、进入安装路径《D:vivado2017Vivado2017.4dataxicomcable_driversnt64digilent》双击“install_digilent.exe”文件安装
- 1、进入D:vivado2017Vivado2017.4dataxicomcable_driversnt64digilent
- 2、双击install_digilent.exe进行安装
2.4、安装完成后, 连接下载器, 打开设备管理器,在通用串行总线控制器里找到 USB SerialConverter,说明安装成功
三、PL端(相当于只操作Artix-7 FPGA部分)实验,与门实验要用2个按键、一个led灯,引脚确定
3.1、开发板介绍,我用的是创龙ZYNQ7020开发板
3.2、PL端的led原理图如下:
我们led4作为与门的输出:M15
3.3、PL端按键原理图
我们用SW3、SW4作为与门的输入信号
SW3:H15
SW4:G15
四、创建 Vivado 工程
这个开发流程和不带 ARM 的FPGA 芯片完全一致
4.1、启动 Vivado,在 Windows 中可以通过双击 Vivado 快捷方式启动
4.2、在 Vivado 开发环境里点击“Create New Project”,创建一个新的工程
4.3、点击下一步
4.4、在弹出的对话框中输入工程名和工程存放的目录,我们这里取一个 and_gate2_1 的工程名。需要注意工程路径“Project location”不能有中文空格,路径名称也不能太长。
4.5、在弹出的对话框选择RTL,点击下一步
目标语言“Target language”选择“Verilog”,点击下一步
4.6、先不添加任何文件,点击下一步
4.7、在“Part”选项中,器件家族“Family”选择“Zynq-7000”, AX7020 开发板封装类型“Package”选择“clg400” ,Speed 选择”-2”减少选择范围。
”表示速率等级,数字越大,性能越好,速率高的芯片向下兼容速率低的芯片。点击下一步
4.8、查看工程的芯片信息是否正确,然后点击Finish
工程创建后,如下界面
4.9、点击 Project Manager 下的 Add Sources 图标 ,创建 Verilog HDL 文件 输入二输入与门的逻辑代码
5.0、选择添加或创建设计源文件“Add or create design sources” ,点击“Next”
5.1、选择创建文件“Create File” ,在弹出的File Name输入文件名“and_gate2_1”,然后点击“OK”
5.2、点击“Finish” ,完成“and_gate2_1.v”文件添加
5.3、在弹出的模块定义“Define Module” ,中可以指定“and_gate2_1.v”文件的模块名称“Modulename” ,这里默认不变为“and_gate2_1”,
还可以指定一些端口,这里暂时不指定,点击“OK”。
5.4、在弹出的对话框中选择“Yes
5.5、双击“and_gate2_1.v”可以打开文件,然后编辑
5.6、放大窗口
5.7、输入二输入与门的verilog代码
代码语言:javascript复制module and_gate2_1(
input wire a,
input wire b,
output wire y
);
assign y = a && b;
endmodule
5.8、编写好代码后保存
5.9、运行综合分析
6.0、综合完成后,弹出一个对话框,问我们是否要进行实现,我们选择否“Cancle”
6.1、查看RTL视图
6.2、可以看见,我们的verilog代码等效电路图一致
6.3、添加管脚约束 ,我们现在要把a、b绑定到按键上,y绑定到led上,这样我们就可以在开发板上实际验证了
Vivado 使用的约束文件格式为 xdc 文件。xdc 文件里主要是完成管脚的约束,时钟的约束,以及组的约束。
这里我们需要对 and_gate2_1.v 程序中的输入输出端口分配到 FPGA 的真实管脚上。
6.4、重新运行综合分析
6.5、 在RTL ANALYSIS右击,在弹出的对话框选择“open RTL in New Window”
6.6、在菜单中选择“Window -> I/O Ports”
6.7、在弹出的 I/O Ports 中可以看到管脚分配情况,现在引脚是空的因为我们还没有分配
6.8、将a绑定到H15,b绑定到G15,y绑定到M15 ,电平标准设为3.3
完成后点击保存图标 ,弹出窗口,要求我们保存约束文件,我们将文件名改为and_gate2_1,点击ok
6.9、打开刚才生成的“and_gate2_1.xdc”文件,我们可以看到是一个 TCL 脚本,
如果我们了解这些语法,完全可以通过自己编写 led.xdc 文件的方式来约束管脚
7.0、添加时序约束
一个 FPGA 设计除了管脚分配以外,还有一个重要的约束,那就是时序约束,这里通过向导方式演示如果进行一个时序约束。
7.1、点击“Run Synthesis”开始综合 ,在弹出的对话框选择OK
7.2、综合完成会自动弹出对框框,询问是否要进行实现,点击“Cancel
7.3、点击约束向导,“Constraints Wizard” ,在弹出的窗口中点击“Next”
7.4、时序约束向导分析出设计中的时钟,这里把“sys_clk”频率设置为 50Mhz,然后点击 “Skip to Finish”结束时序约束向导。
这里因为我们设计的二输入与门没有用到时钟引脚,所以暂不设置,这里只是为了有一个完整的流程
7.5、弹出的窗口中点击“OK”
7.6、点击“Finish”
7.7、这个时候 and_gate2_1.xdc 文件已经更新,点击重新加载文件,并保存文件
7.8、生成 BIT 文件
编译的过程可以细分为综合、布局布线、生成 bit 文件等,这里我们直接点击“Generate Bitstream” ,直接生成 bit 文件。
7.9、弹出对话框,说我们的设计还没有实现,生成bit流文件将会自动进行实现,我们选择YES
8.0、在弹出的对话框中可以选择任务数量,这里和 CPU 核心数有关,一般数字越大,编译越快,点击“OK”
这个时候开始编译,可以看到右上角有个状态信息,在编译过程中可能会被杀毒软件、
电脑管家拦截运行,导致无法编译或很长时间没有编译成功。
8.1、编译中没有任何错误,编译完成,弹出一个对话框让我们选择后续操作, 可以选择“Open Hardware Manger”,当然,也可以选择“Cancel”, 我们这里选择 “Cancel”,先不下载
五、Vivado 仿真
5.1、设置 Vivado 的仿真配置, 右击 SIMULATION 在弹出的列表选择Simulation Settings。
5.2 在 Simulation Settings 窗口中进行如下图来配置,这里设置成 1ms(根据需要自行设定) ,其它按默认设置,单击 OK 完成。
5.3、添加激励测试文件,点击 Project Manager 下的 Add Sources 图标,按下图设置后单击 Next。
5.4、点击 Create File 生成仿真激励文件。
5.5、在弹出的对话框中输入激励文件的名字,这里我们输入名为 and_gate2_1_tb
5.6、点击 Finish 按钮返回。
5.7、弹出的对话框,提示我们添加I/O ports,我们先不添加
5.8、点击OK,弹出对话框提示我们的定义没有更改,是否确定使用这个,我们选择是
5.9、在 Simulation Sources 目录下多了一个刚才添加的 and_gate2_1_tb文件。双击打开这个文件,可以看到里面只有 module 名的定义,其它都没有。
六、仿真测试
6.0、输入我们的仿真代码
代码语言:javascript复制`timescale 1ns/1ps
module and_gate2_1_tb();
reg a;
reg b;
wire y;
and_gate2_1 and_gate2_1_inst(
.a (a),
.b (b),
.y (y)
);
initial begin
a = 0;
b = 0;
# 20;
a = 0;
b = 1;
# 20;
a = 1;
b = 0;
# 20;
a = 1;
b = 1;
# 20;
end
endmodule
6.1、编写好后保存, and_gate2_1_tb.v 自动成了这个仿真 Hierarchy 的顶层了,它下面是设计文件and_gate2_1_tb
6.2、右键点击sim_1 按钮,在弹出的列表选择 Run Behavioral Simulation。这里我们做一下行为级的仿真就可以了。
6.3、打开的波形窗口如下
6.4、可以看见波形没有很好显示,我们点击全局缩放,放大、缩小,按钮将波形调整到合适位置
6.5、可以看见,仿真结果和我们的二输入与门结果一致,证明逻辑设计正确
七、下板验证
7.1、连接好开发板的 JTAG 接口,给开发板上电
7.2、打开Open Hardware Manager界面
在“HARDWARE MANAGER”界面点击“Auto Connect”,自动连接设备
7.3、可以看到 JTAG 扫描到 arm 和 FPGA 内核
7.4、选择 xc7z020_1,右键“Program Device...”
7.5、在弹出窗口中点击“Program”
7.6、等待下完成
7.7、下载完成以后,我经过验证,按键测试输入信号和led灯与设计一致
7.8、至此,ZYNQ7020的PL端,基本开发流程完全跑通,至于固化待PS-PL联合实验完成再另写一篇。