本帖最后由 FPGA课程 于 2024-9-23 18:18 编辑
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
1概述ZYNQ SOC的优势在于将软件和硬件结合开发。使用 ZYNQ 需要掌握软件和硬件开发的调试技巧,这样才能 同时分析软件及硬件的运行情况,便于分析解决问题。本课通过一个简单的实验讲解使用 VIVADO 和SDK进行联合调试。在这个实验中,添加了一个用户自定义的IP CORE,使用VIO CORE观察其数据,并通过ILA CORE观察 AXI 总线的通信时序,以及GPIO的输出。 本课实验工程是在上一课工程的基础上搭建,添加了一个名为 MATH_IP 的 Custom IP、VIO CORE、ILA CORE。Mark Debug 观察 AXI4-Lite 总线上的工作情况,VIO CORE观察MATH_IP的工作情况,ILA CORE观察LED的PIN脚输出情况。 实验目的: 1:掌握BD图形设计,添加第三方IP CORE的方法 2:掌握ZYNQ IP通过AXI4总线添加IP的方法 3:掌握在线逻辑分析仪IP ILA和VIO IP的使用 4:掌握SDK联合PL调试的方法
2系统框图本方案构建基于ZYNQ IP核的最小系统,包含了PS DDR、FLASH、EMMC、TF-Card、Uart、USB、ETH以太网。没用到的接口外设在下图中不再体现。 以下框图中展示了ZYNQ IP的GP0 Master接口通过AXI4总线互联到GPIO_LITE IP和math_ip。通过在线逻辑分析仪ILA IP和VIO IP观察FPGA内部的信号。
3搭建SOC系统工程详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“01Vitis Soc开发入门”这篇文章。 3.1Zynq IP PS部分设置本文中的PS设置内容是新增加的配置部分,关于DDR、MIO、CPU时钟等设置请参考“01Vitis Soc开发入门”这篇文章。 1:PS复位设置
2:设置PS GT Master接口
3:设置PL的时钟勾选FCLK_CLK0,设置为100,即PS的PLL提供本系统的时钟100MHZ。
4:ZYNQ IP设置完成后
3.2添加第三方IP
1:设置第三方IP路
2:添加math IP
3:添加自定义的GPIO_LITE_ML IP
3.3VIVADO自动连线添加完IP后根据软件的提示单击Run Connection Automation
全部自动连线
完成后
右击GPIO_LITE_ML IP的GPIO_LED端口,选中Make External
3.4添加在线逻辑分析仪ILA IP CORE这里我们查看AXI4-LITE总线,以及GPIO_LITE_ML的输出结果,右击需要查看波形的信号或者总线,弹出菜单选择Debug
可以看到多了绿色的小爬虫,以及软件提示自动连线,单击Run Connection Automation
出现ILA IP CORE
双击ILA IP CORE,修改信号类型为MIX,这样即可支持AXI总线查看,也可以支持简单信号的查看
单击,拖动鼠标完成连线,按住ESC退出连线
这个时候位宽还不一致,等后面校验的时候ILA IP会自动增加位宽
如果想去掉ILA只要右击,选择clear debug
3.5添加虚拟IO VIO IP CORE
双击VIO IP设置虚拟IO参数
设置完成后
完成连线
3.7设置IP地址分配
3.8校验BD工程
可以看到校验完成后,ILA IP的数据位宽自动增加
3.9导出顶层文件
顶层FPGA文件调用 BD模块,并且引出信号GPIO_LED_0,需要在管脚约束中添加FPGA PIN脚约束
3.10编译并导出平台文件1:生成Bit文件。
2:导出到硬件: FileàExport HardwareàInclude bitstream
3:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。
4搭建Vitis-sdk工程创建soc_base sdk platform和APP工程,由于本实验更新了FPGA的代码,所以如果是复制之前做好的工程,需要删除soc_sdk中的全部文件,然后重新创建soc_base和APP工程。 4.1创建SDK Platform工程启动Vitis-Sdk
设置好路径
米联客资料中的路径规范如下图: soc_prj里面是基于SOC的硬件工程源码 soc_hw里面是xsa格式文件,soc_prj编译会导出system_wrapper.xsa到这个路径 soc_sdk里面是裸机的sdk工程,sdk工程创建依赖soc_hw中的system_wrapper.xsa 以下再次详细演示创建soc_base以及APP工程的过程,在后续的demo中不再重复这些步骤
创建soc_base platform project
找到xsa文件,这个文件包含了FPGA的硬件信息
创建完成后的soc_base
右击编译
4.2创建PS_PL_Debug APP
右击新建debug_test.c程序文件
添加以下代码: - #include <stdio.h>
- #include "xparameters.h"
- #include "xil_io.h"
- #include "sleep.h"
- #include "xil_types.h"
- #define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data) \
- Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))
- #define XPAR_GPIO_LITE_ML_0 XPAR_GPIO_LITE_ML_0_BASEADDR
- #define GPIO_LITE_ML_REG0 0
- #define MATH_IP_BASE XPAR_MATH_IP_0_BASEADDR
- #define MATH_REG0 0
- #define MATH_REG1 4
- #define MATH_REG2 0
- u8 val=0;
- int main()
- {
- u8 i=0;
- Xil_Out32(MATH_IP_BASE+MATH_REG0,0X42);
- Xil_Out32(MATH_IP_BASE+MATH_REG1,0X12);
- val = Xil_In32(MATH_IP_BASE+MATH_REG2);
- xil_printf("val=%x",val);
- XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,0X00);
- while(1)
- {
- for(i=0;i<=3;i++)
- {
- XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,1<<i);
- //修改vio :probe_out0设置为1,probe_out1,probe_out2任意设置,观察输出
- //val = Xil_In32(MATH_IP_BASE+MATH_REG2);
- //xil_printf("val=%x",val);
- usleep(500000);
- }
- i=0;
- }
- }
复制代码
右击选择Single Application Debug
程序会暂停在main函数的入口处
注意:这里进入debug后不要立即运行程序,否则无法观察AXI总线信号的触发
5加载逻辑分析仪波形窗口1:回到VIVADO界面,单击Open Hardware Manager àOpen Target->Auto Connect
2:加载完成后的界面,可以看到hw_ila_1就是调试GPIO波形的和AXI4总线的波形的,hw_vio_1是VIO IP用来测试math_ip
6 ILA GPIO信号调试1:打开HW_ILA1 窗口,配置 ILA,其中触发位置选设置为512,并且配置触发条件为GPIO_LED_0={0001}
2:配置触发信号,当条件满足将会触发ILA 波形
点击Status-hw_ila_1中
编辑按钮
3: Vitis IDE中,点击
编辑按钮,当程序输出0X01到GPIO的时候,触发信号触发
7 ILA观察AXI4总线波形1:删除之前GPIO的触发条件 2:添加触发条件设置为AXI_WVALID, 设置Radix为H,触发条件Value为1 3:在Trigger Setup中,点击“+”,选择AXI_WVALID,双击添加。设置Radix为H,触发条件Value为1。
4:单击运行按钮,启动触发。
5:Vitis IDE软件中,打开串口调试软件。
6:单击Vitis IDE中的运行按钮
编辑后,VIVADO 中 HW_ILA2 窗口采集到波形输出,可以看到AXI总线的工作时序。
8 VIO(虚拟机IO)的使用1:同时可以观察到VIO核采集到的数据
2:在以下位置加入断点(在图中位置双击即可加入断点),方便调试。
3:点击Vitis IDE中 编辑,当运行完“xil_printf("val=%x",val)”后,控制台输出0X54。
4:将probe_out2设置为1,给probe_out0,probe_out1手动赋值,会发现math_ip_0_result的值发生变化。
9 Vitis IDE调试认识工具栏
9.1Kill Break Point(使断点失效)使用此工具后,所有设置的断点都不会被执行 9.2Resume(开始/重新开始运行)单步调试或者断点调试的时候使用
9.3Supend(暂停)调试状态下,当进入断点后会暂停,当正常运行,点击此按钮也会暂停
9.4Terminate(结束)结束本次运行
9.5Disconnect(断开连接)JTAG断开和FPGA的连接
9.6in to(可以进入库函数调试)正常情况下是无法进入库函数调试的,通过 in to 可以进入库函数调试
9.7Over(跳过当前函数)跳过当前函数,或者代码,当前代码就不会被执行。
9.8Return(返回)和 in to功能相反,在 in to到函数内部后,从函数内部返回。
9.9Debug(调试)
9.10RUN(直接运行)
10 Vitis IDE常用菜单
10.1Project(与编译相关)用于编译
10.2Run(与调试有关命令)
10.3Xilinx(与程序下载相关)
10.4Window(与软件相关的窗口)Show View包含了与编写代码有关的窗口和一些Debug信息相关的窗口
11 Vitis IDE调试技巧之断点设置在代码左边双击,可以设置断点
12 Vitis IDE调试技巧之观察变量当程序停止后,把光标放到变量上就可以看到变量的值,另外Variables也可以看到变量值
另外全局变量和局部变量的显示还不一样如下图,正确的数值在红色框选内,而Value显示的是T
13 Vitis IDE调试技巧之查看函数定义如何函数是宏定义,可以把光标放到函数上,直接观看宏定义
右击函数后单击Open Declaration 可以查看到函数定义
14 Vitis IDE调试技巧之观察内存打开内存观察窗口
设置需要观察内存的起始地址
由于ZYNQ Ultrascale+ 内存的起始地址有一段无法访问,因此设置起始地址大于10MB
单击OK后可以看到内存的数据
可以直接修改内存的数据,如果没有变红,证明数据修改正确
在后续的教程中,在DMA传输数据部分需要用到这个功能
|