[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_SDK入门篇连载-03SOC 调试技巧入门

文档创建者:FPGA课程
浏览次数:324
最后更新:2024-09-23
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-SOC » 1_SDK应用方案(仅旗舰型号) » 1-SDK基础入门方案
本帖最后由 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内部的信号。
9ce31d11951f4c73a7e8e144f32724e5.jpg
3搭建SOC系统工程
详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“01Vitis Soc开发入门”这篇文章。
3.1Zynq IP PS部分设置
本文中的PS设置内容是新增加的配置部分,关于DDR、MIO、CPU时钟等设置请参考“01Vitis Soc开发入门”这篇文章。
1:PS复位设置
7bdf694c3c3344ed9d19b2072b26272e.jpg
2:设置PS GT Master接口
45fd867c2a1642ebba599e7b2f994a95.jpg
3:设置PL的时钟
勾选FCLK_CLK0,设置为100,即PS的PLL提供本系统的时钟100MHZ。
fdc7b7bcf7534f3ea5c8ffcae7a3a056.jpg
4:ZYNQ IP设置完成后
8f340f5ea3dc4a868078ec7d0f1c7915.jpg
3.2添加第三方IP
1:设置第三方IP路
89ad22a46c2c42949608ea273e6d96b2.jpg
2:添加math IP
0b118a3e25684de2ae6f93e4232a2506.jpg

bebbbb1455f84cf6aa15c80f4c4862ae.jpg
3:添加自定义的GPIO_LITE_ML IP
4790c959643f4f8f97ee105d259bc7f3.jpg

c052d63e6f7441a4a0addbfc72d0092d.jpg
3.3VIVADO自动连线
添加完IP后根据软件的提示单击Run Connection Automation
e50119d1aa0d4038ac73b873b411ae5a.jpg
全部自动连线
49d659d9ea58436699031009c99b7f2e.jpg
完成后
709e6e1f20dd412c801e4264818c138e.jpg
右击GPIO_LITE_ML IP的GPIO_LED端口,选中Make External
d2c173b28d2a4f1f889e05e483b37ac1.jpg
764b71fb3dd9490a911344e2f594b52d.jpg
3.4添加在线逻辑分析仪ILA IP CORE
这里我们查看AXI4-LITE总线,以及GPIO_LITE_ML的输出结果,右击需要查看波形的信号或者总线,弹出菜单选择Debug
d58d3e2a87394682be3b13794ce99769.jpg
可以看到多了绿色的小爬虫,以及软件提示自动连线,单击Run Connection Automation
fda798fe6713483b844a426081ac68d1.jpg
f643e656a69f4c97baba85a7581df5c1.jpg
出现ILA IP CORE
1e317c189b764655bc6bde9db45fe236.jpg
双击ILA IP CORE,修改信号类型为MIX,这样即可支持AXI总线查看,也可以支持简单信号的查看
5e903df7aee241e79016833a5694e28a.jpg
单击,拖动鼠标完成连线,按住ESC退出连线
f6beb641d9084aacae0f204896e4b79d.jpg
这个时候位宽还不一致,等后面校验的时候ILA IP会自动增加位宽
如果想去掉ILA只要右击,选择clear debug
e2ea4491550f4a8094191b5ac0ad85c1.jpg
3.5添加虚拟IO VIO IP CORE
eb19e9470d3e45fe8505ac95636f261e.jpg

a234fc30913e40b68ff921fb89355ce5.jpg
双击VIO IP设置虚拟IO参数
ca5ff5b367fb4c2baab7c32c8ca09a22.jpg
设置完成后
a4f6cc2bc00e445fab2a814a7c27e2ca.jpg
892cef92de214316a505201cbf16b5c9.jpg
完成连线
053999b935664b858498c512376436bb.jpg
3.7设置IP地址分配
fe300eaa3b6e44ab8d32178e6de95c04.jpg
3.8校验BD工程
6fd89b0108044fffbcdc8c305847581f.jpg
可以看到校验完成后,ILA IP的数据位宽自动增加
d5c51cdfe90f4760abc01730593e67af.jpg
3.9导出顶层文件
fcb9940851fc474f9c211b46e8f57ce9.jpg
顶层FPGA文件调用 BD模块,并且引出信号GPIO_LED_0,需要在管脚约束中添加FPGA PIN脚约束
9feba95fcd6245c591876ac3fb1dc4a5.jpg
3.10编译并导出平台文件
1:生成Bit文件。
d102bcd3ee684d4f9dd032ebb21ea333.jpg
2:导出到硬件: FileàExport HardwareàInclude bitstream
82e136800a8849f2b20aaba02b60d286.jpg
635eb813a15841619da549410b942b26.jpg
48264fb68f194966b9ea665001ea5b47.jpg
ef9e00c65d484082a126349edcfa9b5c.jpg
124f7a433e884eacaf1e5495f8e9046b.jpg
3:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。
0c987900b075431a97289a990a1dfeae.jpg
4搭建Vitis-sdk工程
创建soc_base sdk platform和APP工程,由于本实验更新了FPGA的代码,所以如果是复制之前做好的工程,需要删除soc_sdk中的全部文件,然后重新创建soc_base和APP工程。
4.1创建SDK Platform工程
启动Vitis-Sdk
bdcdeb29803b4b49b7a69f78225dde55.jpg
设置好路径
05892a99df464037b2c03299f845e512.jpg
米联客资料中的路径规范如下图:
soc_prj里面是基于SOC的硬件工程源码
soc_hw里面是xsa格式文件,soc_prj编译会导出system_wrapper.xsa到这个路径
soc_sdk里面是裸机的sdk工程,sdk工程创建依赖soc_hw中的system_wrapper.xsa
以下再次详细演示创建soc_base以及APP工程的过程,在后续的demo中不再重复这些步骤
8d961e6f31434dbfb360dd7cf919ce11.jpg
创建soc_base platform project
f7dc5f4bfea94bc79f47733d1418ec32.jpg
找到xsa文件,这个文件包含了FPGA的硬件信息
b4ef3c507a1d415697e5ead880e89547.jpg
f66cd8f03ea042b28275049d3f694c88.jpg
创建完成后的soc_base
dcd0a4538c9546ee88aad4532e6a9967.jpg
右击编译
fc59f01b61b744a89c1adb9a4e1149f0.jpg
4.2创建PS_PL_Debug APP
51f5c48b23334ab09ee23089836b948e.jpg
b88572baa6a64cbfb4efa3c7542244b7.jpg
5f01603dfb2449289f249d2102a8be0e.jpg
b905bec58728468f87117a7fb1d0b434.jpg
8801545c55f748279593e30661c598b4.jpg
右击新建debug_test.c程序文件
012a88503374402d896eea2f541fb401.jpg
添加以下代码:
  1. #include <stdio.h>
  2. #include "xparameters.h"
  3. #include "xil_io.h"
  4. #include "sleep.h"
  5. #include "xil_types.h"

  6. #define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data)        \
  7.                 Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))
  8. #define XPAR_GPIO_LITE_ML_0 XPAR_GPIO_LITE_ML_0_BASEADDR
  9. #define GPIO_LITE_ML_REG0 0

  10. #define MATH_IP_BASE XPAR_MATH_IP_0_BASEADDR
  11. #define MATH_REG0 0
  12. #define MATH_REG1 4
  13. #define MATH_REG2 0
  14. u8 val=0;
  15. int main()
  16. {
  17.         u8 i=0;
  18.         Xil_Out32(MATH_IP_BASE+MATH_REG0,0X42);
  19.         Xil_Out32(MATH_IP_BASE+MATH_REG1,0X12);
  20.         val = Xil_In32(MATH_IP_BASE+MATH_REG2);
  21.         xil_printf("val=%x",val);

  22.         XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,0X00);
  23.         while(1)
  24.         {
  25.                 for(i=0;i<=3;i++)
  26.                 {
  27.                 XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,1<<i);
  28.                 //修改vio :probe_out0设置为1,probe_out1,probe_out2任意设置,观察输出
  29.                 //val = Xil_In32(MATH_IP_BASE+MATH_REG2);
  30.                 //xil_printf("val=%x",val);
  31.                 usleep(500000);
  32.                 }
  33.                 i=0;
  34.         }
  35. }
复制代码

b95f07ba65844df28c8af5d454bffcd9.jpg
右击选择Single Application Debug
c2797859ad504f448b00a47df20687fa.jpg
程序会暂停在main函数的入口处
7c0626812dfe415fa3230b9fad187b04.jpg
注意:这里进入debug后不要立即运行程序,否则无法观察AXI总线信号的触发

5加载逻辑分析仪波形窗口
1:回到VIVADO界面,单击Open Hardware Manager àOpen Target->Auto Connect
225fc5d02d4644a198ad32bbe2ec9a4d.jpg
2:加载完成后的界面,可以看到hw_ila_1就是调试GPIO波形的和AXI4总线的波形的,hw_vio_1是VIO IP用来测试math_ip
84f039f14ea44d91b56b1c1b7c9ca486.jpg
6 ILA GPIO信号调试
1:打开HW_ILA1 窗口,配置 ILA,其中触发位置选设置为512,并且配置触发条件为GPIO_LED_0={0001}
541d239e167f4c3ea8c78b26edcd77d6.jpg
2:配置触发信号,当条件满足将会触发ILA 波形
50a44a37f1764bd3a26fba5e2236303f.jpg
点击Status-hw_ila_1中 791370c1f90247d7b0bfce35ff087fb5.jpg ​编辑按钮


9c85787ff16d408f874d04445b212428.jpg
3: Vitis IDE中,点击 1b61807efdaf4b4baf03051555f78e4f.jpg ​编辑按钮,当程序输出0X01到GPIO的时候,触发信号触发

3956852bba9642ce9c8bbc3a20a490eb.jpg

e2adb50067894e5bb4373aa9da479f1c.jpg
7 ILA观察AXI4总线波形
1:删除之前GPIO的触发条件
2:添加触发条件设置为AXI_WVALID, 设置Radix为H,触发条件Value为1
3:在Trigger Setup中,点击“+”,选择AXI_WVALID,双击添加。设置Radix为H,触发条件Value为1。
f070487d18644c129ea2530c3376e9fb.jpg
4:单击运行按钮,启动触发。
f6f4a2b8c6a744d0b19089df065e7aa1.jpg
5:Vitis IDE软件中,打开串口调试软件。
8360818bb2b144b084bffb65924f1373.jpg
6:单击Vitis IDE中的运行按钮 ef25d18e326c4bb0bb2c929f272600b4.jpg ​编辑后,VIVADO 中 HW_ILA2 窗口采集到波形输出,可以看到AXI总线的工作时序。

665eb2ca0fea4676a1b893ca3562d473.jpg
8 VIO(虚拟机IO)的使用
1:同时可以观察到VIO核采集到的数据
c653d01ceead4a2daa978c498bb3ef08.jpg
2:在以下位置加入断点(在图中位置双击即可加入断点),方便调试。
6250f23d9ac040bd824f19a6a9d7ed2b.jpg
3:点击Vitis IDE中​编辑,当运行完“xil_printf("val=%x",val)”后,控制台输出0X54。

dca1388b019940f8a8a7bede291ce155.jpg

4:将probe_out2设置为1,给probe_out0,probe_out1手动赋值,会发现math_ip_0_result的值发生变化。
07654a3a7c4844169bf7b4d565e3c2b1.jpg
9 Vitis IDE调试认识工具栏
9.1Kill Break Point(使断点失效)
使用此工具后,所有设置的断点都不会被执行
image.jpg
9.2Resume(开始/重新开始运行)
单步调试或者断点调试的时候使用
dbb54ffb21b645669ac046ec99d33586.jpg
9.3Supend(暂停)
调试状态下,当进入断点后会暂停,当正常运行,点击此按钮也会暂停
4207c435824246a09330921222acd7ce.jpg
9.4Terminate(结束)
结束本次运行
3525e1eac574422da7c19aff7fa23010.jpg
9.5Disconnect(断开连接)
JTAG断开和FPGA的连接
3b2f10b26e5a4ed9af9869c63fe83fd0.jpg
9.6in to(可以进入库函数调试)
正常情况下是无法进入库函数调试的,通过 in to 可以进入库函数调试
e9a1e1cf125f470d97effff09f6fccca.jpg
9.7Over(跳过当前函数)
跳过当前函数,或者代码,当前代码就不会被执行。
bbd0cbb84553408d847e6c30c3c61ae7.jpg
9.8Return(返回)
和 in to功能相反,在 in to到函数内部后,从函数内部返回。
7a9fd64be9ce43f88a343e6fac5f1df9.jpg
9.9Debug(调试)
6dcda9e0ac2842c3988e61586e9e5c8a.jpg
9.10RUN(直接运行)
062fbb06c20d4a41acc6c2e999ee4997.jpg
​​10 Vitis IDE常用菜单
10.1Project(与编译相关)
用于编译
82d558b7a11e4f128a7c70d5ac8ac390.jpg
10.2Run(与调试有关命令)
0fdecfbfcf144929bd268b9bd24bbf0e.jpg
10.3Xilinx(与程序下载相关)
e342bc0669b243679c68b05338da3719.jpg
10.4Window(与软件相关的窗口)
Show View包含了与编写代码有关的窗口和一些Debug信息相关的窗口
82037bcd627148dbb915a885b8d8c6e0.jpg

11 Vitis IDE调试技巧之断点设置
在代码左边双击,可以设置断点
2aeadb598f874b8e913d721a12428459.jpg
12 Vitis IDE调试技巧之观察变量
当程序停止后,把光标放到变量上就可以看到变量的值,另外Variables也可以看到变量值
a57e493a846240b38acc96c052eb3559.jpg
另外全局变量和局部变量的显示还不一样如下图,正确的数值在红色框选内,而Value显示的是T
0b77454023504a789aaa2c69a5e8df1f.jpg
13 Vitis IDE调试技巧之查看函数定义
如何函数是宏定义,可以把光标放到函数上,直接观看宏定义
5c46eda9789343308877ec597dc4fe52.jpg
右击函数后单击Open Declaration 可以查看到函数定义

14 Vitis IDE调试技巧之观察内存
打开内存观察窗口
d0454315404042018feb371783bbe6cc.jpg
设置需要观察内存的起始地址
05afc6ec63b542adb5c4b5fd1b396d24.jpg
由于ZYNQ Ultrascale+ 内存的起始地址有一段无法访问,因此设置起始地址大于10MB
bcd34760288747429944ea13b15dc2ec.jpg
单击OK后可以看到内存的数据
14a2b5919181498ba9389f2c146f6509.jpg
可以直接修改内存的数据,如果没有变红,证明数据修改正确
57b58c8704ec4ee1a58d9fd06247fb8c.jpg
在后续的教程中,在DMA传输数据部分需要用到这个功能


ef25d18e326c4bb0bb2c929f272600b4.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则