本原创教程由芯驿电子科技(上海)有限公司(ALINX)创做,版权归本公司全部,如需转载,需受权并注明出处。编程
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG数组
实验Vivado工程为“led”。工具
对于ZYNQ来讲PL(FPGA)开发是相当重要的,这也是ZYNQ比其余ARM的有优点的地方,能够定制化不少ARM端的外设,在定制ARM端的外设以前先让咱们经过一个LED例程来熟悉PL(FPGA)的开发流程,熟悉Vivado软件的基本操做,这个开发流程和不带ARM的FPGA芯片彻底一致。布局
在本例程中,咱们要作的是LED灯控制实验,每秒钟控制开发板上的LED灯翻转一次,实现亮、灭、亮、灭的控制。会控制LED灯,其它外设也慢慢就会了。性能
1.1 开发板的PL部分链接了4个红色的用户LED灯。这1个灯彻底由PL控制。若是PL_LED1为高电平,灯则会灭,不然会亮。测试
1.2 咱们能够根据原理图的连线关系肯定LED和PL管脚的绑定关系。spa
1.3 原理图中以PS_MIO开头的IO都是PS端IO,不须要绑定,也不能用于PL端的引脚绑定设计
2.1 启动Vivado,在Windows中能够经过双击Vivado快捷方式启动3d
2.2 在Vivado开发环境里点击“Create New Project”,建立一个新的工程。调试
2.3 弹出一个创建新工程的向导,点击“Next”
2.4 在弹出的对话框中输入工程名和工程存放的目录,咱们这里取一个led的工程名。须要注意工程路径“Project location”不能有中文空格,路径名称也不能太长。
2.5 在工程类型中选择“RTL Project”
2.6 目标语言“Target language”选择“Verilog”,虽然选择Verilog,但VHDL也可使用,支持多语言混合编程。
2.7 点击“Next”,不添加任何文件
2.8 在“Part”选项中,器件家族“Family”选择“Zynq UltraScale+ MPSoCs”,封装类型“Package”选择“sfvc784”,Speed选择”-1”,Temperature选择“I”减小选择范围。在下拉列表中选择“xczu2cg-sfvc784-1-i”,“-1”表示速率等级,数字越大,性能越好,速率高的芯片向下兼容速率低的芯片。
2.9 点击“Finish”就能够完成之后名为“led”工程的建立。
2.10 Vivado软件界面
3.1 点击Project Manager下的Add Sources图标(或者使用快捷键Alt+A)
3.2 选择添加或建立设计源文件“Add or create design sources”,点击“Next”
3.3 选择建立文件“Create File”
3.4 文件名“File name”设置为“led”,点击“OK”
3.5 点击“Finish”,完成“led.v”文件添加
3.6 在弹出的模块定义“Define Module”,中能够指定“led.v”文件的模块名称“Module name”,这里默认不变为“led”,还能够指定一些端口,这里暂时不指定,点击“OK”。
3.7 在弹出的对话框中选择“Yes”
3.8 双击“led.v”能够打开文件,而后编辑
3.9 编写“led.v”,这里定义了一个32位的寄存器timer, 用于循环计数0~24999999(1秒钟), 计数到24999999(1秒)的时候, 寄存器timer变为0,并翻转四个LED。这样原来LED是灭的话,就会点亮,若是原来LED为亮的话,就会熄灭。编写好后的代码以下:
module led( input sys_clk, input rst_n, outputreg[3:0] led ); reg[31:0] timer_cnt; always@(posedge sys_clk ornegedge rst_n) begin if(!rst_n) begin led <=4'd0; timer_cnt <=32'd0; end elseif(timer_cnt >=32'd24_999_999) begin led <=~led; timer_cnt <=32'd0; end else begin led <= led; timer_cnt <= timer_cnt +32'd1; end end endmodule
3.10 编写好代码后保存
Vivado使用的约束文件格式为xdc文件。xdc文件里主要是完成管脚的约束,时钟的约束, 以及组的约束。这里咱们须要对led.v程序中的输入输出端口分配到FPGA的真实管脚上。
4.1 点击“Open Elaborated Design”
4.2 在弹出的窗口中点击“OK”按钮
4.3 在菜单中选择“Window -> I/O Ports”
4.4 在弹出的I/O Ports中能够看到管脚分配状况
4.5 将复位信号rst_n绑定到PL端的按键,给LED和时钟分配管脚、电平标准,完成后点击保存图标
4.6 弹出窗口,要求保存约束文件,文件名咱们填写“led”,文件类型默认“XDC”,点击“OK”
4.7 打开刚才生成的“led.xdc”文件,咱们能够看到是一个TCL脚本,若是咱们了解这些语法,彻底能够经过本身编写led.xdc文件的方式来约束管脚
下面来介绍一下最基本的XDC编写的语法,普通IO口只需约束引脚号和电压,管脚约束以下:
set_property PACKAGE_PIN "引脚编号" [get_ports “端口名称”]
电平信号的约束以下:
set_property IOSTANDARD "电平标准" [get_ports “端口名称”]
这里须要注意文字的大小写,端口名称是数组的话用{ }刮起来,端口名称必须和源代码中的名字一致,且端口名字不能和关键字同样。
电平标准中“LVCMOS33”后面的数字指FPGA的BANK电压,LED所在BANK电压为3.3伏,因此电平标准为“LVCMOS33”。Vivado默认要求为全部IO分配正确的电平标准和管脚编号。
一个FPGA设计除了管脚分配之外,还有一个重要的约束,那就是时序约束,这里经过向导方式演示若是进行一个时序约束。
5.1 点击“Run Synthesis”开始综合
5.2 弹出对话框点击“OK”
5.3 综合完成之后点击“Cancel”
5.4 点击“Constraints Wizard”
5.5 在弹出的窗口中点击“Next”
5.6 时序约束向导分析出设计中的时钟,这里把“sys_clk_p”频率设置为200Mhz,而后点击“Skip to Finish”结束时序约束向导。
5.7 弹出的窗口中点击“OK”
5.8 点击“Finish”
5.9 这个时候led.xdc文件已经更新,若是xdc文件已经打开,会提示“Reload”从新加载文件,并保存文件
6. 生成BIT文件
6.1 编译的过程能够细分为综合、布局布线、生成bit文件等,这里咱们直接点击“Generate Bitstream”,直接生成bit文件。
6.2 在弹出的对话框中能够选择任务数量,这里和CPU核心数有关,通常数字越大,编译越快,点击“OK”
6.3 这个时候开始编译,能够看到右上角有个状态信息,在编译过程当中可能会被杀毒软件、电脑管家拦截运行,致使没法编译或很长时间没有编译成功。
6.4 编译中没有任何错误,编译完成,弹出一个对话框让咱们选择后续操做,能够选择“Open Hardware Manger”,固然,也能够选择“Cancel”,咱们这里选择 “Cancel”,先不下载。
接下来咱们不妨小试牛刀,利用Vivado自带的仿真工具来输出波形验证流水灯程序设计结果和咱们的预想是否一致(注意:在生成bit文件以前也能够仿真)。具体步骤以下:
7.1 设置Vivado的仿真配置,右击SIMULATION中Simulation Settings。
7.2 在Simulation Settings窗口中进行以下图来配置,这里设置成50ms(根据须要自行设定),其它按默认设置,单击OK完成。
7.3 添加激励测试文件,点击Project Manager下的Add Sources图标,按下图设置后单击Next。
7.4 点击Create File生成仿真激励文件。
在弹出的对话框中输入激励文件的名字,这里咱们输入名为vtf_led_test。
7.5 点击Finish按钮返回。
这里咱们先不添加IO Ports,点击OK。
在Simulation Sources目录下多了一个刚才添加的vtf_led_test文件。双击打开这个文件,能够看到里面只有module名的定义,其它都没有。
7.6 接下去咱们须要编写这个vtf_led_test.v文件的内容。首先定义输入和输出信号,而后须要实例化led_test模块,让led_test程序做为本测试程序的一部分。再添加复位和时钟的激励。完成后的vtf_led_test.v文件以下:
`timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// // Module Name: vtf_led_test ////////////////////////////////////////////////////////////////////////////////// module vtf_led_test; // Inputs reg sys_clk; reg rst_n ; // Outputs wire[3:0] led; // Instantiate the Unit Under Test (UUT) led uut ( .sys_clk(sys_clk), .rst_n(rst_n), .led(led) ); initial begin // Initialize Inputs sys_clk =0; rst_n =0; #1000; rst_n =1; end //Create clock always#20 sys_clk =~ sys_clk; endmodule
7.7 编写好后保存,vtf_led_test.v自动成了这个仿真Hierarchy的顶层了,它下面是设计文件led_test.v。
7.8 点击Run Simulation按钮,再选择Run Behavioral Simulation。这里咱们作一下行为级的仿真就能够了。
若是没有错误,Vivado中的仿真软件开始工做了。
7.9 在弹出仿真界面后以下图,界面是仿真软件自动运行到仿真设置的50ms的波形。
因为LED[3:0]在程序中设计的状态变化时间长,而仿真又比较耗时,在这里观测timer[31:0]计数器变化。把它放到Wave中观察(点击Scope界面下的uut,再右键选择Objects界面下的timer,在弹出的下拉菜单里选择Add Wave Window)。
添加后timer显示在Wave的波形界面上,以下图所示。
7.10 点击以下标注的Restart按钮复位一下,再点击Run All按钮。(须要耐心!!!),能够看到仿真波形与设计相符。(注意:仿真的时间越长,仿真的波形文件占用的磁盘空间越大,波形文件在工程目录的xx.sim文件夹)
咱们能够看到led的信号会变成f,说明LED灯会由亮变灭。
8.1 链接好开发板的JTAG接口,给开发板上电
注意拔码开关要选择JTAG模式,也就是所有拔到”ON”,“ON”表明的值是0,不用JTAG模式,下载会报错。
8.2 在“HARDWARE MANAGER”界面点击“Auto Connect”,自动链接设备
8.3 能够看到JTAG扫描到arm和FPGA内核
8.4 选择芯片,右键“Program Device...”
8.5 在弹出窗口中点击“Program”
8.6 等待下载
8.7 下载完成之后,咱们能够看到PL LED开始每秒变化一次。到此为止Vivado简单流程体验完成。后面的章节会介绍若是把程序烧录到Flash,须要PS系统的配合才能完成,只有PL的工程不能直接烧写Flash。在”体验ARM,裸机输出”Hello World”一章的常见问题中有介绍。
前面介绍了仿真和下载,但仿真并不须要程序烧写到板子,是比较理想化的结果,下面介绍Vivado在线调试方法,观察内部信号的变化。Vivado有内嵌的逻辑分析仪,叫作ILA,能够用于在线观察内部信号的变化,对于调试有很大帮助。在本实验中咱们观察timer_cnt和led的信号变化。
9.1 添加ILA IP核
9.1.1 点击IP Catalog,在搜索框中搜索ila,双击ILA的IP
9.1.2 修更名称为ila,因为要采样两个信号,Probes的数量设置为2,Sample Data Depth指的是采样深度,设置的越高,采集的信号越多,一样消耗的资源也会越多。
9.1.3 在Probe_Ports页面,设置Probe的宽度,设置PROBE0位宽为32,用于采样timer_cnt,设置PROBE1位宽为4,用于采样led。点击OK
弹出界面,选择OK
再以下设置,点击Generate
9.1.4 在led.v中例化ila,并保存
9.1.5 从新生成Bitstream
9.1.6 下载程序
9.1.7 这时候看到有bit和ltx文件,点击program
9.1.8 此时弹出在线调试窗口,出现了咱们添加的信号
点击运行按钮,出现信号的数据
也能够触发采集,在Trigger Setup窗口点击“+”,深度选择timer_cnt信号
将Radix改成U,也就是十进制,在Value中设置为24999999,也就是timer_cnt计数的最大值
再次点击运行,便可以看到触发成功,此时timer_cnt显示为十六进制,而led也在此时翻转。
9.2 MARK DEBUG
上面介绍了添加ILA IP的方式在线调试,下面介绍在代码中添加综合属性,实如今线调试。
9.2.1 首先打开led.v,将ila的例化部分注释掉
9.2.2 在led和timer_cnt的定义前面添加(* MARK_DEBUG=”true” *),保存文件。
9.2.3 点击综合
9.2.4 综合结束后,点击Set Up Debug
9.2.5 弹出的窗口点击Next
按照默认点击Next
采样深度窗口,选择Next
点击Finish
点击保存
在xdc文件中便可看到添加的ila核约束
9.2.6 从新生成bitstream
9.2.7 调试方法与前面同样,再也不赘述。
本章节介绍了如何在PL端开发程序,包括工程创建,约束,仿真,在线调试等方法,在后续的代码开发方式中皆可参考此方法。