zoukankan      html  css  js  c++  java
  • [转]Vivado与SDK的联合调试方法-使用ILA

    首先介绍一下我的硬件平台:使用的开发板为米联客出的MIZ702,这个开发板与ZedBoard是兼容的。 
    Vivado硬件调试有几种手段:ILA(集成逻辑分析器Integrated Logic Analyzer)、VIO(虚拟I/O Virtual Input/Output)、Jtag-to-AXI等,本方法主要使用了ILA 
    本实验系统使用了两种调试手段:ILA和VIO,ILA的引入方式又用了两种,一种是标记Debug mark,一种是添加ILA_IP两种方式我认为是一致的。其中ILA-IP抓取的LED的寄存器的波形,而Debug mark标记的是接到一个自主IP的AXI总线。系统的Block Design如下图 :
    这里写图片描述
    联调步骤: 
    STEP1:在block design设计完系统硬件后,点击想要抓取波形的网络,右击选择mark debug,此时网络两端会显示一个Debug标识如下图,保存。 
    添加Debug 
    还有另外一种方法:直接添加ILA ip,设置好抓取波形的个数与每组波形的位宽,连接自己想要观测的总线,在这里我抓取的波形是一组8位的寄存器,所控制的是8个LED灯。如下两图 
    ILAset
    probe_connect 
    我认为这两种方法没有区别 
    STEP2:对工程进行综合,综合完成后查看综合结果,可以看到下面的debug窗口中有未连接的Debug nets,点击Set up Debug并进行相关配置完成Debug nets的连接。完成后如下图所示: 
    stetup
    STEP3:保存工程,此时系统会重新生成约束文件,对现有的约束文件进行填充,打开约束文件进行Reload即可,然后生成bitstream并将硬件导入SDK,运行SDK。 
    STEP4:在SDK中新建自己的调试应用程序,我的演示程序为流水灯主函数代码如下:

    #include "xparameters.h" /* Peripheral parameters  */
    #include "xgpio.h"       /* GPIO data struct and APIs */
    #include "xil_printf.h"
    #include "xil_cache.h"
    
    #define GPIO_BITWIDTH   8   /* This is the width of the GPIO */
    #define GPIO_DEVICE_ID  XPAR_AXI_GPIO_0_DEVICE_ID //device id
    #define LED_DELAY     10000000 /* times delay*/
    #define LED_MAX_BLINK   0x1 /* Number of times the LED Blinks */
    #define LED_CHANNEL 1        /* GPIO channel*/
    #define printf xil_printf   /* A smaller footprint printf */
    XGpio Gpio; /* The Instance of the GPIO Driver */
    XGpio GpioOutput; /* The driver instance for GPIO Device configured as O/P */
    
    int GpioMarquee (u16 DeviceId, u32 GpioWidth)
    {
        volatile int Delay;
        u32 LedBit;
        u32 LedLoop;
        int Status;
        /*
         * Initialize the GPIO driver so that it's ready to use,
         * specify the device ID that is generated in xparameters.h
         */
         Status = XGpio_Initialize(&GpioOutput, DeviceId);
         if (Status != XST_SUCCESS)  {
              return XST_FAILURE;
         }
         //Set the direction for all signals to be outputs
         XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);
         // Set the GPIO outputs to low
         XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);
         for (LedBit = 0x0; LedBit < GpioWidth; LedBit++)  {
            for (LedLoop = 0; LedLoop < LED_MAX_BLINK; LedLoop++) {
                //Set the GPIO Output to High
                XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL,
                            1 << LedBit);
                //Wait a small amount of time so the LED is visible
                for (Delay = 0; Delay < LED_DELAY; Delay++);
                //Clear the GPIO Output
                XGpio_DiscreteClear(&GpioOutput, LED_CHANNEL,
                            1 << LedBit);
                // Wait a small amount of time so the LED is visible
                for (Delay = 0; Delay < LED_DELAY; Delay++);
              }
         }
         return XST_SUCCESS;
    }
    int main(void)
    {//Application start
        /* loop forever*/
        while(1){
            u32 status;
            status = GpioMarquee (GPIO_DEVICE_ID,GPIO_BITWIDTH);
            if (status == 0)
                print("SUCESS!.
    ");
            else print("FAILED.
    ");
        }
        return XST_SUCCESS;
    }

    然后常规方法进入软件调试界面,设置断点。(这里提醒一下,联合调试一定要在SDK下将比特流下载到FPGA中,而不要在vivado中下载比特流。Xilinx官方给出的解释是:由于使用PS端的时钟来接入ILA,所以要现在SDK中将比特流进行下载) 
    STEP5:在Vivado中连接目标板,此时进入硬件调试界面如图 
    vivado debug
    左边栏hardware会显示系统添加的硬件调试IP,我的硬件中手动加入了一个ila ip和vio ip也将一段总线标记了mark debug,标记了mark debug的总线,在进行set up debug的操作时系统会自动添加一个ila ip,左边栏显示了三个调试ip。 
    这里面大大小小有好多窗口一一介绍一下: 
    1、设置窗口,window data depth其实就是波形的分辨率,trigger position in window就是数据的触发在波形中显示的起始位置,设置了触发后才会有作用。 
    set 
    2、触发设置窗口,可以设置触发信号,以及触发方式(上升沿、下降沿)等等。若在SDK中的命令执行一句的过程中FPGA有时序变化,且时序是相关的,比如说我的写操作,当write有上升沿的时候执行,对目标地址写操作数。这时候如果设置了触发信号为write,系统的时序显示就会随着write进行动作,且在触发位置处进行改变。这个功能我们可以进行一些总线的时序分析。ILA2中检测了AXI总线,我们就可以看到相关时序图。ILA1只是对一个寄存器进行了监视,只能看到他的值的变化而已。 
    trigger 
    3、状态窗口:显示当前调试状态 
    4、调试波形窗口 
    waveform 
    调试波形图窗口,左侧这里写图片描述表示循环自动进行触发, 这里写图片描述按下后,在SDK中执行一步即在波形图上显示波形,而 这里写图片描述是在SDK执行完命令后,进行点击即显示当前硬件状态的波形。 
    至此我们就搭建好Vivado和SDK的联合调试平台了,我们每在SDK中执行一条语句后,可以在波形窗口中点击点击来更新硬件状态。 
    大家调试不必按照此硬件系统和软件来调试,完全可以在自己的系统中添加ILA-IP来对自己的系统进行调试

    欢迎大家批评指正,也希望能与大家交流ZYNQ的学习经验。

    参考文献: 
    1、嵌入式系统软硬件协同设计实战指南-基于Xilinx ZYNQ 
    2、ug936-vivado-tutorial-programming-debugging

  • 相关阅读:
    LIGHTSWITCH 的树控件设计!
    企业即时通信平台与在线办公!
    特殊符号网 http://www.teshufuhao.net/
    国内主要工作流厂商分析 (转)
    衣联网 http://www.eelly.com/ 中国最大的专业服装批发市场(广州)
    NET FrameWork & CLR & C# 运行基本原理
    通过负载均衡器+域名实现容灾切换(2)DNS解析过程理解
    SPAN和RSPAN概念
    【转】一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    SIP Recording(录制)相关协议
  • 原文地址:https://www.cnblogs.com/tubujia/p/9243022.html
Copyright © 2011-2022 走看看