软件和硬件的完美结合才是SOC的优势和长处,那么开发ZYNQ就需要掌握软件和硬件开发的调试技巧,这样才能同时分析软件或者硬件的运行情况,找到问题,最终解决。那么本章将通过一个简单的例子带大家使用vivado+SDK进行系统的调试。

8.0难度系数★★☆☆☆☆☆

8.1 系统构架

这个实验中,我们将添加一个名为MATH_IP的 Custom IP.并且添加Mark Debug观察AXI4-Lite总线上的工作情况,添加VIO CORE观察MATH_IP的工作情况,添加ILA CORE观察LED的PIN脚输出情况。

8.2 ZYNQ核的添加及配置

Step1:新建一个名为为Miz701_sys的工程

Step2:选择RTL Project 勾选Do not specify source at this time

Step3:选择芯片类型xc7z010clg400-1。

Step4:单击Finish

8.3使用IP Integrator创建硬件系统

Step1:单击Create Block Design

Step2:输入system

Step3:单击下图中添加IP按钮

Step4:搜素单词z选择ZYNQ7 Processing System,然后双击

Step5:添加进来了ZYNQ CPU IP,然后选中双击。

Step6:修改输入时钟频率为50MHZ,PL端FCLK_CLK0频率为100MHZ。

Step7: 修改内存型号为MT41K256M16RE-125 M。

Setp8:选择MIO Configuration选项卡,再看到I/O Peripherals 中的GPIO一栏,勾选上其中的EMIO一栏,并选择8位引脚输出(最多可以选择64位,但是这个使用只需要8位足够了。)

Setp9:展开PS-PL Cross Trigger interface >Input Cross Trigger, Cross Trigger Input 0设置为:CPU0 DBG REQ、Output Cross Trigger设置为CPU0 DBG ACK。

Setp10:按照上图设置好了之后,点击OK,仔细观察发现的zynq核心多出了GPIO_0、TRIGGER_OUT_0、TRIGGER_IN_0

Setp11:接着,将如下两引脚连接起来,其实就是给M_AXI_GP0_ACLK提供一个时钟

Step12:单击Project Setting

Step13:单击IP->Repository Manager添加Custom IP CORE

Step14:单击加号添加IP CORE 路径之后单击OK

Setp15:单击 IP icon 搜索单词“math ”之后双击添加IPCORE

Setp16:单击Click on Run Connection Automation

Setp17:勾选math_ip_0 and S_AX之后单击OK

这个mathi_ip实际上是一个简单的硬件加法器。虽然这个简单的加法器在这里没有实用意义,但是如果换成了硬件算法,那么就具备实用价值了。红色的方框内ain_vio和bin_vio是我们准备通过逻辑分析抓去的观察信号。

Setp18:单击Click on Run Connection Automation

8.4添加 ILA 和 VIO CORE

Step1:单击IP icon 添加 ila CORE

Step2:双击打开ILA CORE

Step3:双击打开ILA CORE

General Options设置如下

Probe_Ports设置如下,之后单击OK

Step4:把GPIO Make Exteral,同时展开GPIO 链接GPIO_T到ILA的Prober_上

Step5:连接CLK接口到FCLK_CLK0接口

Step6:连接TRIGG_IN 和 TRIGGER_OUT_0、TRIG_OUT和TRIGGER_IN_0

Step7:添加 IP icon 添加vio

Step8:双击 VIO core修改参数

General Options 设置如下,输入proble为1 输出为3

Probe_in设置位宽为5

Probe_out0设置位宽:1;Probe_out1设置位宽:4;Probe_out2设置位宽:4;

Step9:连接

PROBE_IN -> result

PROBE_OUT0 -> sel

PROBE_OUT1 -> ain_vio

PROBE_OUT2 -> bin_vio

CLK-> FCLK_CKL0

连接好后的系统图

8.6 Mark Debug S_AXI总线

Step1:选中AXI Interconnect 和math_0 CORE之间的S_AXI总线

Step2:右击选择Mark Debug

Step3:菜单->选择tool->Validate Design检查是否有错误,如果有错误就要查找问题

Step4:菜单->选择window->Address Editor 检查是否有地址空间没有分配

8.7产生HDL和约束文件

Setp1:接下来依然是,右键单击Block文件,文件选择Generate the Output Products,是文件得到一定的约束

Setp2:弹出如下对话框,直接点击Generate

Setp3:继续右键单击Block文件,选择Create a HDL wrapper,根据Block文件内容产生一个HDL 的顶层文件:

Setp4:并选择让vivado自动完成

Setp5:这里我们看到,Vivado给我创建了这样的顶层文件,其中的gpio_0_tri_io就是我们配置的EMIO

8.8 EMIO的管脚约束修改

Step1:我们发现,之前引出的EMIO叫做GPIO_0,到了顶层他的名字gpio_0_tri_io,而不是GPIO_0。所以分配引脚的时候就要注意了名字别错了,创建一个约束文件,分配引脚如下:

set_property PACKAGE_PIN  F17  [get_ports {gpio_0_tri_io[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]

set_property PACKAGE_PIN  J15  [get_ports {gpio_0_tri_io[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

set_property PACKAGE_PIN  G14  [get_ports {gpio_0_tri_io[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[2]}]

set_property PACKAGE_PIN  D18  [get_ports {gpio_0_tri_io[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[3]}]

Setp2:单击Run Synthesis,如果有 Save 对话框弹出选择保存

Setp3:综合结束后选择Synthesized Design option单击 OK

8.9 设置调试信号

Step1:在如下对话框中找到Unassigned debug nets(如果对话框没有出现选择 菜单->Window > Debug)

Step2:右击 Unassigned Debug Nets 选择Set up Debug… 之后单击 Next

Step3:删除红色错误的信号然后单击Next 到结束

8.10 产生bit文件

此时可以,开始生成bit文件了(这个过程会弹出保存对话框单击保存,然后弹出Implementation对话框单击OK,重新编译一次):

8.11 导出硬件和bit文件

编译成功之后,依然是导出硬件:

8.12 软硬联合仿真调试

  Step1:在VIVADO中LAUNCH打开SDK,然后新建一个名为DEBUG_TECH的工程,以及添加一个main.c文件,具体过程参考前面章节。

添加程序如下:

#include <stdio.h>

#include "xgpiops.h"

#include "sleep.h"

int main()

{

static XGpioPs psGpioInstancePtr;

XGpioPs_Config* GpioConfigPtr;

int iPinNumber= 54; //想想为什么是54

u32 uPinDirection = 0x1; //1表示输出,0表示输入

int xStatus;

int i;

//--MIO的初始化

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);

if(XST_SUCCESS != xStatus)

print(" PS GPIO INIT FAILED \n\r");

//--MIO的输入输出操作

     XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置IO输出方向

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置IO的输出

  Xil_Out32(XPAR_MATH_IP_0_BASEADDR, 0x12);

  Xil_Out32(XPAR_MATH_IP_0_BASEADDR+4, 0x34);

  i=Xil_In32(XPAR_MATH_IP_0_BASEADDR);

  xil_printf("result=%x\r\n",i);

while(1)

{

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//输出1

sleep(1);//延时

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//输出0

sleep(1);//延时

}

    return 0;

}

Step2:单击下载bit程序

Step3:回到VIVADO单击Open Target->Auto Connect

Step4:加载完成后的界面

Step5:选择菜单->window->Debugprobes 选择AXI_WVALID做为触发信号

Step6:设置触发条件为1

Step7:设置触发位置为512

Step8:单击箭头所指向启动触发

Step9:进入等待触发状态

Step10、右击->Debug As->Debug Configurations

Step11:双击GDB,勾选Run ps7_init、Run ps7_pst_config、Enable Cross-Triggering

Step12:设置串口后单击Debug

Step:13

1、程序进入开始部分暂停住

2、在此处设置断点

Step14:单击运行后VIVADO  HW_ILA2 窗口采集到波形输出,可以看到AXI总线的工作时序。

Step15:同时可以观察到VIO核采集到的数据

Step16:当再次单击后控制台输出0X46

Step17:HW_ILA1 窗口采集到的数据是EMIO的可以看到第0位1S跳变下

8.16 本章小结

在这个实验中,笔者添加了一个用户自定义的IP CORE 并且通过使用VIO CORE观察其数据。通过ILA CORE观察 AXI总线的通信时序情况,以及EMIO 的输出情况。其中难点就是SDK 和VIVAOD的联合调试。笔者在做的工程中出现过多次错误,读者在做的时候下载程序一定要严格安装笔者提供的方法进行。另外SDK中的bit文件一定要确认是最新的bit文件,确认下路径,默认的可能是错的,这可能是软件的bug。

第八章 ZYNQ-MIZ701 软硬调试高级技巧的更多相关文章

  1. 【第二季】CH11_ ZYNQ软硬调试高级技巧

    [第二季]CH11_ ZYNQ软硬调试高级技巧 软件和硬件的完美结合才是SOC的优势和长处,那么开发ZYNQ就需要掌握软件和硬件开发的调试技巧,这样才能同时分析软件或者硬件的运行情况,找到问题,最终解 ...

  2. 9.2 Zynq嵌入式系统调试方法

    陆佳华书<嵌入式系统软硬件协同设计实战指南 第2版>这本书中的实例着实浪费了我不少时间.从本书第一个实例我就碰了一鼻子灰.当然显然是自己时新手的原因.首先第一个实验其实真的特别简单,为什么 ...

  3. 自学JavaScript笔记

    最近看了一段时间的<JavaScipt高级编程设计>由于记性不是很好,经常性的看了又忘记:想一些文字整理在自己的博客上,方便没事都可以拿出来看一下: 第一章 JavaScript概述   ...

  4. Linux内核设计期中总结

    Linux内核设计期中总结 ● 知识点 一.计算机是如何工作的 计算机是按照冯·诺依曼存储程序的原理. 在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器 ...

  5. 20169207《linux内核原理与分析》第二周作业

    第一部分:学习MOOC网Linux内核分析的课程. 首先对冯诺依曼体系结构和存储程序计算机工作模型进行了了解,查阅资料,对冯诺依曼体系的特点与课堂上的相结合,真实明白了模型的特点. 在汇编C语言程序时 ...

  6. 《Linux内核设计与实现》读书笔记 第十八章 调试

    第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相 ...

  7. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try: try块 except Exception: except块 try-except-else结构 tr ...

  8. IDEA第八章----远程调试

    大家有没有遇到相同分支的代码在本地就是没有问题的,但是到测试环境死活不能实现功能,且还不报错.通常我们的解决办法就是打日志,然后一点一点跟踪日志. 这时我们在想如果也可以按照本地一样能断点测试的程序就 ...

  9. 利用ZYNQ SOC快速打开算法验证通路(2)——数据传输最简方案:网络调试助手+W5500协议栈芯片

    在上一篇该系列博文中讲解了MATLAB待处理数据写入.bin二进制数据文件的过程,接下来需要将数据通过以太网发送到ZYNQ验证平台.之前了解过Xilinx公司面向DSP开发的System Genera ...

随机推荐

  1. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  2. 你真的会用go语言写单例模式吗?

    最近在学习Golang,想着可以就以前的知识做一些串通,加上了解到go语言也是面向对象编程语言之后.在最近的开发过程中,我碰到一个问题,要用go语言实现单例模式.本着“天下知识,同根同源”(我瞎掰的~ ...

  3. Linux生成key

    [root@centos7 ~]# ssh-keygen -b [ -t rsa #这里的-b 2048 是密钥加密的长度,最好设大点 Generating public/private rsa ke ...

  4. 20182332 实验四《Java Socket编程 》实验报告

    20182332 实验肆<数据结构与面向对象程序设计>实验报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 盛国榕 学号:20182332 实验教师:王志强 实验日 ...

  5. 微信小程序倒计时的方法

    timeOut: function(time) { var that = this; var end = new Date(time).getTime(); var Interval = setInt ...

  6. Hive-概述

    Hive:由 Facebook 开源用于解决海量结构化日志的数据统计. Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能. 本质是:将 ...

  7. mysql 中常用的 sql 语句

    SQL分类: DDL-----数据定义语言(CREATE--创建,ALTER--修改. DROP--删除表,DECLARE--声明) DML-----数据定义语言(SELECT--查询,DELECT- ...

  8. 移动端—— 兼容PC端,移动端的点击事件

    移动设备上不支持鼠标事件,好在webkit内核的移动浏览器支持 touch 事件,所以触摸事件是移动应用中所必须的.touchstart.touchmove.touchend事件可以类比于moused ...

  9. BUUCTF-writeup

    Reverse RSA 使用openssl模块 rsa -pubin -text -modulus -in pub.key得到n值,在 factordb.com上分解大素数得到p,q值,脚本生成pri ...

  10. scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

    数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 im ...