zoukankan      html  css  js  c++  java
  • 第八章 ZYNQ-MIZ701 软硬调试高级技巧

     

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

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

    8.1 系统构架

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

    wpsF74F.tmp

    8.2 ZYNQ核的添加及配置

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

    wpsF750.tmp

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

    wpsF751.tmp

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

    wpsF762.tmp

    Step4:单击Finish

    wpsF763.tmp

    8.3使用IP Integrator创建硬件系统

    Step1:单击Create Block Design

    Step2:输入system

    wpsF764.tmp

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

    wpsF766.tmp

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

    wpsF776.tmp

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

    wpsF777.tmp

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

    wpsF778.tmp

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

    wpsF779.tmp

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

    wpsF78A.tmp

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

    wpsF78B.tmp

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

    wpsF78C.tmp

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

    wpsF78D.tmp

    Step12:单击Project SettingwpsF78E.tmp

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

    wpsF79E.tmp

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

    wpsF79F.tmp

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

    wpsF7A1.tmp

    Setp16:单击Click on Run Connection Automation

    wpsF7B2.tmp

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

    wpsF7B3.tmp

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

    Setp18:单击Click on Run Connection Automation

    wpsF7B4.tmp

    8.4添加 ILA 和 VIO CORE

    Step1:单击IP icon wpsF7B5.tmp 添加 ila CORE

    wpsF7B6.tmp

    Step2:双击打开ILA CORE

    wpsF7C7.tmp

    Step3:双击打开ILA CORE

    General Options设置如下

    wpsF7C8.tmp

    Probe_Ports设置如下,之后单击OK

    wpsF7C9.tmp

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

    wpsF7CA.tmp

    Step5:连接CLK接口到FCLK_CLK0接口

    Step6:连接TRIGG_IN 和 TRIGGER_OUT_0、TRIG_OUT和TRIGGER_IN_0

    Step7:添加 IP icon wpsF7DA.tmp 添加vio

    wpsF7DB.tmp

    Step8:双击 VIO core修改参数

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

    wpsF7DC.tmp

    Probe_in设置位宽为5

    wpsF7DD.tmp

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

    wpsF7DE.tmp

    Step9:连接

    PROBE_IN -> result

    PROBE_OUT0 -> sel

    PROBE_OUT1 -> ain_vio

    PROBE_OUT2 -> bin_vio

    CLK-> FCLK_CKL0

    连接好后的系统图

    wpsF7EF.tmp

    8.6 Mark Debug S_AXI总线

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

    Step2:右击选择Mark Debug

    wpsF7F0.tmp

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

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

    8.7产生HDL和约束文件

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

    wpsF7F1.tmp

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

    wpsF7F2.tmp

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

    wpsF802.tmp

    Setp4:并选择让vivado自动完成

    wpsF803.tmp

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

    wpsF804.tmp

    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)

    wpsF805.tmp

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

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

    wpsF806.tmp

    8.10 产生bit文件

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

    wpsF817.tmp

    8.11 导出硬件和bit文件

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

    wpsF818.tmp

    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 ");

    //--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 ",i);

    while(1)

    {

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

    sleep(1);//延时

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

    sleep(1);//延时

    }

        return 0;

    }

    Step2:单击wpsF819.tmp下载bit程序

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

    wpsF81A.tmp

    Step4:加载完成后的界面

    wpsF82B.tmp

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

    wpsF82C.tmp

    Step6:设置触发条件为1

    wpsF82D.tmp

    Step7:设置触发位置为512

    wpsF82E.tmp

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

    wpsF83E.tmp

    Step9:进入等待触发状态

    wpsF83F.tmp

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

    wpsF840.tmp

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

    wpsF841.tmp

    Step12:设置串口后单击Debug

    wpsF852.tmp

    Step:13

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

    2、在此处设置断点

    wpsF853.tmp

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

    wpsF855.tmp

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

    wpsF865.tmp

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

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

    wpsF868.tmp

    8.16 本章小结

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

  • 相关阅读:
    29. Divide Two Integers
    leetCode 17. Letter Combinations of a Phone Number
    查找
    快速排序
    希尔排序
    插入排序
    归并排序,还有非递归方式没写
    堆排序--还有递归法没有写
    c++实现字符串全排序
    归并排序
  • 原文地址:https://www.cnblogs.com/milinker/p/5891107.html
Copyright © 2011-2022 走看看