问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 5996 人浏览分享

开启左侧

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

[复制链接]
5996 0
AMD-FPGA课程
AMD课程: 12-ZYNQ7100实验 »
软件版本: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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

303

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版